编程语言
首页 > 编程语言> > python – 禁用某些测试的自动测试执行,除非明确请求这些测试

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

作者:互联网

我有一些非常慢的测试和许多短的单元测试.我希望能够只使用简单的nosetests命令运行短单元测试,如果我决定是时候运行慢速测试,那么就能够明确地调用它们.

我希望能做什么:

>运行unittests但不是慢速测试

$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 so nosetests将不会接收它们.当我想运行慢速测试时,我只需指定check _ *.py文件的完整路径,例如:

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

这不是很优雅.

解决方法:

您可以轻松使用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测试,即使它跳过了一个.跳过的测试在最后用(SKIP = n)和测试结果用SKIP或S表示非详细模式).

当然,您可以使用您在CI设置中设置的环境变量(如FAST_TESTS)使用skipIf()来反转行为.

跳过整个TestCase

如果你想跳过TestCase中你知道速度慢或设置繁重的所有测试,那么明确调用TestCase.skipTest()会更方便(如果需要更细粒度的控制,你也可以从单个测试中做到这一点):

class TestFoo(unittest.TestCase):

    def setUp(self):
        if not SLOW_TESTS:
            self.skipTest("slow test")
        # some expensive setup

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

标签:python,unit-testing,nosetests
来源: https://codeday.me/bug/20190702/1360047.html