gpt4 book ai didi

python - 除非明确要求,否则禁用某些测试的自动测试执行

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:55 24 4
gpt4 key购买 nike

我有一些非常慢的测试和许多短的单元测试。我希望能够使用简单的 nosetests 命令仅运行较短的单元测试,如果我决定是时候运行慢速测试,以便能够显式调用它们。

我希望能够做什么:

  • 运行单元测试但不运行慢速测试

    $ 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

但它实际上与我想要完成的几乎相反 - 我必须指定额外的命令行参数以不运行慢测试。命令是:

运行单元测试但不是慢测试

$ 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 [...]

这不是很优雅。

最佳答案

您可以轻松使用 unittest.skipUnless() 达到这个效果。

跳过单个测试

简单decorate您想要有条件地跳过的测试用例的方法

@unittest.skipUnless(condition, reason)

例如,您可以检查环境变量 SLOW_TESTS您只是不在自动化 CI 环境中设置,而是设置是否以及何时要在本地运行慢速测试:

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 测试运行器仍然显示 Ran 2 tests,即使它跳过了一个测试。跳过的测试在最后用 (SKIP=n) 表示,在测试结果中用 SKIPS 表示非详细模式)。

当然,您可以使用 skipIf() 反转行为使用像 FAST_TESTS 这样的环境变量您在 CI 设置中设置的。

跳过整个测试用例

如果您想跳过 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 - 除非明确要求,否则禁用某些测试的自动测试执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30309533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com