有成功就有失败。登录验证不光要验证成功的test case,也要覆盖各种失败的情况:比如用户名/密码输入错误,按钮出问题,跳转界面不正确等等。因为用户名/密码输入错误比较常见,这次我们就用它举例作为登录模块的第二个test case。
打开RIDE,加载之前的项目,并在Tests –> Login模块里创建第二个test case TCLOG-2:
我把里边内容也写上了一部分。很好理解,登录失败和登陆成功一样,也需要在运行前后关闭其它浏览器,所以同样把Setup和Teardown步骤写好。还有一点一样的是,程序运行起来也需要从文件里读取数据,只不过是错误的数据罢了。经过分析,无非有以下几种可能的错误:
1) 员工代号没填;
2) 密码没填;
3) 员工代号不存在;
4) 密码和员工代号不匹配。
我们就以第4种情况为例准备数据写test case,选一个合法的员工代号,但错误的密码。在Test_Data ->Login下新建一个文件叫TCLOG-2.xls,还是用1001号员工,他的正确密码是123。我们随便写个错误密码,比如“321”:
然后仿照TCLOG-1,把读取数据的部分写进前两行,注意把文件名改成TCLOG-2.xls:
Test case主体写完了,该写函数了。先打开登录成功的函数Login to hrsystem复习一下 – 打开浏览器,输入员工代号密码种种,我们会发现对于登录失败用户也得执行这些操作,我们完全可以复制粘贴,唯一不同的是最后验证方式不一样。对于登录成功会出现导航栏Home按钮,登录失败会出现警告“usercode or password is incorrect”:
所以我们只要验证是否会出现红色警告即可。出现警告就是pass,没有警告就是fail。右键点击Pages里的Login.html资源文件新建一个叫Invalid login to hrsystem的Keyword,代表登录失败的函数,然后复制粘贴Login to hrsystem中的前几步。还有,别忘了把员工代号和密码参数放到Arguments域中:
我们既可以检查网页包不包含该警告在网页上的位置,用page contains element即可,以前在登录成功的例子中用的就是这种。当然也可以检查该警告的内容是不是目标字符串“usercode or password is incorrect”。我们这次用第二种方法,先把这个目标字符串声明成一个变量:右键ObjRepository -> Login.html -> New Scalar,输入变量${tLoginErrorMsg},值是“usercode or password is incorrect”:
运行测试时从警告的xpath取出字符串。如果和这个目标值相同就pass,不同就fail:
回到函数Invalid login to hrsystem,在最后加上如图所示的两句话:
第7行代表的是从变量${locLoginErrMsg}中取出值,然后赋给变量${tcurrentErrMsg},第二列“Get Text”表示从哪个变量取。${tcurrentErrMsg}不需要在ObjRepository –> Login.html里创建,因为它只是个本地变量,作用域只限于当前函数中,不需要在别的函数中引用,用完就完了。第8行的关键字Should be Equal As Strings接受两个字符串作为参数,目的是比较两个字符串是否相等,也就是把第7步从警告xpath里取出的值与目标字符串${tLoginErrorMsg}进行比较。
函数修改完毕,回到TCLOG-2,把函数写到test case中:
运行测试,因为从xpath得到的字符串和目标字符串相等,测试通过。这就是验证登录失败的test case,在实际项目中与登录成功的验证同等重要。刚才也说了,两个函数Login to hrsystem和InvalidLogin to hrsystem前几步都是相同的,写两遍太累,与我懒人气质不符。写程序时我们的目标是能省就省,能不重复绝不重复。继续优化,我们可以把操作和验证分开,在一个keyword里只写操作,而用另外两个分别写登陆成功和登录失败的验证。
打开Invalid Login to hrsystem,把前几步都删除,然后把Login to hrsystem和它所需要的员工代号密码两个参数写到第一行,如下图:
在Pages -> Login.html中新建一个叫Valid Login to hrsystem的keyword,这个函数是专门用来验证登录成功的。和Invalid Login to hrsystem一样修改:
Login to hrsystem函数只保留操作步骤,把验证部分删除:
你看,这么一改,操作步骤用Login to hrsystem,验证分别用另外两个,彼此互不干扰。最后,回到TCLOG-1修改相应函数名,TCLOG-2不需要:
同时运行两个test cases,测试通过:
这篇文章的源代码在[Test5](https://github.com/cslm/cslm.robotframework/tree/master/Test5)中。