testtools ConcurrentStreamTestSuite 的简单工作示例

5 投票
2 回答
1629 浏览
提问于 2025-04-17 22:50

我在找一个简单的例子,来演示如何使用testtool的并发测试。我找到一个例子,来自这里

import unittest
import testtools

class MyTester(unittest.TestCase):
    # Tests...

suite = unittest.TestLoader().loadTestsFromTestCase(MyTester)
concurrent_suite = testtools.ConcurrentStreamTestSuite(lambda: ((case, None) for case in suite))
concurrent_suite.run(testtools.StreamResult()) 

不过,这个例子有一个比较大的问题。它没有告诉你你的测试是通过了还是失败了。不仅如此,StreamResult对象是临时的,而且StreamResult的方法也没有任何作用。

2 个回答

2

可以看看这个concurrencytest库,它已经实现了一些测试工具的类。

5

根据StreamResult的文档status这个方法是用来处理事件的,而它的默认实现其实什么都不做。

如果你想让它打印一些东西,就需要继承这个方法,自己实现想要的功能。例如,想要打印发生了什么:

import unittest
import testtools

class MyTester(unittest.TestCase):
    def test_foo(self):
        self.assertEqual(1+2, 2)
    def test_foo2(self):
        self.assertEqual(1+2, 3)

class TracingStreamResult(testtools.StreamResult):
    def status(self, *args, **kwargs):
        print('{0[test_id]}: {0[test_status]}'.format(kwargs))

suite = unittest.TestLoader().loadTestsFromTestCase(MyTester)
concurrent_suite = testtools.ConcurrentStreamTestSuite(lambda: ((case, None) for case in suite))
result = TracingStreamResult()
result.startTestRun()
concurrent_suite.run(result)
result.stopTestRun()

不过,已经有很多类是继承了StreamResult的,所以你可能不需要自己再定义一个版本。可以看看TestResult的扩展

撰写回答