2011-12-13 64 views
5

我有幾個測試模塊,它們都是通過可以接受各種參數的驅動程序腳本一起調用的。測試本身是使用python unittest模塊編寫的。將python腳本參數傳遞給測試模塊

import optparse 
import unittest 
import sys 
import os 

from tests import testvalidator 
from tests import testmodifier 
from tests import testimporter 

#modify the path so that the test modules under /tests have access to the project root 
sys.path.insert(0, os.path.dirname(__file__)) 

def run(verbosity): 
    if verbosity == "0": 
      sys.stdout = open(os.devnull, 'w') 

    test_suite = unittest.TestSuite() 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testvalidator.TestValidator)) 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testmodifier.TestModifier)) 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testimporter.TestDataImporter)) 

    unittest.TextTestRunner(verbosity=int(verbosity)).run(test_suite) 

if __name__ == "__main__": 

    #a simple way to control output verbosity 
    parser = optparse.OptionParser() 
    parser.add_option("--verbosity", "--verbosity", dest="verbosity", default="0") 
    (options, args) = parser.parse_args() 

    run(options.verbosity) 

我的問題是,在這些測試模塊,我有一些測試,我想跳過基於傳遞給驅動程序的不同參數。我知道unittest提供了一個裝飾器家族,但我不知道將這些信息傳遞給各個模塊的最佳方法。例如,如果我有一個參數--skip-slow,那麼我怎麼可以將測試註釋爲慢速,並讓它們跳過?

謝謝你的時間。

+0

我可能找到了可以使用的解決方案。檢查我的答案。 – 2011-12-13 22:17:29

回答

2

我自己其實一直在想這個,最後找到了解決辦法。

主要文件...

... 
if __name__ == '__main__': 
    args = argparser() 

    from tests import * 

    ... 

並在測試模塊,只是做:

from __main__ import args 

print args 

我測試了這一點,它很好地工作,而。好的一點是它有多簡單,而且它根本不是什麼黑客。

1

您可以使用nose測試運行器和attrib插件,該插件允許您根據屬性選擇測試用例。特別是,插件文檔中的示例使用@attr(slow)來標記緩慢的測試用例。

在那之後,從所述命令行:

  • 要選擇所有測試用例標記爲slow

    $ nosetests -a slow

  • 要選擇所有未標記爲slow測試用例:

    $ nosetests -a '!slow'

+0

我可能需要熟悉自己的鼻子,因爲它似乎單元測試可能不會達到這個。我堅持希望我不會添加依賴項。 – zchtodd 2011-12-13 21:38:46