禁用某些测试的自动测试执行,除非明确请求这些测试

时间:2015-05-18 17:33:08

标签: python unit-testing nosetests

我有一些非常慢的测试和许多短的单元测试。我希望能够只使用普通nosetests命令运行短单元测试,如果我决定运行慢速测试,则能够明确地调用它们。

我希望能做什么:

  • 运行unittests但不是慢速测试

    $ nosetests
    

    没有使用特殊命令 - 任何只是出于好奇而进入nosetests的人都会在几秒钟内得到满足。

  • 明确请求慢速测试:

    $ nosetests --somehow-magicaly-invoke-slow-tests
    

    没有歧义 - 我想要慢速测试(或单元测试和慢速测试 - 无所谓)

我尝试了什么:

我尝试使用nose.plugins.attrib

from nose.plugins.attrib import attr
import time

@attr('slow')
def test_slow_one():
    time.sleep(5)

def test_unittest():
    assert True

但它实际上几乎与我想要完成的事情相反 - 我必须为不运行慢速测试指定额外的命令行参数。命令是:

运行unittests但不是慢速测试

$ nosetests -v -a '!slow'
test_a.test_unittest ... ok
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK

明确请求慢速测试:

$ nosetests -v -a 'slow'
test_a.test_slow_one ... ok
----------------------------------------------------------------------
Ran 1 test in 5.005s
OK

更糟糕的是,当有人跑步时

$ nosetests -v
test_a.test_slow_one ... ok
test_a.test_unittest ... ok
----------------------------------------------------------------------
Ran 2 tests in 5.007s
OK

所有测试包括慢速测试

问题:

是否有办法禁用某些测试,因此无法使用普通nosetests命令调用它们,但可以使用其他一些命令行参数运行?

当前"解决方案":

我刚将所有慢速测试移到单独的文件中,并将文件命名为check_*.py而不是test_*.py,因此nosetests无法接收它们。当我想运行慢速测试时,我只需指定check_*.py文件的完整路径,例如:

$ nosetests test/check_foo.py test/check_bar.py [...]

这不是很优雅。

1 个答案:

答案 0 :(得分:2)

您可以轻松使用unittest.skipUnless()

跳过单项测试

只需decorate您想要使用

有条件跳过的测试用例的方法
@unittest.skipUnless(condition, reason)

例如,您可以检查您在自动CI环境中未设置的环境变量 SLOW_TESTS,但设置是否以及何时运行慢速测试本地:

import os
import time
import unittest


SLOW_TESTS = os.environ.get('SLOW_TESTS', False)


    class TestFoo(unittest.TestCase):

        def test_upper(self):
            self.assertEqual('foo'.upper(), 'FOO')

        @unittest.skipUnless(SLOW_TESTS, "slow test")
        def test_something_slow(self):
            time.sleep(5)
            self.assertTrue(True)

常规跑步的输出:

$ nosetests -v
test_something_slow (test_foo.TestFoo) ... SKIP: slow test
test_upper (test_foo.TestFoo) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK (SKIP=1)

设置环境变量时的输出:

$ SLOW_TESTS=1 nosetests -v
test_something_slow (test_foo.TestFoo) ... ok
test_upper (test_foo.TestFoo) ... ok

----------------------------------------------------------------------
Ran 2 tests in 5.003s

OK

(请注意,Nose testrunner仍然会说Ran 2 tests,即使它跳过了一个。跳过的测试最后用(SKIP=n)表示,测试结果用{{1}表示}或SKIP处于非详细模式。)

当然,您可以使用{CI}设置中设置的S等环境变量skipIf()来反转行为。

跳过整个TestCase

如果你想在TestCase中跳过所有测试,你知道这些测试很慢或设置很重,那么明确调用TestCase.skipTest()可能会更方便(你也可以这样做)如果您需要更细粒度的控制,那么从单一测试开始:

FAST_TESTS

有关跳过测试的更多详细信息,请参阅Skipping tests and expected failures