【问题标题】:Running generated nose tests运行生成的鼻子测试
【发布时间】:2011-07-31 22:28:45
【问题描述】:

假设我定义了一个testFile.py python 模块,如下所示。

def test_evens():
    for i in range(0, 5):
        yield check_even, i, i*3

def check_even(n, nn):
    assert n % 2 == 0 or nn % 2 == 0

当我让鼻子在仅收集模式下识别测试时,我得到了

testFile.test_evens(0, 0) ... ok
testFile.test_evens(1, 3) ... ok
testFile.test_evens(2, 6) ... ok
testFile.test_evens(3, 9) ... ok
testFile.test_evens(4, 12) ... ok

我可以使用

运行所有测试

nosetests -v testFile:test_evens

但是,如果我只想运行 testFile.test_evens(2, 6)(即不是所有测试)怎么办?

有没有办法从命令行执行此操作?

【问题讨论】:

    标签: python nose


    【解决方案1】:

    据我所知,Nose 默认无法执行此操作。以下是一些选项:

    1.从命令行伪造它

    可能不是您想要的,但我不得不提一下。你也可以 创建一个包装脚本来简化这个:

    python -c 'import testFile; testFile.check_even(2, 6)'
    

    2。创建自定义鼻子测试加载器

    这有点复杂,但您可以创建自定义测试 loader 将命令行参数解释为指定生成器 加载,从生成器中提取测试和参数,并返回一个包含测试的套件和匹配的参数。

    下面是一些示例代码,应该足以让您在 (runner.py) 的基础上进行构建:

    import ast
    import nose
    
    class CustomLoader(nose.loader.TestLoader):
    
        def loadTestsFromName(self, name, module=None):
            # parse the command line arg
            parts = name.split('(', 1)
            mod_name, func_name = parts[0].split('.')
            args = ast.literal_eval('(' + parts[1])
    
            # resolve the module and function - you'll probably want to
            # replace this with nose's internal discovery methods.
            mod = __import__(mod_name)
            func = getattr(mod, func_name)
    
            # call the generator and gather all matching tests
            tests = []
            if nose.util.isgenerator(func):
                for test in func():
                    _func, _args = self.parseGeneratedTest(test)
                    if _args == args:
                        tests.append(nose.case.FunctionTestCase(_func, arg=_args))
            return self.suiteClass(tests)
    
    nose.main(testLoader=CustomLoader)
    

    执行它:

    % python runner.py 'testFile.test_evens(2, 6)' -v
    testFile.check_even(2, 6) ... ok
    
    % python runner.py 'testFile.test_evens(2, 6)' 'testFile.test_evens(4, 12)' -v
    testFile.check_even(2, 6) ... ok
    testFile.check_even(4, 12) ... ok
    
    % python runner.py 'testFile.test_evens(1, 3)' -v
    testFile.check_even(1, 3) ... FAIL
    

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2019-09-10
      • 2011-06-03
      • 1970-01-01
      相关资源
      最近更新 更多