如何在python中生成动态(参数化)单元测试?

我有某种测试数据,并且想要为每个项目创建一个单元测试。我的第一个想法是这样做:

import unittest

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

class TestSequence(unittest.TestCase):

def testsample(self):

for name, a,b in l:

print "test", name

self.assertEqual(a,b)

if __name__ == '__main__':

unittest.main()

这样做的缺点是它可以在一次测试中处理所有数据。我想即时为每个项目生成一个测试。有什么建议么?

回答:

我用这样的东西:

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'

以上是 如何在python中生成动态(参数化)单元测试? 的全部内容, 来源链接: utcz.com/qa/411065.html

回到顶部