Инфраструктура модульного тестирования для модуля python

Я пишу модуль python, и я хотел бы его протестировать. Я новичок в python и немного ошарашен доступными опциями.

В настоящее время я хотел бы написать свои тесты в качестве доктрины, поскольку мне нравится декларативный, а не императивный стиль (однако, не стесняйтесь отключать меня от этого предпочтения, если оно дезинформировано). Однако возникает несколько вопросов:

  1. Где я должен поставить тесты? В том же файле, что и код, который они тестируют (или в docstrings для доктрины)? Или считается, что лучше разделить их на свой собственный каталог?
  2. Как я могу запустить все тесты во всем модуле из командной строки за один раз?
  3. Как я могу сообщить о покрытии кода набора тестов?
  4. Любые другие лучшие практики, о которых я должен знать для модульного тестирования на python?

    6 Solutions collect form web for “Инфраструктура модульного тестирования для модуля python”

    не стесняйтесь лишить меня этого предпочтения, если оно дезинформировано

    Я считаю, что я использовал doctest более широко ( способ растяжения границ его предполагаемого использования), чем любой другой разработчик с открытым исходным кодом, по крайней мере в рамках одного проекта – все тесты в моем проекте gmpy – это доктрины. Это было совершенно новое в то время, когда gmpy , это был отличный маленький трюк, и если что-то стоит делать, то стоит делать лишнее – правильно?)

    Неправильно. За исключением gmpy , где повторное использование всего, поскольку правильные модульные тесты были бы слишком переделаны, я никогда не делал эту ошибку снова: в эти дни я использую модульные тесты в качестве модульных тестов и доктрины, чтобы проверить мои документы, поскольку они всегда предназначенные для использования. Какие доктрины (сравнение ожидаемого с фактическим результатом для равенства – вот и все) – это просто не хорошая или обоснованная основа для создания надежного набора тестов. Это никогда не предназначалось иначе.

    Я бы рекомендовал вам посмотреть на нос . Модуль unittest в новом Python 2.7 намного богаче и приятнее, и если вы застряли на 2.4, 2.5 или 2.6, вы все равно можете использовать новые функции с unittest2, которые вы можете скачать и установить; nose дополняет unittest довольно хорошо.

    Если вы не можете выдержать unittest (но – попробуйте, он растет на вас!), Возможно, попробуйте py.test , альтернативный пакет с довольно другой философией.

    Но, пожалуйста , не растягивайте doctest чтобы проверить материал, отличный от примеров в документах! Сравнение точного равенства будет стоять на вашем пути слишком часто, так как мне пришлось учиться на моем (метафорическом 😉 gmpy в gmpy

    Мне не нравятся доктрины по этим причинам:

    • Вы не можете запустить подмножество тестов. Когда тест выходит из строя, полезно запустить только один тест. Doctest не дает возможности сделать это.
    • Если неудача происходит в середине доктрины, все это прекращается. Я предпочел бы, чтобы все результаты решали, как бороться с поломкой.
    • Стиль кодирования стилизован и должен иметь результаты для печати.
    • Ваш код выполняется особым образом, поэтому сложнее рассуждать о том, как он будет выполняться, сложнее добавлять помощники и сложнее программировать вокруг тестов.

    Этот список был взят из моего сообщения в блоге. Что мне не нравится в доктрине , где есть еще и длинный поток комментариев, обсуждающий вопросы.

    О покрытии: я не верю, что для Python есть инструмент покрытия, который будет измерять охват в рамках доктрин. Но так как это просто длинные списки утверждений без ветвей или циклов, это проблема?

    У меня есть подозрение, что Алекс может быть немного опережающим меня по кривой программиста, но если вам нужна перспектива кого-то с опытом Python (как «пользователь», а не эксперт или евангелист), но не в том же лиги, мои выводы об модульном тестировании были почти такими же.

    Вначале, для простого тестирования, Doctests может показаться отличным для простого тестирования, и я пошел в этом направлении для личного проекта дома, потому что он был рекомендован в другом месте. На работе мы используем нос (хотя так консервы и обернуты, я был под впечатлением, что мы использовали pyUnit до недавнего времени), и несколько месяцев назад я тоже переехал в нос.

    Первоначальное время настройки и накладные расходы на управление, а также разделение на фактический код могут казаться ненужными в начале, особенно когда вы тестируете что-то, что не является большой кодовой базой, но в конечном итоге я нашел, что доктрины на пути каждого рефакторинга или реструктуризации, которую я хотел сделать, довольно трудно поддерживать, практически невозможно масштабировать и очень быстро компенсировать первоначальные сбережения. И да, я знаю, что модульное тестирование – это не то же самое, что интеграционное тестирование, но доктрины, как правило, определяют ваши подразделения для вас слишком строго. Они также плохо подходят для гибких устройств, если вы когда-либо решаете, что это эффективный инструмент для создания эскизов или dev.

    Это может занять немного времени, чтобы запланировать, а затем усовершенствовать свои юнит-тесты, так как pyUnit или нос направляют вас, но есть вероятность, что даже в ближайшей перспективе вы обнаружите, что это действительно помогает вам на многих уровнях. Я знаю, что это было для меня, и я относительно новичок в сложности и масштабах кодовой базы, над которой я работаю в эти дни. Просто нужно сжать зубы в течение первых нескольких недель.

    Для покрытия проверьте отличную зону покрытия .

    В противном случае все, что написал Алекс Мартелли, очень важно.

    доктрины хороши для быстрых, второстепенных модульных тестов, которые описывают некоторые из основных обычаев рассматриваемых объектов (поскольку они появляются в докстеллах и, следовательно, помогают (независимо) и т. д.).

    Я лично нашел обширное и более тщательное тестирование, чтобы быть более эффективным с помощью модуля unittest, и теперь модуль 2.7 (обратно портирован на unittest2) имеет еще более удобные утверждения. Вы можете настроить тестовые комплекты и как сложный сценарий, как вам нравится, с модульной схемой тестирования и охватывать целые ряды разных тестов за один раз (по командной строке)

    cover.py, Ned Batchelder и как упоминания @bstpierre будут работать с любым из них, и я рекомендую его для просмотра того, что вы испытали в коде, а что нет. Вы можете добавить его в систему CI (т. Е. Hudson или что-то, что вам нравится использовать), чтобы не отставать от того, что покрыто и нет, а отчеты в формате HTML являются фантастическими для того, чтобы увидеть, что не пострадало от тестирования. Охват поддерживает выход Junit xml, который многие системы CI знают, как обеспечить запланированные текущие результаты, чтобы вы могли видеть, что сборка становится все лучше или хуже с течением времени.

    Я согласен со всеми вышеизложенными вопросами, поднятыми о том, что учение не масштабируется, и я предпочитаю придерживаться unittest.

    Один совет, который я могу внести, заключается в том, чтобы вызывать модульные тесты из обработки кода __name__ == "__main__ поэтому, если тестовый файл запускается как сценарий, он будет запускать свои тесты.

    например:

     #!/usr/bin/env python """ Unit tests for the GetFiles.py utility """ import unittest from FileUtilities import getTree class TestFileUtilities(unittest.TestCase): def testGetTree(self): """ Tests that a known tree is found and incidentally confirms that we have the tree we expected to use for our current sample extraction. """ found = getTree('./anzmeta-dtd', '.pen') expected_path_tail = ['ISOdia.pen', 'ISOgrk1.pen', 'ISOtech.pen'] for i, full_path in enumerate(found): assert full_path.endswith( expected_path_tail[i] ), expected_path_tail[i] # other tests elided if __name__ == "__main__": # When this module is executed from the command-line, run all its tests unittest.main() 
    Python - лучший язык программирования в мире.