PyUnit с переменным количеством тестов - PullRequest
3 голосов
/ 29 июня 2010

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

class TestName(unittest.testcase):
    def setUp(self):
        for file in os.listdir(DIRECTORY):
            # Setup Tests

    def test_comparison(self):
        for file in os.listdir(DIRECTORY):
            # Run the tests

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestName),
])

if __name__ == "__main__":
    unittest.TextTestRunner(verbosity=2).run(suite())

Очевидно, что с этим связано много проблем, например, если какой-либо тест не пройден, все не выполнено и т. Д. И т. Д. Я хотел бы настроить pyunit так, чтобы он выполнял тест (или тестовый пример) ), для каждого файла, который находится в каталоге. Теперь, я думаю, я мог бы создать перечисленный выше класс, используя только два метода, но для того, чтобы сделать это успешно, мне нужно было бы добавить параметр контекста, например:

def setUp(self, filepath):
    # Do stuff

Тогда я мог бы поместить цикл в основной кусок кода и запустить тесты следующим образом:

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestName, file),
])

if __name__ == "__main__":
    for file in DIRECTORY:
        unittest.TextTestRunner(verbosity=2).run(suite(file))

Но я не уверен, как это сделать, почти не переписывая класс дырки unittest.TestCase (). Есть ли способ, которым я мог бы сделать это, или есть ли другой способ, которым я могу получить динамическое расширение набора тестов / тестовых случаев в зависимости от того, сколько файлов находится в папке? Благодаря.

Ответы [ 3 ]

2 голосов
/ 30 июня 2010

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

class TestImage(unittest.TestCase)
    pass #Do stuff, as well as using the filename variable

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestImage),
])

if __name__ == "__main__":
    for filename in os.listdir(sys.path[0]):
        unittest.TextTestRunner(verbosity=2).run(suite())

Это запустит контрольный пример для каждого имени файла в каталоге.(и имя папки).Хотя я понятия не имею, почему я могу использовать имя файла в классе unittest.Он должен иметь отношение к тому, как эти макросы загружаются и запускаются в классе.

2 голосов
/ 29 июня 2010

Вы можете использовать nose support для test Генераторы .Это будет выглядеть примерно так:

def test_comparison():
    for file in os.listdir(DIRECTORY):
        yield run_cmp_test, file

def run_cmp_test(file):
    # Run the tests

В качестве альтернативы вы также можете funcargs в py.test.

0 голосов
/ 07 января 2014

Вы можете сделать это с помощью testscenarios , модуля, что-то вроде этого:

class MyTest(unittest.TestCase):

    scenarios = [os.listdir(sys.path[0])]

    ...
...