Вы можете рассмотреть возможность переноса операций. Например:
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
Это позволяет вам искать (только один раз), делает ли бросок именно то, что вы хотите. Этот метод также может быть подвергнут испытаниям, чтобы он продолжал делать то, что вы хотите. Также не имеет значения, какой трюк вы используете для деления (вы можете использовать любой из ответов здесь), если это приводит к правильному результату. В любом месте вам нужно разделить два целых числа, теперь вы можете просто вызвать Utils::divide
и верить, что он поступает правильно.
я использую что-то вроде этого:
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'
Используя 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)
генератор 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)
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).