

























前言:
日常开发中,如果你曾经遇到过类似问题:
- 一个之前开发的、很久不维护的项目或页面,突然被告知无法访问或无法使用了。
- 一些重数据的页面,用户反馈有的时候数据对不上,但是自己开发的时候明明测过没有问题。
那么本文中提供的端对端测试,或许会给你解决这些问题带来一些帮助。
本文对使用 K8s 容器化运行 web 端对端测试用例进行介绍,对这个过程以及可能遇到的问题做一个整体的梳理,并且会穿插提供一定的参考资料。
相关示例代码已经开源:https://github.com/aircloud/easy-e2e
端对端测试(也称 E2E 测试),通常是从最终用户的角度出发,模拟真实实用的场景,并验证经过一系列操作之后,用户界面的表现是否符合预期。
它比单元测试、集成测试、接口测试等更能够反映用户真实的使用情况,使用得当会对我们带来很大收益。
web 的端对端测试通常使用 Puppeteer 等工具来完成,在下文中,端对端测试即指基于 Puppeteer 的 web 端对端测试。
笔者所在的团队中,会在以下场景中使用端对端测试:
实际上,在大多项目中使用端对端测试,都会给项目带来正向的、持续的作用。
端对端测试面临的问题主要体现在测试环境和测试用例成本两个方面。
对于测试环境配置方面,在使用容器化技术之前,通常都是本地使用 Windows 或者 Mac 开发,部署使用条件受限的 Linux 开发机器。
而端对端测试通常需要有 node 环境,并且需要下载一个浏览器和对应的控制工具(如 Puppeteer),以及需要成功把浏览器运行起来。
很多时候,虽然我们本地简单安装运行成功了,但是却由于种种原因无法成功在我们的开发机运行,这一点就劝退了很多团队。
本文提供的基于 K8s 容器化的方案,能够很好地解决这一问题。
测试用例的成本也通常是端对端测试被诟病的一点,在一些团队中,大家通常会去寻找一些“录制”测试用例的工具,并且和测试岗位的同学“协作”完成,最终通常因为录制工具不完善、工具链维护成本太高等原因,变成一个失败的 KPI 项目。
在笔者看来,如果我们已经基于 Puppeteer 开发了一个相对完整的测试骨架,并且对通用问题已经封装了通用函数(如登录态的处理),实际上在对 Puppeteer 比较熟悉的情况下,写一个测试用例的成本还是非常低的,而且我们应该主要用端对端测试对重要的用例进行编写,即可能引起 P0 事故的用例,一些特别边界的、对用户体验影响微小的测试用例由人工定期检查,这样才能做到 ROI 最高。测试用例本身也应该由研发工程师或测试开发工程师进行编写,“录制”工具仅被用于辅助我们编写用例的工具,而不能成为我们的负担。
接下来,我们对基于 K8s 容器化运行进行介绍。
这部分我们需要一个 K8s 环境,并且在此环境内可以访问我们的目标网站,对于本地开发而言,我们可以在自己的电脑上安装一个 docker 环境进行测试。
实际上,端对端测试不会影响主业务流程,即使我们现在主业务没有使用 K8s,我们也可以独立部署一个简单环境用于端对端测试。
我们的主流程如下:
zenika/alpine-chrome:with-node 定义一个 Dockerfile,将我们的测试代码一并打包成镜像。docker build 以及 docker container run 的方式运行镜像,进行验证(单次可能需要半分钟,不过当你开发过 Rust,你就会觉得这个时间并不算长,但能保证环境一致性)。借助网上的开源项目如 alpine-chrome/with-puppeteer/,我们已经可以比较方便地来修改测试,不过笔者还是做了一些整理,放到了 easy-e2e 这个仓库,主要的一些修改如下:
--cap-add=SYS_ADMIN 的方式来运行镜像,这种方式的问题在于,我们在部署的时候很可能由于安全策略限制被禁止这样部署(甚至还可能和运维人员扯皮),而在我们的端对端测试环境下,我们访问的网站一般都是我们自行开发的网站,相对来说可以比较信任,笔者改成了直接在代码中使用 --no-sandbox 选项,这样的好处是最小化部署的额外配置,从而更顺利地推动落地。基于上文的示例仓库,我们已经完成上述 1-3 点,而镜像推送和 K8s 定时任务,实际上部署起来也非常简单,这部分由于通常需要一些认证授权配置,示例中没有给出实现。
复杂的端对端测试通常会面临维护性问题,即我们的 dom 结构如果改变,需要修改端对端测试用例,这个没有办法完全避免,但是可以通过一些手段来尽可能地提高可维护性:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。