2011-04-07 116 views
6

假设我定义了一个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 

当我让鼻子识别收集-only模式的测试中,我得到

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)(即不是所有的测试) ?

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

回答

7

鼻子不能默认这样做,据我所知。这里有一些选择:在命令行

也许你正在寻找没有什么

1.假的,但我不得不提到它。你也可以 创建一个包装脚本来简化这个:

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

2.创建一个自定义的鼻试验装载机

这是一个涉及多一点,但你可以创建自定义的测试 其中装载机解释该命令行参数作为指定所述发电机 加载,从发电机翻出测试和参数,并返回包含测试(多个)与所述匹配参数的套件。

下面是一些示例代码,这应该给你足够的基础上(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 
相关问题