Python单元测试在失败后继续[重复]

Posted

技术标签:

【中文标题】Python单元测试在失败后继续[重复]【英文标题】:Python Unittests continue after failure [duplicate] 【发布时间】:2013-01-17 04:39:05 【问题描述】:

在unittest 失败后继续测试的最佳方法是什么?

#!/usr/env/bin python2.7

import unittest
from fib import fib


class FibTests(unittest.TestCase):

    def test_0(self):
        self.assertEqual(fib(0), 0)
        self.assertEqual(fib(1), 1)
        self.assertEqual(fib(2), 1)
        self.assertEqual(fib(5), 5)
        self.assertEqual(fib(10), 55)

    def test_1(self):
        self.assertEqual(fib(0), 1)

    def test_2(self):
        self.assertEqual(fib(1), 0)
        self.assertEqual(fib(5), 0)

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(FibTests)
    result = unittest.TextTestRunner(verbosity=2).run(suite)

查看 test_2,它只会告诉我有 1 个失败而不是 2 个。

另外,我怎样才能在结尾处收集结果:

test_0 -- 0 failures
test_1 -- 1 failures
test_2 -- 2 failures

动机

我正在尝试创建一个测试游戏。人们提交测试,如果他们未能通过其他人的程序,他们就会获得积分;每个测试失败都是一分。提供此类功能的最简单方法是什么?

【问题讨论】:

您要单独跟踪其故障的事情应该是单独的测试。 每个断言都会引发失败。如果您希望每个都成为自己的测试用例,则需要使它们成为自己的测试用例方法。 【参考方案1】:

您必须将每个测试用例分成不同的方法。为了更轻松地创建新测试/节省输入时间,您可以像这样根据输入自动生成测试用例

#!/usr/env/bin python2.7

import unittest
from fib import fib


class FibTests(unittest.TestCase):
    pass

def test_gen(expected, actual):
    def test_method(self):
        return self.assertEqual(expected, actual)
    return test_method

if __name__ == '__main__':
    cases = ((fib(1), 1), (fib(2), 1), (fib(5), 5))
    for index, case in enumerate(cases):
        test_name = 'test_0'.format(index)
        test = test_gen(case[1], case[0])
        setattr(FibTests, test_name, test)
    suite = unittest.TestLoader().loadTestsFromTestCase(FibTests)
    result = unittest.TextTestRunner(verbosity=2).run(suite)

【讨论】:

你可以做一些像这样乱七八糟的事情,或者你可以直接使用支持生成器测试功能的nose

以上是关于Python单元测试在失败后继续[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python单元测试pytest

如果任何单元测试失败,如何使 Python 的覆盖工具失败?

Python单元测试找不到模块[重复]

单元测试 python 数据类型 - 测试失败“预期:NaT 实际:NaT”

python单元测试框架-unittest之跳过测试和预期失败

pytest学习