HttpUnit的一些实践体会

1.编程式的web测试,可以把httpunit看作是firefox
2.可以用来做smoke test,最简单的做法就是遍历一遍所有的链接或点击一遍所有的按钮
3.用来检查行为而不是表现,比如你可以用httpunit来测试验证是否起作用,但不可以用眼验证按钮的名字是不是拼错了.(其实理解这点很容易,HttpUnit会整合到测试套件并会在每次构建后被自动执行,有点类似回归测试(测试新的改变会不会影响到原来的功能),如果像按钮名字错误这样的错误,是不会影响到系统运行的,改好了就是好了,没有什么其他的猫腻. 所以,如果为了这种错误来搞一大堆测试用例就只能用”闲的蛋疼”来形容了.
4.上面这种情况不是绝对的,如果你的项目不是企业应用,而是一个纯表现层的应用,你需要测试javascript或者css,也许htmlunit,jsunit会比较合适
5.批量的生成测试用例,通过一些数据feed来生成测试用例,这些数据可以是csv格式的数据映射 – 便于增加,扩展.
6.很多人还是很难接受HttpUnit,似乎人都有一种”认为自己的代码不会出错”或者”出错改好以后不大会再错”的倾向.(可能这就是乐观)
7.还有一种情况是”需求仍然有改动,我维护一套测试用例岂不是多了一重负担”. 呵呵,首先测试肯定是不可避免的,如果没有测试用例,你仍然要手动去测试当然如果你说这个QA的事,那就没办法了.而测试用例只是在需求改动后改一次而已,因为以后都是可重复的,可自动化的 – 这保证了同样原因的问题不会出现第二次.
8.根据实际的应用需求设计合适的测试用例也是很必要的,不需要OO,可以把测试用例看作一些批处理的操作
9.依赖数据的测试用例最好用一个独立的数据库,这不只是httpunit时候需要的了.我们用dbunit来初始化数据,非常灵活简单.但是准备这套用来测试的数据并且和测试用例同步也是很多人觉得”没意义”的事情.

httpUnit无法获取select框的选项值(options)

今天用httpunit写一个测试时候发现无法设置select框,报错是:
com.meterware.httpunit.IllegalParameterValueException: May not set parameter ‘userInfo.processingUnit’ to ‘BOM’. Value must be one of: { }
at com.meterware.httpunit.SelectionFormControl$Options.reportNoMatches(FormControl.java:1186)
at com.meterware.httpunit.SelectionFormControl$SingleSelectOptions.claimUniqueValues(FormControl.java:1360)
at com.meterware.httpunit.SelectionFormControl$Options.claimUniqueValues(FormControl.java:1178)
at com.meterware.httpunit.SelectionFormControl.claimUniqueValue(FormControl.java:1059)

跟进发现,webform无法通过getOptions来获取选择项.google后发现有人建议把页面中的

<html xmlns=”http://www.w3.org/1999/xhtml”>
改成
<html>

果然管用. 为什么会影响到httpunit? 指定上述的命名空间的意思是说这个html文档是遵守xhtml规范.通过下面的方法打开httpunit的解析详情 – httpunit会在得到html内容后告诉你这个文档是否遵守了你所指定的规范.(这里是xhtml).

HttpUnitOptions.setParserWarningsEnabled(true);

结果会得到这样的信息:
At line 121, column 1: Element <BODY> not closed properly.
At line 121, column 1: Element <HTML> not closed properly.
At line 1249, column 1: Element <BODY> not closed properly.
At line 1249, column 1: Element <HTML> not closed properly.
At line 1477, column 1: Element <BODY> not closed properly.
At line 1477, column 1: Element <HTML> not closed properly.

也就是输出的页面已经不是严格遵守xhtml的了.(推测是sitemesh的使用问题,没有很好的组织页面之间的关系依赖.),然后HttpUnit使用他的html解析器去查找select框的options时就出问题了. 为什么httpunit的作者不把具体原因给出来呢?