2011-04-07 112 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 
相關問題