【问题标题】:How to run python unittests repeatedly from a script and collect results如何从脚本重复运行 python 单元测试并收集结果
【发布时间】:2013-03-24 21:42:44
【问题描述】:

我不知道如何在 python 脚本中运行单个单元测试并收集结果。

场景:我有一组测试来检查产生不同对象的各种统计分布的各种方法。测试有时会失败,因为他们应该考虑到我基本上是在检查特定类型的随机性。我想从脚本甚至解释器重复运行测试并收集结果以供进一步分析。

假设我有一个模块 myTest.py:

class myTest(unittest.TestCase):
    def setup(self):
       ...building objects, etc....
    def testTest1(self):
           ..........
    def testTest2(self):
           ..........

基本上我需要:

  1. 运行设置方法
  2. 运行 testTest1(比如说)100 次
  3. 收集故障
  4. 返回故障

我最接近的是(使用类似问题的代码):

from unittest import TextTestRunner, TestSuite
runner = TextTestRunner(verbosity = 2)
tests = ['testTest1']
suite = unittest.TestSuite(map(myTest, tests))
runner.run(suite)

但这不起作用,因为:

runner.run(suite) 不运行设置方法

我无法捕捉到 testTest1 失败时抛出的异常

【问题讨论】:

    标签: python unit-testing python-unittest


    【解决方案1】:

    您只需将要多次运行的测试添加到套件中。

    这是一个完整的代码示例。你也可以see this code running in an interactive Python console to prove that it does actually work

    import unittest
    import random
    
    class NullWriter(object):
        def write(*_, **__):
            pass
    
        def flush(*_, **__):
            pass
    
    SETUP_COUNTER = 0
    
    class MyTestCase(unittest.TestCase):
    
        def setUp(self):
            global SETUP_COUNTER
            SETUP_COUNTER += 1
    
        def test_one(self):
            self.assertTrue(random.random() > 0.3)
    
        def test_two(self):
            # We just want to make sure this isn't run
            self.assertTrue(False, "This should not have been run")
    
    
    def suite():
        tests = []
        for _ in range(100):
            tests.append('test_one')
    
        return unittest.TestSuite(map(MyTestCase, tests))
    
    results = unittest.TextTestRunner(stream=NullWriter()).run(suite())
    print dir(results)
    print 'setUp was run', SETUP_COUNTER, 'times'
    

    【讨论】:

    • 谢谢,这解决了我的部分问题:多次运行测试。它没有解决第二部分:捕获 self.AssertTrue 抛出的异常并计算一些统计信息。我想我真的在试图强迫单元测试做一些他们不应该做的事情,在某种意义上。我不想让它们自主运行,而是让它们将结果报告给我的脚本。用条件赋值替换 assertTrue 语句可能是一个更好的主意,然后处理这些语句。
    • 断言错误已经被 unittest 捕获 听起来你真的只想在循环中运行一个函数 100 次,将输出收集到一个列表中,然后分析结果。尽管如此,您可以通过在测试运行器中为流参数指定另一个文件(如对象)来抑制输出到 sys.stderr。然后你可以对结果做任何你想做的事情。再次,看看交互式控制台。
    • 你说得对,我真的想让一个函数在测试中循环运行——我试图避免重复代码(因为我想保留测试)。我会考虑将一个不同的流式 arg 传递给测试运行器,感谢您的建议。
    猜你喜欢
    • 2016-08-12
    • 2014-08-29
    • 2017-11-07
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多