Selenium 很困扰,大佬们,怎么提升 UI 自动化脚本执行效率

日积跬步 · 2022年09月02日 · 最后由 大桥 回复于 2023年10月09日 · 9110 次阅读

目前使用的是:selenium+python+pytest,为减少运行时间,使用了 selenium-grid 并行处理用例,总共两台服务器,所有脚本跑下来还是接近三小时。
现有资源下,还有什么方法提升脚本执行的效率。希望大佬们,不吝赐教。

共收到 19 条回复 时间 点赞

使用虚拟技术,两台变六台

  1. selenium 在一台服务器上面可以开多个 session 的,只要你的账号不存在单点登录的限制,理论上你可以设置很多个 session 去同时跑,减少执行时间。
  2. 从用例执行测试角度入手,看下哪些步骤耗时比较长,尝试优化,降低单条用例的执行时间。

增加硬件资源可以提高效率,不过不是最好的手段。二楼说的对,需要多方面考虑一下:
1,从用例执行的流程分析一下,找到耗时的地方,从减少用例执行步骤,提升用例执行时间如入。如通过接口减少操作步骤,合理安排用例执行顺序,优化元素定位方法等。
2,在保证用例之间低耦合的前提下,多开几个浏览器,并发执行就可以了。
3,合理选择用例集,因为 UI 用例天生比接口慢,所以要合理安排执行的用例集,也能有效地提高执行速度的。

楼上已经提到了,我目前采用的方法是对于个别频繁的步骤首次用 UI 检查,后面的类似操作直接用 api 来完成,把用例分组,多进程开 3 到 4 个浏览器同时来跑。

可以试试用 docker,当然这也要看你内存有多少,能启多少个容器,应该能成倍提高效率

如果不加资源,可以考虑先从以下方面入手:

  1. 看现有服务器资源利用情况,如果资源利用率不高,先用满
  2. 审核自动化用例,降低重复检测,精简用例
  3. 分层,降低 UI 脚本执行比例,提高接口执行比例
Ouroboros 回复

ui 自动化,还能用接口吗?

大桥 回复

你这个思路不错啊,我之前怎么没想到

大瓶子 回复

给 UI 用例瘦身,部分用例转成接口测试进行覆盖。

Ouroboros 回复

那还要做接口自动化吗

xinxjxjxj 回复

很高兴能对你有所帮助。我目前所在的产品,已经实现 UI case 400 多个,一人维护这 19K 行代码,如果顺序逐次完成,大约需要 3.5 小时。将用例按模块大致分成 3 份(pytest 的 pytest.mark.part1),改成 3 个进程执行,基本上 1 小时 15 分能执行完成,效率提升很多。

赞成 2 楼和 6 楼的观点,再补充个方法,400 个 case 可以再根据业务细化开来,分成多个任务去执行,比如说 400 个 case 分成 10 个小业务去跑,效率提升比较直观 3.5h/10

大桥 回复

不错的思路 既覆盖了 UI 方面 又提升了效率 我想办法试一试

homin 回复

多个任务是指什么

爱偷懒的QA 回复

UI 真是一言难尽 有时本地执行可以成功 服务器上不行;有时今天成功了 明天又失败了;每次跑完检查要很长时间

日积跬步 回复

比如说之前只建了 1 个 jenkins 任务跑,根据需求拆分成 10 个小需求小项目,建 10 个 jenkins 任务跑。

日积跬步 回复

如何提高测试用例稳定性以及出现错误时 debug 的便捷性才是让 UI 自动化测试方案落地的重要细节。

大桥 回复

请教一下 具体的实现思路是什么啊,是用的 pytest-xdist 吗,还是自己写的多线程;分组执行后测试报告能汇总吗

lam 回复

既利用了 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 或其它)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册