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