Python unittest:如何只运行部分测试文件?

Goh*_*ohu 69 python unit-testing python-unittest

我有一个测试文件,其中包含花费大量时间的测试(它们将计算发送到集群并等待结果).所有这些都在特定的TestCase类中.

由于它们需要时间而且不太可能破坏,我希望能够选择这个测试子集是否运行(最好的方式是使用命令行参数,即" ./tests.py --offline"或者某种东西那样的话,所以当我有时间的时候,我可以经常快速地运行大部分测试,并且整个设置会在一段时间内完成.

现在,我只是unittest.main()用来开始测试.

谢谢.

Ami*_*ski 80

要只运行一个特定的测试,您可以使用:

$ python -m unittest test_module.TestClass.test_method
Run Code Online (Sandbox Code Playgroud)

更多信息在这里

  • 从http://docs.python.org/2/library/unittest.html我认为这个例子更像是运行一个测试:`python -m unittest test_module.TestClass.test_method` (11认同)
  • 这也适用于一次多个测试。只需确保它们以空格分隔,如下所示:“python -m unittest test_module.TestClass.test_method test_module.TestClass.test_method2”。因此,即使您有一些相关的测试用例要运行,这仍然非常有用。 (2认同)

S.L*_*ott 50

默认情况下unittest.main()使用默认测试加载程序从运行main的模块中生成TestSuite.

您不必使用此默认行为.

例如,您可以创建三个unittest.TestSuite实例.

  1. "快速"子集.

    fast = TestSuite()
    fast.addTests( TestFastThis )
    fast.addTests( TestFastThat )
    
    Run Code Online (Sandbox Code Playgroud)
  2. "慢"子集.

    slow = TestSuite()
    slow.addTests( TestSlowAnother )
    slow.addTests( TestSlowSomeMore )
    
    Run Code Online (Sandbox Code Playgroud)
  3. "整体"集.

    alltests = unittest.TestSuite([fast, slow])
    
    Run Code Online (Sandbox Code Playgroud)

请注意,我已调整TestCase名称以指示快速与慢速.您可以继承unittest.TestLoader来解析类的名称并创建多个加载器.

然后你的主程序可以使用optparseargparse(自2.7或3.2以来可用)解析命令行参数,以选择要运行的套件,快速,慢速或全部.

或者,您可以相信这sys.argv[1]是三个值之一,并使用像这样简单的东西

if __name__ == "__main__":
    suite = eval(sys.argv[1])  # Be careful with this line!
    unittest.TextTestRunner().run(suite)
Run Code Online (Sandbox Code Playgroud)


Tzu*_*hay 10

实际上,可以将测试用例的名称作为sys.argv传递,并且只测试那些情况.

例如,假设你有

class TestAccount(unittest.TestCase):
    ...

class TestCustomer(unittest.TestCase):
    ...

class TestShipping(unittest.TestCase):
    ...

account = TestAccount
customer = TestCustomer
shipping = TestShipping
Run Code Online (Sandbox Code Playgroud)

你可以打电话

python test.py account
Run Code Online (Sandbox Code Playgroud)

只进行帐户测试,甚至是

$ python test.py account customer
Run Code Online (Sandbox Code Playgroud)

两个案例都经过测试

  • 适用于Python 2.7.11和3.5.1.名称是模块上可用的属性.不需要`account = TestAccount`,你也可以使用`python test.py TestAccount`. (2认同)

Alf*_*lfe 10

我这样做是为了简单skipIf:

import os

SLOW_TESTS = int(os.getenv('SLOW_TESTS', '0'))

@unittest.skipIf(not SLOW_TESTS, "slow")
class CheckMyFeature(unittest.TestCase):
    def runTest(self):
        …
Run Code Online (Sandbox Code Playgroud)

这样我只需用这一行来装饰已经存在的测试用例(不需要创建测试套件或类似的,只需要os.getenv()在我的单元测试文件的开头创建一个调用行),并且默认情况下会跳过此测试.

如果我想尽快执行它,我只需要调用我的脚本:

SLOW_TESTS=1 python -m unittest …
Run Code Online (Sandbox Code Playgroud)


rob*_*rob 8

你基本上有两种方法可以做到:

  1. 为类定义自己的测试套件
  2. 创建将返回实际数据的集群连接的模拟类.

我是他第二种方法的坚定支持者; 单元测试应该只测试一个非常单元的代码,而不是复杂的系统(如数据库或集群).但我明白并非总是可行; 有时,创建模型太昂贵了,或者测试的目标确实在复杂的系统中.

回到选项(1),您可以这样做:

suite = unittest.TestSuite()
suite.addTest(MyUnitTestClass('quickRunningTest'))
suite.addTest(MyUnitTestClass('otherTest'))
Run Code Online (Sandbox Code Playgroud)

然后将套件传递给测试运行器:

unittest.TextTestRunner().run(suite)
Run Code Online (Sandbox Code Playgroud)

有关python文档的更多信息:http://docs.python.org/library/unittest.html#testsuite-objects


Tho*_*hle 6

既然您使用,unittest.main()您可以运行python tests.py --help以获取文档:

Usage: tests.py [options] [test] [...]

Options:
  -h, --help       Show this message
  -v, --verbose    Verbose output
  -q, --quiet      Minimal output
  -f, --failfast   Stop on first failure
  -c, --catch      Catch control-C and display results
  -b, --buffer     Buffer stdout and stderr during test runs

Examples:
  tests.py                               - run default set of tests
  tests.py MyTestSuite                   - run suite 'MyTestSuite'
  tests.py MyTestCase.testSomething      - run MyTestCase.testSomething
  tests.py MyTestCase                    - run all 'test*' test methods
                                               in MyTestCase
Run Code Online (Sandbox Code Playgroud)

也就是说,你可以做到

python tests.py TestClass.test_method
Run Code Online (Sandbox Code Playgroud)


Fra*_*fin 5

我根据unittest.skip装饰器的工作方式找到了另一个解决方案。通过设置__unittest_skip____unittest_skip_why__

基于标签

我想应用一个标签系统,将一些测试标记为quick, slow, glacier, memoryhog, cpuhog, core, 等等。

然后运行all 'quick' tests,或者run everything except 'memoryhog' tests,您的基本白名单/黑名单设置

执行

我分两部分实现:

  1. 首先为测试添加标签(通过自定义@testlabel类装饰器)
  2. 自定义unittest.TestRunner标识要跳过哪些测试,并在执行前修改测试列表内容。

工作实现在这个要点中:https : //gist.github.com/fragmuffin/a245f59bdcd457936c3b51aa2ebb3f6c

(一个完整的例子太长了,不能放在这里。)

结果是...

$ ./runtests.py --blacklist foo
test_foo (test_things.MyTest2) ... ok
test_bar (test_things.MyTest3) ... ok
test_one (test_things.MyTests1) ... skipped 'label exclusion'
test_two (test_things.MyTests1) ... skipped 'label exclusion'

----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK (skipped=2)
Run Code Online (Sandbox Code Playgroud)

MyTests1跳过所有类测试,因为它有foo标签。

--whitelist 也有效