最近在工作中,遇到需要执行大量测试用例的情况。大概 2500 个测试用例,每个用例有数条 HTTP 请求以及一些特殊处理,线性执行下来的结果是我花了 2 个半小时才执行完成!
为了解决这个问题,提高工作效率,实现测试用例并发执行是我所需要的。
多线程执行测试用例
用协程实现
值得说明的是,多线程执行测试用例是有前辈实现过的。具体实现过程没有看过,依稀记得他的实现过程会生成多份测试报告,然后用 BeautifulSoup 去解析、合并测试报告。
由于正在学习 Python 协程,我还是决定先用协程试试能否实现。当然,最终结果证明改动不大,仅修改了源码的一小小部分,测试用例部分则只修改了单元测试模块名
首先是获取 python3 的源码。
git clone -b 3.5 https://github.com/python/cpython.git
unittest 源码在Lib/unittest
中。
给已有的测试用例打断点,调试几波,理清 unittest 模块对测试用例的调用执行顺序。
猜测主要过程为:
找到 TestCase 真正执行入口:
unittest/case.py
中的 TestCase
类中的 run
方法的 testMethod()
。(Line 605)
上层调用在 TestSuite 类中,修改上层入口,把对 TestCase 的顺序执行改为调用协程并发执行:
修改后,执行流程如下:
经过上述修改,原来 2600 多个测试用例需要的执行时间,从两个半小时压缩到 8 分半钟(如图),提高效率不赘述。
测试报告的 Log 获取不准确,应该是 IO 处理速度不足导致,后续需要想办法解决。(又有事做了:P)
已解决上述问题,原因在于使用 HTMLTestRunner 时,输出流代码未生效,导致原先重定向至 stderr 的结果被写入测试报告。在添加一秒钟睡眠时间后解决。(代码一行,debug 一天,哭)
欢迎 fork & start !
https://github.com/ityoung/python3-fastunit
https://stackoverflow.com/questions/30172821/python-asyncio-task-got-bad-yield