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
的一些隐藏特性。。但这显然解决了我的问题——如果没有更好的答案,我明天就接受。