Python 禁用某些测试的自动测试执行,除非明确请求这些测试
我有一些非常缓慢的测试和许多简短的单元测试。我希望能够使用普通的Python 禁用某些测试的自动测试执行,除非明确请求这些测试,python,unit-testing,nosetests,Python,Unit Testing,Nosetests,我有一些非常缓慢的测试和许多简短的单元测试。我希望能够使用普通的nosetests命令只运行短单元测试,如果我决定是时候运行慢测试了,那么就能够显式地调用它们 我希望能够做到: 运行单元测试,但不要运行慢速测试 $ nosetests $ nosetests -v -a '!slow' test_a.test_unittest ... ok ---------------------------------------------------------------------- Ran 1
nosetests
命令只运行短单元测试,如果我决定是时候运行慢测试了,那么就能够显式地调用它们
我希望能够做到:
- 运行单元测试,但不要运行慢速测试
$ nosetests
没有使用特殊命令-任何出于好奇而进入$ nosetests -v -a '!slow' test_a.test_unittest ... ok ---------------------------------------------------------------------- Ran 1 test in 0.001s OK
鼻测试的人都会在几秒钟内感到满意
- 明确请求慢速测试:
$ nosetests --somehow-magicaly-invoke-slow-tests
没有歧义-我想要慢测试(或者单元测试和慢测试-这不重要)$ nosetests -v -a 'slow' test_a.test_slow_one ... ok ---------------------------------------------------------------------- Ran 1 test in 5.005s OK
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
但事实上,它与我试图完成的几乎相反——我必须指定额外的命令行参数,以不运行慢速测试。这些命令是:
运行单元测试,但不要运行慢速测试
$ nosetests
$ nosetests -v -a '!slow'
test_a.test_unittest ... ok
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
明确请求慢速测试:
$ nosetests --somehow-magicaly-invoke-slow-tests
$ 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 [...]
这不是很优雅。你可以很容易地使用它
跳过单个测试
您只需要有条件地跳过测试用例的方法
@unittest.skipUnless(condition, reason)
例如,您可以检查一个环境变量SLOW\u TESTS
,该变量不是您在自动化CI环境中设置的,而是您想在本地运行SLOW测试时设置的:
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跳过了一个测试,但它仍然说运行了2个测试。跳过的测试在最后用(SKIP=n)
表示,在非详细模式下用SKIP
或S
表示测试结果)
当然,您可以使用在CI设置中设置的环境变量(如FAST\u TESTS
)来反转行为
跳过整个测试用例
如果您想跳过测试用例中的所有测试,而您知道这些测试很慢或设置很繁重,那么显式调用可能会更方便(如果您需要更细粒度的控制,也可以从单个测试中进行此操作):
有关跳过测试的更多详细信息,请参阅。谢谢,这确实有效-但不幸的是,这不是我所寻找的“简单而优雅”的解决方案。这是一个有点“自己动手”的解决方案,而我希望看到nosetest
的一些隐藏特性。。但这显然解决了我的问题——如果没有更好的答案,我明天就接受。