这篇文章介绍怎样用java对测试用例进行断言。断言英文是assertions,其实就是执行test case后验证期望结果和实际结果是否一致的一个过程。
前几篇文章我们主要讲的是元素的操作,元素操作只能返回测试的实际结果。这时假如你还有个期望结果,把二者一对比,一样就pass,不一样就fail,这就是一个简单的断言。一般来说,断言过程记一个小口诀 -“在不在是不是相等不相等”。
第一个,在不在,就是查看某个元素是否显示在当前网页上,或是frame/iframe上。检查在不在用的是isDisplayed()方法。注意,这个方法只有在该元素已经存在的情况下才可以放心使用,如果元素不存在你还用就会抛异常。确定存在的方法是用findElements()先取个数,看个数大不大于0,大于就证明存在,就可以接着用isDisplayed()。为什么可以用findElements()?因为它不抛异常。isDisplayed()和findElements()怎么使用其实在之前普通文本操作那篇的后半段有涉及,不太清楚的朋友去参考一下。
第二个,是不是,就是查看某个值是不是和期望值相等/不相等/比它大/比它小。我们现在还没讲类似Junit或TestNG之类的测试框架,所以只能用纯java语法来做,也就是用if语句配合条件运算符来做。简单演示一下“在不在”和“是不是”,打开示例网页assertions.html:
这是我随便做的一个用于演示断言的小网页,里面有个模拟用户注册的小界面,逻辑很简单,输入用户名和密码,然后点注册按钮。因为只是个演示,你随便输什么值能注册成功,但前提是两个文本框必须都要输入东西时才能注册成功,缺一个就报错:
我们的test case就像上面那幅图一样:
1. 输入用户名marco;
2. 密码为空,点击注册按钮;
3. 验证:1)密码错误信息在不在;2)实际错误信息和期望值相等不相等。
给大家提个醒,写自动化测试test case之前务必把步骤写下来,然后再对照着一步一步写代码。别懒,有时候一个复杂case十几步二十步,光凭大脑记忆万一中间漏写了一步代码呢?那你还得重新梳理你脑子里的步骤,浪费时间。这都是我曾经跌过的坑摔过的伤流过的泪以及掉过的头发,太痛苦,所以我祝你们今生再不重蹈覆辙。简单演示一下,新建一个叫SeleniumAssertions的java项目 -> 包com.test -> Test.java,添加selenium jar包,把driver声明配置好。先上代码:
你看,这就是个典型的“在不在”和“是不是”结合的写法。点击注册按钮后,因为要验证密码错误信息“在不在”,我怕它不在会报错,所以我先用findElements()查看个数,如果大于0证明存在,然后我再用isDisplayed()看它显示不显示。在显示的前提下再验证“是不是”,也就是判断测试实际值和期望值相等不相等,其实就是字符串的比较。注意这里一定要用equals,因为比较的是字符串的内容,千万别用“==”,俩等号比的是字符串的地址,别搞混了。
再看一个例子,assertions.html上还有个生成随机数的例子,每点一次文本框中都会产生一个0到100的整数(包括0):
我们的test case如下:
1. 点击按钮;
2. 验证:出现的数值大于等于0并且小于100
代码如下:
点击id=button那个按钮会得到一个随机生成的值,从文本框中把它取出来。因为默认是字符串,需要转成整型,然后比较,整个过程很容易理解。你如果有时间还可以试试其它的条件表达式,我这儿就不再举了。
第三个,相等不相等,这个用的比较灵活,不需要期望值。咱们看assertions.html的复选框案例:
有四个复选框,每一个旁边都有名称。我现在想判断复选框个数是不是和名称个数相等。你当然可以分别计算个数再比较,但其实用不着。这时就可以用第三个断言过程,因为我发现复选框和名称一定是成对出现的,如果双方数量不相等肯定是网页有问题。所以在我的test case中不需要分别设置期望值,直接比较两者即可。代码如下:
求个数当然就还得用findElements()配合size(),别的没什么可说的。还有一点,这个例子中没必要设置期望值还有一个原因,就是需求。大家想想,设计复选框的目的本来就是让人选好几个,那有没有可能会随着网站开发的不断完善添加更多的选项呢?很有可能。十年前没微博没微信,当时写的网站里关于社交的选项也就是人人网开心网,现在不就井喷了很多吗?比如陌陌对不对?好了,不开车。反正这种情况下期望值有可能根据需求慢慢增加,但标签和复选框却始终成对出现,所以直接对比即可。当然,如果你实在害怕它们个数虽然相等但个数有误,那多写几行代码也没什么。
这就是断言的“在不在是不是相等不相等”,记住这个口诀。这篇文章的源代码在SeleniumAssertions里。