1. 程式人生 > >[OpenStack UT]單元測試之testscenarios

[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('', '', '', '', ''),