Выполнение сгенерированных тестов на нос - PullRequest
6 голосов
/ 07 апреля 2011

Предположим, я определяю testFile.py модуль Python следующим образом.

def test_evens():
    for i in range(0, 5):
        yield check_even, i, i*3

def check_even(n, nn):
    assert n % 2 == 0 or nn % 2 == 0

Когда я позволяю носу идентифицировать тесты в режиме только для сбора, я получаю

testFile.test_evens(0, 0) ... ok
testFile.test_evens(1, 3) ... ok
testFile.test_evens(2, 6) ... ok
testFile.test_evens(3, 9) ... ok
testFile.test_evens(4, 12) ... ok

Я могу запустить все тесты, используя

тесты на нос -v testFile: test_evens

Однако что, если я хочу только запустить testFile.test_evens (2, 6) (т. Е. Не все тесты)?

Есть ли способ сделать это из командной строки?

1 Ответ

7 голосов
/ 08 апреля 2011

Нос не может сделать это по умолчанию, насколько мне известно.Вот несколько вариантов:

1.Поддельные из командной строки

Возможно, не то, что вы ищете, но я должен был упомянуть об этом.Вы также можете создать скрипт-обертку, чтобы упростить это:

python -c 'import testFile; testFile.check_even(2, 6)'

2.Создание пользовательского загрузчика тестов носа

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

Ниже приведен пример кода, который должен дать вам достаточно для построения ( runner.py ):

import ast
import nose

class CustomLoader(nose.loader.TestLoader):

    def loadTestsFromName(self, name, module=None):
        # parse the command line arg
        parts = name.split('(', 1)
        mod_name, func_name = parts[0].split('.')
        args = ast.literal_eval('(' + parts[1])

        # resolve the module and function - you'll probably want to
        # replace this with nose's internal discovery methods.
        mod = __import__(mod_name)
        func = getattr(mod, func_name)

        # call the generator and gather all matching tests
        tests = []
        if nose.util.isgenerator(func):
            for test in func():
                _func, _args = self.parseGeneratedTest(test)
                if _args == args:
                    tests.append(nose.case.FunctionTestCase(_func, arg=_args))
        return self.suiteClass(tests)

nose.main(testLoader=CustomLoader)

Выполнение:

% python runner.py 'testFile.test_evens(2, 6)' -v
testFile.check_even(2, 6) ... ok

% python runner.py 'testFile.test_evens(2, 6)' 'testFile.test_evens(4, 12)' -v
testFile.check_even(2, 6) ... ok
testFile.check_even(4, 12) ... ok

% python runner.py 'testFile.test_evens(1, 3)' -v
testFile.check_even(1, 3) ... FAIL
...