Запуск одного теста из unittest.TestCase через командную строку
в нашей команде мы определяем большинство тестовых случаев следующим образом:
один "рамочный" класс 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, я чувствую себя потерянным и продолжаю колотить во все остальное, кроме методов.
7 ответов:
это работает так, как вы предлагаете - вам просто нужно указать имя класса:
python testMyCase.py MyCase.testItIsHot
Если вы организуете свои тестовые случаи, то есть следуете той же организации, что и фактический код, а также используете относительный импорт для модулей в одном пакете
вы также можете использовать следующий формат команд:
python -m unittest mypkg.tests.test_module.TestClass.test_method # In your case, this would be: python -m unittest testMyCase.MyCase.testItIsHot
Он может работать хорошо, как вы догадываетесь
python testMyCase.py MyCase.testItIsHotи есть еще один способ просто проверить
testItIsHot:suite = unittest.TestSuite() suite.addTest(MyCase("testItIsHot")) runner = unittest.TextTestRunner() runner.run(suite)
Если вы проверите справку модуля unittest, она расскажет вам о нескольких комбинациях, которые позволяют запускать классы тестовых наборов из модуля и методы тестирования из класса тестового набора.
python3 -m unittest -h [...] Examples: python3 -m unittest test_module - run tests from test_module python3 -m unittest module.TestClass - run tests from module.TestClass python3 -m unittest module.Class.test_method - run specified test methodэто не требует от вас, чтобы определить
unittest.main()как поведение по умолчанию вашего модуля.
вдохновленный @yarkee Я объединил его с некоторыми из кода, который я уже получил. Вы также можете вызвать это из другого скрипта, просто вызвав функцию
run_unit_tests()не требуя использовать командную строку, или просто вызвать его из командной строки сpython3 my_test_file.py.import my_test_file my_test_file.run_unit_tests()к сожалению, это работает только для
Python 3.3или улучшенный:import unittest class LineBalancingUnitTests(unittest.TestCase): @classmethod def setUp(self): self.maxDiff = None def test_it_is_sunny(self): self.assertTrue("a" == "a") def test_it_is_hot(self): self.assertTrue("a" != "b") def run_unit_tests(): runner = unittest.TextTestRunner() classes = \ [ LineBalancingUnitTests, ] # Comment all the tests names on this list, to run all Unit Tests unit_tests_to_run = \ [ "test_it_is_sunny", # "test_it_is_hot", ] runner.run( suite( classes, unit_tests_to_run ) ) def suite(classes, unit_tests_to_run): """ Problem with sys.argv[1] when unittest module is in a script https://stackoverflow.com/questions/2812218/problem-with-sys-argv1-when-unittest-module-is-in-a-script Is there a way to loop through and execute all of the functions in a Python class? https://stackoverflow.com/questions/2597827/is-there-a-way-to-loop-through-and-execute-all-of-the-functions looping over all member variables of a class in python https://stackoverflow.com/questions/1398022/looping-over-all-member-variables-of-a-class-in-python """ suite = unittest.TestSuite() unit_tests_to_run_count = len( unit_tests_to_run ) for _class in classes: _object = _class() for function_name in dir( _object ): if function_name.lower().startswith( "test" ): if unit_tests_to_run_count > 0 \ and function_name not in unit_tests_to_run: continue suite.addTest( _class( function_name ) ) return suite if __name__ == "__main__": print( "\n\n" ) run_unit_tests()немного отредактировав код, вы можете передать массив со всеми модульными тестами, которые вы хотели бы звоните:
... def run_unit_tests(unit_tests_to_run): runner = unittest.TextTestRunner() classes = \ [ LineBalancingUnitTests, ] runner.run( suite( classes, unit_tests_to_run ) ) ...и еще один файл:
import my_test_file # Comment all the tests names on this list, to run all Unit Tests unit_tests_to_run = \ [ "test_it_is_sunny", # "test_it_is_hot", ] my_test_file.run_unit_tests( unit_tests_to_run )
возможно, это будет полезно для кого-то. Если вы хотите запускать только тесты из определенного класса:
if __name__ == "__main__": unittest.main(MyCase())это работает для меня в Python 3.6
Comments