unittest.defaultTestLoader.discover实现在运行时运行用例

做基于unittest的自动化测试代码编写,运行用例或多或少都用到unittest.defaultTestLoader.discover方案。
 

suites=unittest.defaultTestLoader.discover('testcase',pattern='test*.py')

基于该方法查看其源码,其中有一段代码令人寻味<最后三行>,如下。

    def discover(self, start_dir, pattern='test*.py', top_level_dir=None):
       '''以上代码省略,只复制了最后三行'''

        if not is_namespace:
            tests = list(self._find_tests(start_dir, pattern))
        return self.suiteClass(tests)

再找到_find_tests方法如下:

unittest.defaultTestLoader.discover实现在运行时运行用例_第1张图片

 tests = list(self._find_tests(start_dir, pattern)) 的list方法直接把这个生成器生成的数据一次性拿出来,没有起到生成器的作用,故对其做一定的改变如下。

unittest.defaultTestLoader.discover实现在运行时运行用例_第2张图片

 将discover()改为一个生成器函数,等待更上层处理。

配合beautifulreport生成测试报告,需要在report模块对这个生成器做进一步处理。只需要将report方法中的注释的一行改为标红的代码即可。这时候就是一个模块一个模块的导入,运行。这里利用了生成器的惰性机制,当然也可以在外部做限定,使之一次只能导入一个模块(相对简单,这里不表)。

unittest.defaultTestLoader.discover实现在运行时运行用例_第3张图片

验证:

unittest.defaultTestLoader.discover实现在运行时运行用例_第4张图片

导入时就会打印红色标记内容。 

unittest.defaultTestLoader.discover实现在运行时运行用例_第5张图片

 未做更改时会一次性打印出来,再行运行用例one by one(奈何母语不过关,用一个接一个有点太口语化)。

配合beautifulreport如下:

你可能感兴趣的:(单元测试,python)