上篇文章利用关键字驱动配合POM演示了一个登录案例,这篇我们把利用数据驱动制作的测试框架改写成用关键字驱动制作的。首先,请结合以前的讲解把数据驱动版测试框架搞清楚。不要怕麻烦,搞清楚后下边理解起来就方便多了。
和数据驱动版一样,关键字驱动版也涵盖登录(EmpLogin)、员工信息(Employee)、工时表(Timesheet)以及网上商城(OnlineStore)这四个模块。出于篇幅限制,我们只改写登录的部分,先回顾一下登录成功的测试用例:
1. 打开http://cslm-test.com/hrsystem/index.php;
2. 输入用户名"1001";
3. 输入密码"123";
3. 点击登录按钮(断言点:home按钮出现在home.php页);
4. 退出(断言点:登录按钮出现在index.php页)。
和数据驱动版一样,定位项目结构时也需要四个包(部分) - com.testalliance.hrsystem.managers(测试中枢层),com.testalliance.hrsystem.objrepository(object声明层),com.testalliance.hrsystem.pageobj(业务逻辑层),com.testalliance.hrsystem.test(功能/应用层)。出于一些细节上的变化,负责测试用例的com.testalliance.hrsystem.tests可以不需要,一会儿就明白了。
com.testalliance.hrsystem.objrepository包里需要包含employeePage.properties和loginPage.properties两个object文件,这点和数据驱动版的一样,不用修改:
com.testalliance.hrsystem.pageobj有一些变化。原先数据驱动版里是loginPage.java,负责登录模块的各种操作,但现在因为系统代码变化,我们可以直接写成Page.java,原因一会儿讨论:
com.testalliance.hrsystem.managers包里也一样,还是包含相同的三个java文件 - DriverManager.java,负责driver的声明;EnvManager.java,负责设置测试环境;TestRunner.java,负责测试框架入口:
com.testalliance.hrsystem.test也需要包含Test.java和Utility.java两个文件,负责功能/应用处理:
先来改Page.java。不管是哪个模块,需要的都是那几个操作,比如输入、点击、切换、刷新等等,所以我们直接把这些关键字都写到一起:
从第76行开始就是关键字操作。当然,我这里写得不全,其实操作还有很多,如果大家想到别的可以添在这里。
下一步是设计测试文件。关键字驱动与数据驱动的一个显著不同点就在于测试文件,关键字驱动是以操作为主体,并且步骤顺序必须与用例一致。那么对于第一个测试用例 - 登录成功,我们设计的文件应当是这样的:
创建文件之前再想一下,如果登录成功是这样的,那第二个用例 - 员工代号或密码错误导致登录失败应该怎么写?是不是这样:
你会发现这两个test case前5步都是一样的,是一个完整的登录操作,而且要知道,登录操作这5步在大多数的测试用例中都会出现,很多功能都要依靠登录作为第一步,如果每个用例的测试文件都重复前5步显然太麻烦了,干脆咱们就把这5步都提取出来,单独放在一个文件里。新建文件夹testdata.functions -> login.xlsx:
把sheet的名称定位login。我把测试网页的网址也写在了文件里,与代码完全分离开。与输入、点击、切换、刷新这种简单的操作不同,登录操作属于系统的功能操作,所以业内又管这些功能操作叫做generic functions,这也是我为什么给这个文件夹起名为testdata.functions。
同样,退出也是generic function,也经常会在测试用例中重复,所以我们也把它单独提取出来放到另一个sheet里,:
虽然就1步,但因为重复性高,也单独放。接下来把sheet的名字写到测试文件中,替换掉原来的步骤。对于登录成功用例:
我还加了一个叫Module的新列,先不用管它。对于失败用例:
而且你还发现有一个叫LoginDetails的sheet,专门可以放多种测试数据。比如登录失败有可能是员工代号错误,也有可能是密码错误,我们需要准备两组测试数据:
测试文件到此准备完毕,下篇我们修改测试步骤的执行过程。再强调一遍,如果是个generic function,而且重复的可能性高,你可以给它单独放到一个文件里,会省去很多麻烦。