我有一些非常慢的测试和许多短的单元测试。我希望能够只使用普通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 [...]
这不是很优雅。
答案 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.skipTest()
可能会更方便(你也可以这样做)如果您需要更细粒度的控制,那么从单一测试开始:
FAST_TESTS
有关跳过测试的更多详细信息,请参阅Skipping tests and expected failures。