我有一些测试数据,并希望 for each 项目创建单元测试.我的第一个 idea 是这样做:

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()

这样做的缺点是,它在一次测试中处理所有数据.我想 for each 项目动态生成一个测试.有什么建议吗?

推荐答案

这被称为"参数化".

有几种工具支持这种方法.例如.:

生成的代码如下所示:

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'

出于历史原因,我将保留最初的答案(大约2008年):

我用这样的方式:

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()

Python相关问答推荐

沿着数组中的轴计算真实条目

将两只Pandas rame乘以指数

如何过滤包含2个指定子字符串的收件箱列名?

NumPy中条件嵌套for循环的向量化

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

使用Python和文件进行模糊输出

计算空值

通过追加列表以极向聚合

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量

在电影中向西北方向对齐""

在第一次调用时使用不同行为的re. sub的最佳方式

为什么Visual Studio Code说我的代码在使用Pandas concat函数后无法访问?

Django REST框架+Django Channel->;[Errno 111]连接调用失败(';127.0.0.1';,6379)

运行从Airflow包导入的python文件,需要airflow实例?

Python键盘模块不会立即检测到按键

判断字典中是否有多个值对

使用loc计算特定行的平均值,loc找不到行值

捕获脚本和退出代码的多行输出

Pandas 身上的负数造型