Параматеризировать юнит-тесты в python - PullRequest
6 голосов
/ 25 февраля 2012

Я работаю над набором юнит-тестов python, которые в настоящее время создаются с использованием pythons, встроенного в среду тестирования.Я хотел бы написать параматеризованные тесты, которые будут выполняться несколько раз на основе набора данных, которые я ему предоставляю.

т.е.если мой набор данных [1,2,3,4], моя тестовая функция будет выполняться четыре раза, используя входные данные из моего набора данных.

def test(data):
    if data > 0:
       #Pass the test

Насколько я понимаю, в настоящее время во встроенной среде это невозможно, если я не добавлю цикл в свою тестовую функцию.Я не хочу этого делать, потому что мне нужно, чтобы тест продолжался, даже если один ввод не удался.

Я видел, что это можно сделать с помощью переносицы или pyTest.Какую основу лучше всего использовать?Могу ли я использовать другой фреймворк, который был бы лучше, чем любой из них?

Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 16 марта 2012

Обратите внимание, что это как раз одно из наиболее распространенных применений недавнего добавления funcargs в py.test .

В вашем случае вы получите:

def pytest_generate_tests(metafunc):
    if 'data' in metafunc.funcargnames:
        metafunc.parametrize('data', [1,2,3,4])

def test_data(data):
    assert data > 0

[EDIT] Я, вероятно, должен добавить, что вы также можете сделать это так же просто, как

@pytest.mark.parametrize('data', [1,2,3,4])
def test_data(data):
    assert data > 0

Так что я бы сказал, что py.test отличная структура для параметризованного модульного тестирования ...

1 голос
/ 25 февраля 2012

Вы можете создавать тесты динамически на основе вашего набора данных следующим образом:

import unittest

data_set = [1,2,3,4]

class TestFunctions(unittest.TestCase):
    pass  # all your non-dynamic tests here as normal

for i in data_set:
    test_name = "test_number_%s" % i # a valid unittest test name starting with "test_"
    def dynamic_test(self, i=i):
        self.assertTrue(i % 2)
    setattr(TestFunctions, test_name, dynamic_test)

if __name__ == '__main__':
    unittest.main()

Вопрос Python unittest: Генерация нескольких тестов программно? более подробно обсуждает это, в том числе другой подход , который достигает той же цели, динамически создавая несколько экземпляров тестового примера в набор тестов.

...