[OpenStack UT]單元測試之testscenarios
看heat code, 看到testscenarios的使用, 好奇的研究了下
testscenarios 其實實現的就是這樣一種框架,在class中給scenarios賦值,描述出不同場景, 測試case就可以通過testscenarios框架自動生成針對這些scenarios不同test, 從而達到測試不同場景的目的。
建議直接從https://pypi.python.org/pypi/testscenarios/ 下載最新的testscenarios code看, code結構非常簡單.
Code中主要就兩個檔案lib/testscenarios/scenarios.py和lib/testscenarios/testcase.py
scenarios.py 是core部分,講的是如何生成scenarios cases的一些function, 下面例子中load_tests_apply_scenarios 就是其中一種對測試載入protocol進行適配來生成scenarios cases的一種方法, 如下例中, 把它賦給load_tests, 實現了load_tests protocol 的測試載入器就可以自動的把生成的scenarios cases載入到測試中.
testcase.py 講述的是TestWithScenarios, TestWithScenarios可以說是對WithScenarios, unittest.TestCase組合封裝, 可以更方便供使用者使用, 就是加了封裝, testscenarios 在pypi上釋出的包中doc目錄下example.py就是一個使用TestWithScenarios很好的例子. 這裡沒有貼出來, 非常簡單。
下面看看testscenarios在OpenStack專案裡的使用,下面code摘自python-heatclient/heatclient/tests/test_template_format.py,用於示例講述用法
load_tests = testscenarios.load_tests_apply_scenarios class YamlParseExceptions(testtools.TestCase): scenarios = [ ('scanner', dict(raised_exception=yaml.scanner.ScannerError())), ('parser', dict(raised_exception=yaml.parser.ParserError())), ('reader', dict(raised_exception=yaml.reader.ReaderError('', '', '', '', ''))), ] def test_parse_to_value_exception(self): text = 'not important' with mock.patch.object(yaml, 'load') as yaml_loader: yaml_loader.side_effect = self.raised_exception self.assertRaises(ValueError, template_format.parse, text)
關於本例中的mock.patch.object 和side_effect用法, 可參考我的另一博文http://blog.csdn.net/juvxiao/article/details/21562325
Line 1: load_tests 是unittest 庫中的一個function, 它負責定製測試用例載入的方式,
class 中會對scenarios賦值, 為key-value組成的列表, value為dict。可像test傳遞一些值, 比如本例中的raised_exception
這個例子實現的效果是會形成三個test case來執行, ‘scanner’ case 執行時 測試function中mock物件的side_effect為yaml.scanner.ScannerError();
‘parser’ case 執行時 測試function中mock物件的side_effect為yaml.scanner.ParserError(); ‘reader’ case 執行時 測試function中mock物件的side_effect為yaml.reader.ReaderError('', '', '', '', ''),