用鼻子重复单次或多次测试

Joh*_*hnJ 10 python nose

这个问题类似,我想让Nose运行一次测试(或所有测试)n- 但不是并行运行.

我在一个项目中有几百个测试; 一些是一些简单的单元测试.其他是具有某种程度并发性的集成测试.经常在调试测试时我想更"努力"地测试一下; 一个bash循环工作,但会产生很多杂乱的输出 - 没有更好的单一"." 每次通过测试.有能力在一定数量的试验中击败所选择的测试似乎是让Nose做的自然事情,但我没有在文档的任何地方找到它.

让Nose做到这一点最简单的方法是什么(除了bash循环)?

Zer*_*eus 16

您可以将鼻子测试作为生成器编写,然后鼻子将运行每个函数:

def check_something(arg):
    # some test ...

def test_something():
    for arg in some_sequence:
        yield (check_something, arg)
Run Code Online (Sandbox Code Playgroud)

使用nose-testconfig,您可以使测试运行的数量成为命令行参数:

from testconfig import config

# ...

def test_something():
    for n in range(int(config.get("runs", 1))):
        yield (check_something, arg)
Run Code Online (Sandbox Code Playgroud)

您可以从命令行调用例如

$ nosetests --tc=runs:5
Run Code Online (Sandbox Code Playgroud)

......不止一次跑.

或者(也可以使用nose-testconfig),你可以编写一个装饰器:

from functools import wraps
from testconfig import config

def multi(fn):
    @wraps(fn)
    def wrapper():
        for n in range(int(config.get("runs", 1))):
            fn()
    return wrapper

@multi
def test_something():
    # some test ...
Run Code Online (Sandbox Code Playgroud)

然后,如果您想将测试划分为不同的组,每个组都有自己的命令行参数来表示运行次数:

from functools import wraps
from testconfig import config

def multi(cmd_line_arg):
    def wrap(fn):
        @wraps(fn)
        def wrapper():
            for n in range(int(config.get(cmd_line_arg, 1))):
                fn()
        return wrapper
    return wrap

@multi("foo")
def test_something():
    # some test ...

@multi("bar")
def test_something_else():
    # some test ...
Run Code Online (Sandbox Code Playgroud)

你可以这样打电话:

$ nosetests --tc=foo:3 --tc=bar:7
Run Code Online (Sandbox Code Playgroud)