在编写一些测试应该引发而另一些测试不应该引发的表驱动测试时,如何避免在两个不同的位置调用正在测试的函数?

这就是我想要做的,但它未能通过NoneassertRaises:

tests = [
   (0, None),
   (1, None),
   (-1, TooFewException),
   (99, None),
   (100, TooManyException),
]
for n, exc in tests:
    with self.assertRaises(exc):
        results = my_code(n)
        assert len(results) == n

我想出的最好的办法就是这样,但多余的my_code电话让我感到不安:

tests = [
   (0, None),
   (1, None),
   (-1, TooFewException),
   (99, None),
   (100, TooManyException),
]
for n, exc in tests:
    if exc is not None:
        with self.assertRaises(exc):
            my_code(n)
    else:
        results = my_code(n)
        assert len(results) == n

在使用@AmuroRay的答案在我们的基本测试用例上添加助手函数之后,现在是:

tests = [
   (0, None),
   (1, None),
   (-1, TooFewException),
   (99, None),
   (100, TooManyException),
]
for n, exc in tests:
    with self.assertRaisesUnlessNone(exc):
        results = my_code(n)
        assert len(results) == n

推荐答案

contextlibnullcontext()个人可以做到这一点.它并没有真正使用更少的行(没有难看的一行分支),但它消除了第二次用户代码调用:

from contextlib import nullcontext

for n, exc in tests:
    if exc is None:
        cm = nullcontext()
    else:
        cm = self.assertRaises(exc)
    with cm:
        results = my_code(n)
        assert len(results) == n

Python相关问答推荐

如何销毁框架并使其在tkinter中看起来像以前的样子?

Python -根据另一个数据框中的列编辑和替换数据框中的列值

用gekko解决的ADE方程系统突然不再工作,错误消息异常:@错误:模型文件未找到.& &

将HTML输出转换为表格中的问题

如何使用SubProcess/Shell从Python脚本中调用具有几个带有html标签的参数的Perl脚本?

将numpy数组存储在原始二进制文件中

线性模型PanelOLS和statmodels OLS之间的区别

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

使用mySQL的SQlalchemy过滤重叠时间段

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

Pandas - groupby字符串字段并按时间范围 Select

从dict的列中分钟

在极性中创建条件累积和

字符串合并语法在哪里记录

Django RawSQL注释字段

Discord.py -

在用于Python的Bokeh包中设置按钮的样式

使用Python异步地持久跟踪用户输入

Django在一个不是ForeignKey的字段上加入'