前一章我们谈到过,Web自动化离不开数据的初始化,否则无法控制页面的输出和结果的校验。那么如何操作DB呢?
Xebium的SLIM测试系统直接利用反射来做Unit Test,既然这样我们可以写自己的Class来调用DB,让Xebium当作单元测试的方式发现并识别我们类,初始化并调用方法,这样我们就可以和DB打交道。SLIM系统还提供不同类间通过变量来传递值,这样DB取到的值也可以当作网页输出值判断的依据,而不是用固化的定义值来判断,用例更为灵活多变。
以下我们用MySQL访问操作来具体说明,先列出具体的方法名称定义,代码实现我之后再放出。
public class MySQLDBUtil {
public MySQLDBUtil(String connectType, Map connectParam){} //初始化时定义连接类型和连接参数
public void setOperation(Map operation){} //传入DML或者DDL来操作数据
public String getReturn() {} //取得上述Operation的返回值
}
之前我们看到Xebium页面是以表格这种形式来调用Class的,但并没有提供相关的数据类型来定义每一格是什么类型,但在内部做了如下规范:
SLIM所有传入的数据类型只有3种:String类型;数值型(int或者double);Map类型(从界面上看,表现key和value这2个字段的表格)。由于系统自动识别,为了数值型的精度问题,从个人经验来说,不建议直接使用(int除外),而通过String类型在代码内部做处理。
MySQLDBUtil的初始化方法,如果公司内部使用,或者不想把DB连接的ip,端口,用户名和密码显式传入(不让其他用户知道),那么完全可以不需要任何参数。但结果是一旦有多个数据库要连,只能修改代码,作者用其他加密文件读入,都需要增加一定的代码量。对于测试人员来说,直接用最快最直接的解决问题,保证测试充分,该开放的开放,能自定义的地方就尽量支持自定义,不要固执于任何保密策略或其他的制度,:)。
setOperation这个方法,用Map是为了区分DML和DDL这2种SQL,从测试角度来说,DML会返回具体的值,DDL的返回值不容易判断正确性,用DML来判断DDL是测试常用的方法。另外,getReturn操作也依赖于setOperation方法。
getRetrun这个方法,可以获取Operation的结果集。 如果做过java操作MySQL的结果集处理的话,也很容易,但是问题在于Xebium的输出直接用String或者数值,(虽然也可以支持map类型输出,但界面需要自定义html格式,不推荐),所以像select语句尽量用select 字段名,而不是select *这种获取全部字段内容。
当代码完成后,打成jar包,放入Xebium的lib目录(其他目录也可以),最终页面调用即可。如下图:
保存后显示为:
如上图,点Test,show关键词用于把getReturn方法的返回显示出来。如果用“$result=”(result可以用其他英文字符也可以)来替换掉,执行结果就会放入$result中,之后在需要的地方用$result来引用值即可。这样DB和Web的自动化就可以联系起来。相对于selenium调用其它类来得方便,界面表示也简单易理解。
最后,我把MySQL源码贴出,其他DB,如Mongo,Oracle等,可以参照这个思路来做,具体代码实现留给大家来做了。
https://pan.baidu.com/s/1w5Jl7TfLST04XKUjbg3byQ
从测试角度来说,自己开发的套件目的达到即可,一般DB的操作只在于测试的初始化,测试过程的数据校验,便于当数据变化时,验证结果的灵活性。也就是说,如果一个用例可以做到在SetUp阶段初始化数据,导入db脚本,测试中间用db数据验证(就算其他过程对数据进行修改也不影响结果判断),在TearDown阶段,删除临时数据。这和做UnitTest思路也是一致的,一旦完成,可以免除大部分维护工作,才能感受到自动化的好处,相应的也能提升成就感;维护工作越多就越有挫败感,不值得提倡。