非关键单元测试失败

8 投票
10 回答
2449 浏览
提问于 2025-04-15 14:13

我正在使用Python自带的unittest模块,想写一些不太重要的测试。

我的意思是,如果我的程序通过了这些测试,那当然很好!但是如果没有通过,也没关系,程序还是能正常运行。

举个例子,我的程序是为了处理一种自定义类型“A”。如果它不能处理“A”,那就真的是坏了。不过,为了方便,大部分功能也应该能处理另一种类型“B”,但这并不是必须的。如果它不能处理“B”,那也没关系(因为它仍然能处理“A”,这才是它的主要目的)。不能处理“B”并不重要,我只是会错过一个“额外功能”。

再举一个(假设的)例子,比如在写一个OCR(光学字符识别)程序。这个算法应该能识别大部分测试中的图片,但如果有些识别失败也没关系。(而且,不,我并不是在写OCR)

有没有什么方法可以在unittest(或者其他测试框架)中写一些不重要的测试呢?

10 个回答

4

单元测试中的断言是二元的:要么成功,要么失败,没有中间状态。

因此,如果你想创建那些“非关键”的测试,就不应该在不希望测试失败的情况下使用断言。这样做要小心,以免影响测试的“有效性”。

对于你的OCR例子,我的建议是,在测试代码中记录成功率,然后创建一个断言,比如:“assert success_rate > 8.5”,这样就能达到你想要的效果。

8

实际上,我可能会用打印语句来表示失败的情况。不过,更正确的做法是使用警告:

http://docs.python.org/library/warnings.html

不过,你也可以使用日志功能来生成更详细的测试结果记录(也就是说,把你的“B”类失败的情况记录到日志里)。

http://docs.python.org/library/logging.html

编辑:

在Django中,我们处理这个问题的方式是,有些测试我们预期会失败,还有一些测试是根据环境来跳过的。因为我们通常可以预测一个测试应该是失败还是通过(比如,如果我们不能导入某个模块,说明系统没有这个模块,那么测试就不会成功),所以我们可以聪明地跳过那些会失败的测试。这意味着我们仍然会运行每一个会通过的测试,而不会有“可能”会通过的测试。单元测试在可预测性方面最有用,能够在运行测试之前判断一个测试是否应该通过,这样就能实现这一点。

3

Python 2.7(还有3.1)增加了可以跳过某些测试方法或测试案例的功能,同时也可以把一些测试标记为预期失败

http://docs.python.org/library/unittest.html#skipping-tests-and-expected-failures

被标记为预期失败的测试不会在测试结果中算作失败。

撰写回答