В нашей команде мы определяем большинство тестовых случаев следующим образом:
Один «рамочный» класс ourtcfw.py
:
import unittest
class OurTcFw(unittest.TestCase):
def setUp:
# something
# other stuff that we want to use everywhere
и много тестов, таких как testMyCase.py:
import localweather
class MyCase(OurTcFw):
def testItIsSunny(self):
self.assertTrue(localweather.sunny)
def testItIsHot(self):
self.assertTrue(localweather.temperature > 20)
if __name__ == "__main__":
unittest.main()
Когда я пишу новый тестовый код и хочу его часто запускать и экономить время, я делаю то, что ставлю «__» перед всеми остальными тестами. Но это громоздко, отвлекает меня от кода, который я пишу, и создаваемый им шум коммитов просто раздражает.
Например, при внесении изменений в testItIsHot()
, я хочу быть в состоянии сделать это:
$ python testMyCase.py testItIsHot
и unittest
побежал только testItIsHot()
Как я могу этого достичь?
Я пытался переписать if __name__ == "__main__":
часть, но так как я новичок в Python, я чувствую себя потерянным и продолжаю врезаться во все остальное, кроме методов.
источник
__init__.py
внутри этой директории (и подкаталогов, если таковые имеются) и вызова eg.python test/testMyCase.py test.MyCase.testItIsHot
,Если вы организуете свои тесты, то есть следуйте той же организации, что и реальный код, а также используйте относительный импорт для модулей в одном пакете.
Вы также можете использовать следующий формат команды:
Документация Python3 для этого: https://docs.python.org/3/library/unittest.html#command-line-interface
источник
Это может работать хорошо, как вы думаете
И есть еще один способ просто проверить
testItIsHot
:источник
Если вы воспользуетесь помощью модуля unittest, он расскажет вам о нескольких комбинациях, которые позволяют вам запускать классы тестовых примеров из модуля и методы тестирования из класса тестовых случаев.
Это не требует, чтобы вы определили
unittest.main()
поведение вашего модуля по умолчанию.источник
usage
даже странно несовместимы): выполнениеpython -m unittest module_test.TestClass.test_method
предполагает наличие файлаmodule_test.py
(запускается из текущего каталога; и не требуется); и содержит, который содержит (это также работает для меня на Python 2.7.13)__init.py__
module_test.py
class TestClass(unittest.TestCase)...
def test_method(self,...)
Может быть, это будет полезно для кого-то. Если вы хотите запускать только тесты из определенного класса:
Это работает для меня в Python 3.6
источник
Вдохновленный @yarkee, я объединил его с некоторым кодом, который я уже получил. Вы также можете вызвать это из другого скрипта, просто вызвав функцию
run_unit_tests()
без необходимости использования командной строки, или просто вызвав ее из командной строки с помощьюpython3 my_test_file.py
.К сожалению, это работает только для
Python 3.3
или выше:Код бегуна:
Немного отредактировав код, вы можете передать массив со всеми модульными тестами, которые вы хотели бы вызвать:
И еще один файл:
Кроме того, вы можете использовать https://docs.python.org/3/library/unittest.html#load-tests-protocol и определить следующий метод для вашего тестового модуля / файла:
Если вы хотите ограничить выполнение одним тестовым файлом, вам просто нужно установить шаблон обнаружения теста на единственный файл, в котором вы определили
load_tests()
функцию.Ссылки:
В качестве альтернативы последнему примеру основной программы, я прочитал следующий вариант после прочтения
unittest.main()
реализации метода:источник
TL; DR : Это очень вероятно сработает:
Объяснение :
Удобный способ
будет работать НО его невысказанное предположение, что у вас уже есть этот обычный фрагмент кода внутри (обычно в конце) вашего тестового файла.
Неудобный способ
будет всегда работать, не требуя, чтобы у вас был этот
if __name__ == "__main__": unittest.main()
фрагмент кода в вашем исходном файле теста.Так почему 2-й метод считается неудобным? Потому что было бы больно (_ вставьте здесь одну из частей вашего тела _), чтобы набрать этот длинный путь, разделенный точками, вручную. В первом методе,
mypkg/tests/test_module.py
часть может быть автоматически завершена, либо современной оболочкой, либо вашим редактором.PS: Если вы думали, что часть тела находится где-то ниже вашей талии, вы подлинный человек. :-) Я имею в виду сказать "сустав пальцев". Слишком много печатать будет плохо для ваших суставов. ;-)
источник