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