Запуск одного теста из 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, я чувствую себя потерянным и продолжаю колотить во все остальное, кроме методов.

458   7  

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

вот еще один способ

testname = "testItIsHot"
testcase = MyCase(testname)
testcase.testItIsHot()

Comments

    Ничего не найдено.