前言
测试同学一般在测试网页应用的时候,都会按着既定的用例描述自行操作一遍,来验证输出结果是否符合预期,这相信也是大部分公司招聘测试员的工作范围之一。
这种作业模式,在上线频率不高的前提下,还是可以满足要求的。完整执行一次回归测试,覆盖系统所有功能,实际上也是比较耗费时间的。
自动化测试固然可以解决测试效率问题,但测试同学对自动化的实施通常存在以下疑问:
- 浏览器的自动化访问脚本,很容易因为界面的改动,导致以前的测试脚本失效,维护成本高
- 编写测试脚本,由于是界面录入和点击级别的描述,工作量巨大
这些疑问的核心是:如何很好的维护测试代码
这里「好」的意思是:
- 如何分离物理层(HTML)和逻辑层(业务逻辑),让逻辑层不会因为底层(物理层)的变化,而需要重新写一遍
- 如何提升操作和描述层次,让我们可以描述点击元素级别的操作(物理层操作),也可以描述高层次的操作(业务操作)。
这些问题,其实和测试并没有直接关系,这是一般编程上的抽象要求,和可复用性的要求,只是把相同的概念用在测试领域上而已。
以下介绍一个方案:Cucumber + Selenium WebDriver
什么是Cucumber
简单说,用Cucumber为了简化编写测试程序,让我们写测试程序就如同写文章一样。例如:
# language: zh-CN
功能: 企业创建套餐,应付计算
场景: 创建基础服务套餐(免费试用)
假如存在企业为:"CA", 密码为:"123456789", 账号为:"13578819805"
假如创建产品编号为:"P001",单价为:"0"
当企业:"CA"购买清单如下:
| 产品编码 |数量|
| P001 |1 |
那么应付金额为:"0.0"
当然,文字的背后,需要写一小段代码支撑该段文字:如下面(使用Java8的Lamba语法)
public class CorporationStepdefs implements Zh_cn {
public CorporationStepdefs() {
假如("存在企业为:{string}, 密码为:{string}, 账号为:{string}", (String corpId, String password, String mobile) -> {
// TODO 若企业不存在,则创建企业
});
}
如何使用Cucumber,就不在这里展开说了,需要进一步了解的请参考官网说明。
什么是Selenium WebDriver
官网:https://www.selenium.dev/documentation/en/webdriver/
简单说,Selenium提供浏览器自动化的标准接口,用同样的命令集就可以驱动不同的浏览器,进行程序控制的点击,录入,查询界面内容等工作。
看到Selenium的接口,控制的都是界面级别的元素操作。如:
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
WebElement logo = driver.