快到年底了,没啥东西要做了,搞一把 WebUI 自动化测试作为 2023 年收官之战,以下仅介绍技术实现思路,也欢迎大家有更好的想法在评论区交流。
实现一个面向普通用户的 WebUI 自动化测试服务,实现效果可以参考MeterSphere的 UI 自动化测试功能,当然这玩意儿是要收费才能用,可以申请个账号去体验下。注意:不是在给 MeterSPhere 打广告,只是懒得写需求而已。
虽然现在也有一些开源的 WebUI 自动化测试平台,但是调研了之后发现并不好用,比如 LuckyFrame,代码都是写死的,没啥扩展性,不是说这个项目不好,而是不满足我们的需求。所以最后选择了半天,使用如下技术栈来实现: Jmeter, Jmeter-plugins-webdriver, Springboot
以上是大概的实现流程,整体思路为:
Jmeter-plugins-webdriver 插件有个 bug,就是在执行WebDriverSampler.sample方法时,如果用例中有主动关闭浏览器的步骤,就会导致采样器报错,原因是:在脚本执行结束后,需要对采样器结果进行封装,会将页面源码封装为 SampleResult 对象的 ResposeData,将当前页面的 URL 设置为 SampleResult 对象的 URL,但是因为浏览器已经被主动关闭了,这个时候再也无法获取到页面源码和 url,就会导致采样器结果标记为异常。
WebDriverSampler的 sample方法中,并未设置采样器开始和结束时间,导致自己开发的后台监听器中,无法取到用例的执行时长。
我用的 Jmeter 版本是 5.4.1,其中 beanshell 版本是 Jmeter 自带的 2.0b6 版本,在这个版本中,使用 Java 编写代码时,会将 null 转为 void,详情可见这几个bug:https://github.com/apache/jmeter/issues/3411 https://github.com/apache/jmeter/issues/6110 解决方案就是把 beanshell 升级到 2.1.1
在服务器上部署时,需要安装浏览器运行环境,我这边用的 chrome,但是在测试时发现打开的页面要么中文是方框,要么页面默认是英语。记得安装中文语言包,并设置服务器默认语言为中文,不知道怎么设置就去问 gpt 吧,懒得写了。
服务器上运行 chrome 可能会出现 chrome 启动失败,记得增加如下配置到 ChromeOptions 中:
/**
* @author: wick
* @date: 2023/12/24 20:09
* @description: chrome options
*/
public class ChromeOptionConstant {
/**
* 允许跨域资源共享(CORS)请求。*表示接受所有来源的请求。
*/
public static final String REMOTE_ALLOW_ORIGINS = "--remote-allow-origins=*";
/**
* 无痕模式
*/
public static final String INCOGNITO = "--incognito";
/**
* 禁用沙箱
*/
public static final String NO_SANDBOX = "--no-sandbox";
/**
* 禁用 GPU,服务器上没有 GPU
*/
public static final String DISABLE_GPU = "--disable-gpu";
/**
* 禁用共享内存,解央 DevToolsActivePort file doesn't exist 异常
*/
public static final String DISABLE_DEV_SHM_USAGE = "--disable-dev-shm-usage";
/**
* 浏览器语言-中文
*/
public static final String LANG_ZH_CN = "--accept-lang=zh-CN";
/**
* 所有配置
*/
public static final String OPTIONS = String.join(" ", REMOTE_ALLOW_ORIGINS, INCOGNITO, NO_SANDBOX, DISABLE_GPU, DISABLE_DEV_SHM_USAGE, LANG_ZH_CN);
}
这个 WebUI 自动化技术实现上没啥难度,难的地方在于如何做技术选型,因为绝大多数人做 UI 自动化都是想着用框架写代码实现,但是很少有人会去挑战通过代码生成的方式来做,只要把实现思路理清楚,其实写代码也就那么回事了。对了,我fork 了这个Jmeter-plugins-webdriver插件到 gitee 了,把上面两个问题处理了一下,有兴趣的可以直接用我改过的代码:https://gitee.com/linvaux/jmeter-plugins-webdriver