Can Python's unittest test in parallel, like n

2020-01-27 14:04发布

Python's NOSE testing framework has the concept of running multiple tests in parallel.

The purpose of this is not to test concurrency in the code, but to make tests for code that has "no side-effects, no ordering issues, and no external dependencies" run faster. The performance gain comes from concurrent I/O waits when they are accessing different devices, better use of multi CPUs/cores, and by running time.sleep() statements in parallel.

I believe the same thing could be done with Python's unittest testing framework, by having a plugin Test Runner.

Has anyone had any experience with such a beast, and can they make any recommendations?

7条回答
放荡不羁爱自由
2楼-- · 2020-01-27 14:35

Python unittest's builtin testrunner does not run tests in parallel. It probably wouldn't be too hard write one that did. I've written my own just to reformat the output and time each test. That took maybe 1/2 a day. I think you can swap out the TestSuite class that is used with a derived one that uses multiprocess without much trouble.

查看更多
一夜七次
3楼-- · 2020-01-27 14:35

If this is what you did initially

runner = unittest.TextTestRunner()
runner.run(suite)

-----------------------------------------

replace it with

from concurrencytest import ConcurrentTestSuite, fork_for_tests

concurrent_suite = ConcurrentTestSuite(suite, fork_for_tests(4))
runner.run(concurrent_suite)
查看更多
别忘想泡老子
4楼-- · 2020-01-27 14:45

The testtools package is an extension of unittest which supports running tests concurrently. It can be used with your old test classes that inherit unittest.TestCase.

For example:

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())
查看更多
▲ chillily
5楼-- · 2020-01-27 14:48

If you only need Python3 suport, consider using my fastunit.

I just change few code of unittest, making test case run as coroutines.

It really saved my time.

I just finished it last week, and may not testing enough, if any error happens, please let me know, so that I can make it better, thanks!

查看更多
forever°为你锁心
6楼-- · 2020-01-27 14:55

Please use pytest-xdist, if you want parallel run.

The pytest-xdist plugin extends py.test with some unique test execution modes:

  • test run parallelization: if you have multiple CPUs or hosts you can use those for a combined test run. This allows to speed up development or to use special resources of remote machines.

[...]

More info: Rohan Dunham's blog

查看更多
叛逆
7楼-- · 2020-01-27 14:55

Another option that might be easier, if you don't have that many test cases and they are not dependent, is to kick off each test case manually in a separate process.

For instance, open up a couple tmux sessions and then kick off a test case in each session using something like:

python -m unittest -v MyTestModule.MyTestClass.test_n
查看更多
登录 后发表回答