前面我们了解了测试组织的测试套件,已经批量查找用例并生成套件的加载器。
而在 unittest 的加载器中还提供了一个更加编辑的用例加载方法 discover()。
discover() 是 TestLoader 中用于指定测试目录,并查找该目录及子目录下所有符合查找规则的所有测试用例并构建测试套件。
- 查找的测试目录
- 子目录中的必须包含
__init__.py
(空文件即可),也就是子目录必须是一个包 - 指定查找规则,以
*
作为通配符 - 用例文件中的用例必须以
test
开头
还是以前面的案例为例,这里只是新建了一个子目录 sub_test,并把 test_b 放了进去:
+ test_demo 测试目录
- add.py 待测函数 add() 所在的文件
- test_a.py 测试类 TestAddOne 所在的文件,测试整数与字符串相加
+ sub_test 测试子目录
- test_b.py 测试类 TestAddTwo 所在的文件,测试列表与元组相加
- __init__.py 标识这是一个包目录
- run.py 测试套件
如果不清楚每个文件中的代码的话请查看上一节内容
使用 discover 查找 test_demo 目录下的所有测试用例,我们把 discover() 写在 run.py 文件中。注意 run.py 在 test_demo 目录下,与 sub_test 平级。
run.py
import unittest
tests = unittest.defaultTestLoader.discover(
start_dir='.', # => 指定查找的目录
pattern='test*.py' # => 指定查找规则
)
runner = unittest.TextTestRunner()
runner.run(tests)
使用 discover() 函数,需要指定两个参数:
- start_dir:指定查找的起始目录,这里写的是相对路径
.
,当前文件所在的目录 - pattern:指定查找规则,默认就是
test*.py
,这里*
作为通配符使用,可以表示任意个数的任意字符。test*.py
表示查找文件名以 test 开头的所有文件*test*.py
表示查找文件名包含 test 的所有文件test*.py
表示查找文件名以 test 结尾的所有文件
运行效果是会找到 test_demo 下的所有测试用例。
在实际使用时,可以在测试文件命名上制定一些规则,比如需要用于冒烟测试的用例中全部加上 smoke 字样,在运行冒烟测试时就可以匹配
*smoke*.py
运行。
这里特别要注意 discover 是基于 ASCII 码的排序规则(数字 - 大写字母 - 小写字母
),然后遵照以下的顺序查找用例并加载:
- 根据 start_dir 开始目录中的名称顺序,不管是目录还是测试文件
- 如果目录中还有子目录,继续根据名称顺序先找排序靠前的
- 文件中根据测试类名的顺序
- 类中根据方法名称的顺序
所以加载顺序是:目录 - 文件 - 测试类 - 测试方法
。所有的加载顺序都是根据 ASCII 码的排序规则(数字 - 大写字母 - 小写字母
)。
示例的 test_demo 中的加载顺序:
+ test_demo 测试目录
- add.py 待测函数 add() 所在的文件
- test_a.py 测试类 TestAddOne 所在的文件,测试整数与字符串相加
+ sub_test 测试子目录
- test_b.py 测试类 TestAddTwo 所在的文件,测试列表与元组相加
- __init__.py 标识这是一个包目录
- run.py 测试套件
先 sub_test 目录中的 test_b.py 中的测试用例,再是 test_a.py 中的测试用例。因为当 sub_test 和 test_a.py 比较时,s
在 t
前面。