强行为新项目写ui自动化用例是一种什么样的体验
最近接了一个新项目,配套有个 web 管理后台页面,尽管需求一直在迭代以及测试时间相对不宽裕,我还是决定写点自动化用例作为功能测试的补充和回归测试的输入,顺便玩一下 playwright,不在真是项目中使用一种技术其实是很难对这种技术产生深刻理解的。
项目介绍
管理后台是前后端分离的,前端用的 react 加上蚂蚁的前端组件库,后端是基于 golang 构建的微服务。其实这种项目更适合做接口测试,ui 自动化作为补充就好了。
技术选型
这点很清楚,之前 benchmark 过,playwright 比 cypress 性能要好,所以直接选 playwright,另外 playwright 的 python 版本完全安装之后自带了 pytest 和一系列断言,基本上开箱即用,非常方便。另外为什么不用 js 而用 python,主要是因为我用 python 写了一点接口用例,有些数据库操作的代码可以稍微复用一下,所以统一起见用 python+playwright
第一个难点:登录
管理后台接的是 google auth,由于我的账号开启了二次验证,需要收验证码,所以从 ui 上输入用户名和密码登录就走不通了。不过登录的原理基本相同,就是往 cookie 里写一些东西,后面所有的请求都自动带 cookie 到后端,后端通过之前写的那些东西就可以判断用户是谁,什么时候登录失效等。知道了原理后面就是随便试试了,我的代码大概是这样写的
def login(page):
page.goto("url")
page.evaluate(f'()=> document.cookie="{COOKIE}"')
其实就是先访问被测页面,然后自动跳到登录页面,这时候去用 js 设置 cookie,之后再访问一次被测页面就可以自动登录了。
cookie 的话可以从浏览器的开发者工具里直接拷贝出来,因为是测试环境,所以 cookie 的有效期很长,基本可以放心使用。
至于如何定期刷新 cookie 其实也不难搞,写个浏览器插件,每次打开被测页面的时候就把 cookie 发到一个自建后台服务,这个服务就是把 cookie 存到 redis 里,在测试用例里直接访问 redis 拿最新的 cookie 就好了。
定位有点麻烦
作为熟练工,定位对我来说应该不会是大问题,然而现在的前端组件层级嵌套厉害,html 的表意性不强,而且 id,name 等比较有标志性的属性也不是很多,踌躇良久之后我决定请前端同学在一些关键的组件上面加上 id 或者 name,尽管他们不是很愿意,但是我倚老卖老,还是让他们从了。