用于在多个fixture上重复测试函数的快速unittest兼容框架
repeated-test的Python项目详细描述
repeated_test允许您很好地编写将相同函数应用于 多组参数。
例如:
fromrepeated_testimportFixturesclassmy_fixtures(Fixtures):def_test(self,expected,*terms):self.assertEqual(expected,sum(terms))a=10,5,5b=15,7,8c=42,1,1
结果与unittest兼容,并在 出错时的回溯:
$ python -m unittest my_tests ..F ====================================================================== FAIL: test_c (my_tests.my_fixtures) ---------------------------------------------------------------------- Traceback (most recent call last): File "my_tests.py", line 9, in my_fixtures c = 42, 1, 1 File "my_tests.py", line 5, in _test self.assertEqual(expected, sum(terms)) AssertionError: 42 != 2 ---------------------------------------------------------------------- Ran 3 tests in 0.002s FAILED (failures=1)
您可以使用:
$ pip install --user repeated_test
参考
简介
python的unittest模块有助于执行各种形式的自动化测试。 一个编写从unittest.TestCase派生的类,并添加各种test_xyz方法, 测试运行者运行这些测试,记录成功的测试,失败的 测试并跟踪这些失败的原因。
有时进行一次大规模的测试是有意义的 不同的输入。本单元旨在提供处理 这种情况。
它允许您将fixture(输入)作为 类,并将测试函数绑定到它们。对每个 你将看到下面的固定装置。生成的类是一个unittest.TestCase子类,所以它是 与unittest和其他unittest兼容的测试运行程序兼容。
为了生成unittest.TestCase,repeated_test要求您:
- 子类repeated_test.Fixtures
- 编写一个_test方法,它使用一些参数 unittest.TestCase它需要的方法
- 直接在类主体中分配fixture,然后将其解包为 _test方法的参数
您可以在测试函数中使用任何unittest.TestCase方法,例如assertEqual() 诸如此类。
fromrepeated_testimportFixturesclassmy_fixtures(Fixtures):def_test(self,arg1,arg2,arg3):self.assertEqual(...,...)Ps='p1','p2','p3'# _test(*Ps) will be called, ie. _test('p1', p2', 'p3')Qs='q1','q2','q3'# _test(*Qs) will be called, ie. _test('q1', q2', 'q3')
确保fixture元组提供正确数量的参数 对于您的_test方法,除非它有一个*args参数。
您可以根据自己的喜好命名测试元组,尽管它们可能不是以 test_或_。它们被复制到生成的unittest.TestCase类中,并测试 为它们创建方法。它们的名字是元组的名字,前缀是 test_。
以test_或_开头的成员直接复制到 生成的unittest.TestCase类,而不被视为fixture。你可以用这个 在您的fixture或您不希望的常量中插入常规测试 作为测试:
fromrepeated_testimportFixturesclassmy_fixtures(Fixtures):def_test(self,arg1,arg2,arg3):self.assertEqual(...,...)deftest_other(self):self.assertEqual(3,1+2)_spam='spam, bacon and eggs'# _spam won't be treated as a fixture, so _test(*_spam) won't be calledham=_spam,_spam,_spam
如果需要,甚至可以使用self._test(...)调用测试函数。
分离测试和设备
可以使用fixtures类 with_test方法:
classmy_fixtures(Fixtures):_test=None...@my_fixtures.with_testdefother_test(self,arg1,arg2,arg3):self.assertEqual(...,...)
当函数出现在任何类之外时,它将用作 生成的unittest.TestCase类,因此请记住它需要一个self参数。
您可以任意多次重用fixture类。
如果这样指定测试函数,则可以设置_test = None 在你的装置定义中。但是,它不会被unittest发现, 所以regular test methods不会运行。 省略_test会完全引发错误,以防止意外发生 禁用测试。
将函数用作fixture
在fixture元组中使用函数 计划。如果fixture元组中有一个函数,则可以 使用tupdecorator:
fromrepeated_testimportFixtures,tupclassmy_tests(Fixtures):def_test(self,func,arg1,arg2):self.assertEqual(...,...)@tup('arg1','arg2')defham():pass# equivalent todef_ham():passham=_ham,'arg1','arg2'
可以使用WithTestClass(cls)将unittest.testcase替换为另一个类。
例如,如果您想使用unittest2:
importunittest2fromrepeated_testimportWithTestClassclassmy_tests(WithTestClass(unittest2.TestCase)):...