Unit测试技巧:如何手动设置待测试Bean的属性

本文介绍了一款用于JUnit测试的辅助工具,该工具可以根据JavaBean的属性自动生成输入窗口,简化了编写测试用例的过程。测试人员可以手动设置Bean的属性,并指定期望的成功或失败结果。
在JUnit测试中,通常作为POJO的Java Bean都是一组简单的getter/setter方法,需要测试的不是这些Bean本身,而是对Bean的属性设置后,测试业务方法是否正常工作,例如,一个注册用户的类方法void register(Account account),需要对传入的Account Bean做初始化设置,然后,根据业务规则决定register方法是否应该执行成功或者抛出IllegalArgumentException。
倘若按照常规的Unit测试,需要考虑用户输入的许多种组合,在testXxx()方法中编写模拟用户输入的代码是冗长而繁琐的,不如直接通过Swing窗口手动设置Bean的属性,然后再执行业务方法,这样,虽然引入了输入界面,需要人工干预测试过程,却大大简化了编写测试用例的麻烦。
在TCK测试中,对许多UI组件的测试正是采用这种半自动的方法,因为只有测试人员本身才能看到UI测试的结果正确与否,计算机很难判断一个类似fillRect()的方法到底有没有在屏幕上正确绘制出来。
基于这种思想,为了测试许多种不同输入的组合,我们决定编写一个能根据Bean的属性自动生成输入窗口的小工具,以便在Unit测试过程中,能够由测试人员手动设定Bean的属性和期望的结果,然后,继续测试。
为了实现这个目的,我们设计了一个小工具,它能够实现:
1.根据传入的Bean自动为每个public setXxx()方法生成输入框;
2.由测试人员手动设置Bean的属性,然后,选择“Success”,“Failure”以决定这次测试的数据应该产生正确或错误的结果。
3.可以连续多次循环测试,直到测试人员点击“End”,结束本次测试。
整个工具被封装在一个BeanInputDialog类中,它继承自JFrame,只暴露了一个public static方法。下面,我们以一个Account Bean为例,测试用户输入的属性是否合法。
Account定义了4个字段和一个validate()方法来验证输入,如果不符合输入,validate()方法会抛出IllegalArgumentException。我们编写一个简单的TestCase:
package com.crackj2ee.test.util;
import junit.framework.TestCase;
public class AccountTest extends TestCase {
public void testAccount() {
int expect;
for(;;) {
Account account = new Account(); // 待测试的Bean
expect = BeanInputDialog.inputBean(account); // 用户在此输入
// 注意:直到用户输入完成,inputBean()方法才会返回,它是一个同步方法
// inputBean()方法返回一个int,表示本次测试的期望值
if(expect==BeanInputDialog.EXPECT_END) // 期望测试结束,退出循环
break;
if(expect==BeanInputDialog.EXPECT_SUCCESS) { // 期望测试成功
account.validate();
}
if(expect==BeanInputDialog.EXPECT_FAILURE) { // 期望测试失败
try {
account.validate();
fail("Not catch IllegalArgumentException!"); // 没有捕获到预期的异常
}
catch(IllegalArgumentException e) {
// OK!捕获到预期的异常
}
}
}
}
}
在Unit测试过程中,可以不断设置Bean的属性,以满足多种组合的测试用例。下面分别输入合法和非法的用户名,然后点击期望值测试:
需要注意的是,由于属性的获取是通过反射得到的,考虑到通常的设计原则,我们只读取public的setXxx()方法。
如果在测试人员输入前,Bean已经有了一些初始值,这个工具也能通过反射得到相应的getXxx()方法的值。要注意的是,对boolean和Boolean类型的属性,是根据getXxx()取得而不是根据isXxx()取得的。
目前,可以处理的属性类型包括java.lang.String,java.util.Date,short,int,long,float,double,boolean及其包装类型Short,Integer,Long,Float,Double和Boolean。还可以对其扩展,以便支持更多的类型。
源代码下载:
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值