上篇我们开始用关键字驱动修改框架,定位了项目目录,还修改了测试文件,这篇我们继续修改测试过程。和数据驱动框架版本一样,测试过程的控制器还是TestRunner.java这个文件,而且也分测试准备、测试中、测试收尾,相似度可以说是90%了。但鉴于关键字驱动读取文件原理的不一样,所以唯一一点我们需要改的地方就是就是测试中这部分:
先回忆一下关键字驱动的特点:在测试文件中按顺序写测试步骤,然后在程序中罗列操作,扫描文件时根据步骤判断该执行哪个操作:
但是,上篇文章我们已经修改了测试文件,里面包含了login和logout两个generic functions,我们上一篇介绍关键字驱动时的条件判断中并没有包括generic functions,按理说我们应该把它们加进去。不过等等,现在我们只有两个generic functions,但随着test case越来越多未来还可能有很多很多个,问题是你真的要一个一个的加到条件判断里吗?这样的话会不会使得判断语句变得很长很长很长?
所以,这么做不太聪明,还得想别的办法。既然这些新的都是generic functions,那我就把它们全标成一类操作,如果我把上图中的switch-case语句变成if-else,那我是不是只需要多加一个else语句就行了?指的是只要扫描到文件中的generic function,就执行else:
再结合我们上篇修改的文件,是不是明白了点什么?以登录成功的test case为例,执行过程大体画张图就是这样:
图画得有点乱,别吓着。其实也没那么乱,带大家梳理一遍就清楚了。左边部分是条件语句,右边是涉及到的两个测试文件 - tcLogin1.xlsx和login.xlsx。执行过程如下:
第1步:程序开始执行时先扫描tcLogin1.xlsx,遇到的第一个关键是login,随即执行最后一个else语句;
第2步:通过else里的种种操作使得程序开始扫描login.xlsx,执行从Open Browser到Click Element之间的步骤;
第3步:返回tcLogin1.xlsx;
第4步:继续执行下一个关键字Verify Element Text;
第5步:执行关键字logout,再一次执行了最后一个else语句;
第6步:再一次通过else里的种种操作使得程序开始扫描login.xlsx,执行Click Element;
第7步:返回tcLogin1.xlsx;
第8步:执行最后一个关键字Verify Element Display,结束。
这样,虽然看起来是扫描了一个测试文件tcLogin1.xlsx,但其实是一环套一环,每次执行完generic function后都要回到原来的地方继续。明白了这些,我们开始写扫描文件中的测试步骤,这步是由Test.java完成。我给这个方法起个名叫stepThrough(),把测试文件作为参数传进去,然后把除最后一个else之外的条件语句都写好:
理解起来没什么难度,基本上就是关键字驱动这篇例子的翻版,我们先留着else里面不写。除此之外,因为测试数据有时不止一组,所以在扫描文件的测试步骤前还需先获取数据集,这步也放在Test.java里,方法叫getTestData():
有了数据源和测试步骤扫描,测试过程才完整。为了看起来方便我们再写一个叫executeTest()的方法把它们都放进来:
当然,page objects也不能落下。先不用管executeTest()里面接了四个参数,分别是driver,文件名,文件的sheet,以及module,也就是模块。前面三个好理解,为什么最后还要有个模块呢?先跳过这个问题,一会儿就明白了。很明显,executeTest()就是我们的测试过程,我们只需要在TestRunner.java中调用它就可以了:
现在还不能执行,别忘了,Test.java里边还有个else没写呢,应该写什么呢?再看一遍上面的执行流程,刚才说了,这个过程看起来是扫描了一个测试文件tcLogin1.xlsx,但其实是一环套一环,每次执行完generic function后都要回到原来的地方继续。你体会一下,不管是扫描一个测试文件,还是它的generic functions,执行方式感觉都是一样的,逐步递进,按步回归。这点像什么?是不是像我们之前介绍java时说的递归方法?所以,我们只需要在else语句中重复这个过程即可:
里面我设置了一个module参数,指的是访问哪个包含generic functions的文件。现在明白当初为什么要在测试文件上加一列module了吧?就是要作为参数传进这里边的。程序本身不难理解,把参数想成实际值带入一下就好了。
这就是把数据驱动框架改成关键字驱动框架的一个例子。还是那句话,框架的设计方式成千上万,你也可以设计自己喜欢的,只要解决问题就可以了。我个人感觉关键字驱动设计起来还是挺费事的,咱们现在程序简单,只测了登录功能,但随着其它功能的引入,很可能你会发现原来的测试文件需要添加其它信息,一个module已经不好使了。而且越来越复杂,一个人写起来很困难。所以,市面上有很多现成的以关键字为驱动的框架我们可以直接拿来用,不少还是开源的,你一看就知道不是一个人开发的,需要一整个团队。其中一个叫Robot Framework,很流行,我也写了简单的入门材料,大家有时间可以看一下。
这篇文章的源代码是SeleniumKeywordDrivenFramework项目。