Как Вы генерируете динамические (параметризованные) модульные тесты в Python?

Вы можете рассмотреть возможность переноса операций. Например:

class Utils
{
    public static double divide(int num, int denom) {
        return ((double) num) / denom;
    }
}

Это позволяет вам искать (только один раз), делает ли бросок именно то, что вы хотите. Этот метод также может быть подвергнут испытаниям, чтобы он продолжал делать то, что вы хотите. Также не имеет значения, какой трюк вы используете для деления (вы можете использовать любой из ответов здесь), если это приводит к правильному результату. В любом месте вам нужно разделить два целых числа, теперь вы можете просто вызвать Utils::divide и верить, что он поступает правильно.

210
задан Brian McCutchon 28 December 2018 в 07:01
поделиться

4 ответа

я использую что-то вроде этого:

import unittest

l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]]

class TestSequense(unittest.TestCase):
    pass

def test_generator(a, b):
    def test(self):
        self.assertEqual(a,b)
    return test

if __name__ == '__main__':
    for t in l:
        test_name = 'test_%s' % t[0]
        test = test_generator(t[1], t[2])
        setattr(TestSequense, test_name, test)
    unittest.main()

parameterized пакет может использоваться для автоматизации этого процесса:

from parameterized import parameterized

class TestSequence(unittest.TestCase):
    @parameterized.expand([
        ["foo", "a", "a",],
        ["bar", "a", "b"],
        ["lee", "b", "b"],
    ])
    def test_sequence(self, name, a, b):
        self.assertEqual(a,b)

, Который генерирует тесты:

test_sequence_0_foo (__main__.TestSequence) ... ok
test_sequence_1_bar (__main__.TestSequence) ... FAIL
test_sequence_2_lee (__main__.TestSequence) ... ok

======================================================================
FAIL: test_sequence_1_bar (__main__.TestSequence)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/parameterized/parameterized.py", line 233, in <lambda>
    standalone_func = lambda *a: func(*(a + p.args), **p.kwargs)
  File "x.py", line 12, in test_sequence
    self.assertEqual(a,b)
AssertionError: 'a' != 'b'
152
ответ дан Michael Mintz 23 November 2019 в 04:35
поделиться

Используя unittest (начиная с 3.4)

Начиная с Python 3.4, стандартная библиотека unittest пакет имеет subTest менеджер по контексту.

См. документацию:

Пример:

from unittest import TestCase

param_list = [('a', 'a'), ('a', 'b'), ('b', 'b')]

class TestDemonstrateSubtest(TestCase):
    def test_works_as_expected(self):
        for p1, p2 in param_list:
            with self.subTest():
                self.assertEqual(p1, p2)

можно также определить пользовательское сообщение и значения параметров к subTest():

with self.subTest(msg="Checking if p1 equals p2", p1=p1, p2=p2):

Используя нос

нос среда тестирования поддержки это .

Пример (код ниже является всем содержанием файла, содержащего тест):

param_list = [('a', 'a'), ('a', 'b'), ('b', 'b')]

def test_generator():
    for params in param_list:
        yield check_em, params[0], params[1]

def check_em(a, b):
    assert a == b

вывод команды nosetests:

> nosetests -v
testgen.test_generator('a', 'a') ... ok
testgen.test_generator('a', 'b') ... FAIL
testgen.test_generator('b', 'b') ... ok

======================================================================
FAIL: testgen.test_generator('a', 'b')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python2.5/site-packages/nose-0.10.1-py2.5.egg/nose/case.py", line 203, in runTest
    self.test(*self.arg)
  File "testgen.py", line 7, in check_em
    assert a == b
AssertionError

----------------------------------------------------------------------
Ran 3 tests in 0.006s

FAILED (failures=1)
122
ответ дан codeape 23 November 2019 в 04:35
поделиться

генератор unittest

определения импорта (test_class, a, b, c, d, имя): тест определения (сам): печать ('Testexecution =', имя) печать ('=', a) печать ('b =', b) печать ('c =', c) печать ('d = ', определение d)

return test

add_test_methods (test_class): test_list = [[3,3,5,6, 'один'], [5,5,8,9, 'два'], [0,0,5,6, 'три'], [0,0,2,3, 'Четыре']] для случая в test_list: печать ('случай =', случай [0], случай [1], случай [2], случай [3], случай [4]) тестирует = генератор (test_class, случай [0], случай [1], случай [2], случай [3], случай [4]) setattr (test_class, "протестируйте _ % s" случай % [4], тест)

класс TestAuto (unittest. TestCase): установка определения (сам): печать ('Установка') передача

def tearDown(self):
    print ('TearDown')
    pass

add_test_methods (TestAuto)

, если имя ==' основной ': unittest.main (verbosity=1)

0
ответ дан 23 November 2019 в 04:35
поделиться

You would benefit from trying the TestScenarios library.

testscenarios provides clean dependency injection for python unittest style tests. This can be used for interface testing (testing many implementations via a single test suite) or for classic dependency injection (provide tests with dependencies externally to the test code itself, allowing easy testing in different situations).

6
ответ дан 23 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: