结束篇:
Fitnesse是一个有着非常好的创意的软件。它试图拉近开发者与用户的距离。通过前面的介绍,大家可能也看出来了,其实最终还是要落实到编码(fixture)上。这些编码一般来说要由测试人员来写。那么就引发了我的一些思考:
一、有没有必要对每个需求都制定验收“表格”。如果这样做,就意味着要写非常非常多的fixture。写这些代码需要花费相当的时间,而时间是昂贵的成本。在能取得大体相同的效果时,有没有成本更少的办法?
二、这些代码本身是否存在bug,调试这些代码以及日后维护这些代码是否还要付出更多的成本?——我曾经很热衷于自动化测试工作的推进,但是后来我观察到,如果一段自动化测试代码写出来仅仅执行几次就完了,那么这种自动化我认为完全没有意义。
三、所以,我的观点是自动化只用在那些需要大量回归、功能固定、相对底层的测试上就好了,测试代码要尽量的简单;尽量不要增加复杂的逻辑;尽量通用以提高利用率;所花费的时间要尽量少。
基于以上理解,我这里给出一个通用的fixture和fitnesse表格,此表格在我公司主要用于接口测试,当然也可以用于一般性的页面检查。实际运行将近两年了,效果还可以。fitnesse内置的一些fixture应该有类似功能,但我觉得查找和学习使用的时间可能比自己写更长,就自己写了。
package calis.http; import org.apache.http.impl.client.*; import org.apache.http.client.methods.*; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; public class Exist { private String url=null; private String key=null; private String keys[]=null; private String reponseStr; private String result="NotExist"; public void setStartUrl(String url){ this.url=url; } public void setKeyWords(String s){ key=s; if(key.charAt(0)!='/'){ key="/"+key; } keys=key.split("/"); } public String verify(){ return result; } public void execute(){ DefaultHttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(url); try{ HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { reponseStr=EntityUtils.toString(entity,"UTF-8"); if(keys.length>1){ boolean judge=true; for(int i=1;i<keys.length;i++){ if(reponseStr.contains(keys[i])){ judge=judge&&true; }else judge=false; } if(judge){ result="ok"; } } } }catch(Exception e){ result="NoExist"; }finally{ httpclient.getConnectionManager().shutdown(); } } public void reset(){ result="NoExist"; } }
表格是这样的:
calis.http.Exist |
||
start url |
key words |
verify? |
http://cn.bing.com/search?q=%E4%B8%AD%E5%9B%BD |
中国/中华人民共和国 |
ok |
http://www.126.com |
邮箱帐号登录/动态密码登录 |
ok |
…… |
…… |
ok |
使用也很简单,在start url输入地址,检查返回的字符串中是否全部包含了key words指定的字符串。每个字符串用/分隔。如果全部包含了返回ok,未全部包含返回NoExist。尽管很简单,但非常通用,可以用于检测一切支持REST请求而返回的html、xml、json等。
上述代码中已知的问题有:
1.对非utf-8格式的返回不支持
2.只支持“与”检查,不支持关键字的其他逻辑关系
3.未对html上的转义符做处理,比如在页面上显示为<,其实编码是<,那么需要检查<而不是<
4.未对start url做编码处理,比如有空格会导致异常。此时需要手工修改为%20等。
5.由于关键字是由/分隔,那么检测返回值中是否含有/是做不到的。
鉴于我一向坚持的观点——测试代码要尽量简单,我无意改进这些内容。