目前使用的是:selenium+python+pytest,为减少运行时间,使用了 selenium-grid 并行处理用例,总共两台服务器,所有脚本跑下来还是接近三小时。
现有资源下,还有什么方法提升脚本执行的效率。希望大佬们,不吝赐教。
使用虚拟技术,两台变六台
增加硬件资源可以提高效率,不过不是最好的手段。二楼说的对,需要多方面考虑一下:
1,从用例执行的流程分析一下,找到耗时的地方,从减少用例执行步骤,提升用例执行时间如入。如通过接口减少操作步骤,合理安排用例执行顺序,优化元素定位方法等。
2,在保证用例之间低耦合的前提下,多开几个浏览器,并发执行就可以了。
3,合理选择用例集,因为 UI 用例天生比接口慢,所以要合理安排执行的用例集,也能有效地提高执行速度的。
楼上已经提到了,我目前采用的方法是对于个别频繁的步骤首次用 UI 检查,后面的类似操作直接用 api 来完成,把用例分组,多进程开 3 到 4 个浏览器同时来跑。
可以试试用 docker,当然这也要看你内存有多少,能启多少个容器,应该能成倍提高效率
如果不加资源,可以考虑先从以下方面入手:
很高兴能对你有所帮助。我目前所在的产品,已经实现 UI case 400 多个,一人维护这 19K 行代码,如果顺序逐次完成,大约需要 3.5 小时。将用例按模块大致分成 3 份(pytest 的 pytest.mark.part1),改成 3 个进程执行,基本上 1 小时 15 分能执行完成,效率提升很多。
赞成 2 楼和 6 楼的观点,再补充个方法,400 个 case 可以再根据业务细化开来,分成多个任务去执行,比如说 400 个 case 分成 10 个小业务去跑,效率提升比较直观 3.5h/10
既利用了 pytest-xdist 也用了自写的多进程,这样测试报告就能汇总了,其实很简单。大致代码如下:
from multiprocessing import Pool
import pytest
def run_case_part(pytest_lst):
pytest.main(pytest_lst)
def main():
case_lsts = [
['-s', '--alluredir=report/xml_20231009_0829', './cases/', '-n', '2', '--dist=loadfile', '-m', 'p1'],
['-s', '--alluredir=report/xml_20231009_0829', './cases/', '-n', '2', '--dist=loadfile', '-m', 'p1']
]
p = Pool()
for run_lst in case_lsts :
p.apply_async(run_case_part, args=(run_lst,))
p.close()
p.join()
if __name__ == '__main__':
main()
需要按自己要求处理下变量 case_lsts 就差不多了,里面 的 '-n', '2' 表示 2 个进程执行,'--dist=loadfile' 表示每个 py 文件的所有测试都在同一个进程中运行 (这个自己可以取舍,如果单 py 文件中的 case 有关联,建议加上,也可按自己的情况改成 loadgroup 或 loadscope 或其它)