当前位置: 首页 > news >正文

Unit测试技巧:如何手动设置待测试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。还可以对其扩展,以便支持更多的类型。
源代码下载:
http://www.crackj2ee.com/Article/ShowArticle.asp?ArticleID=387

相关文章:

  • Nginx 和 OpenResty
  • 人有时候BT多了,会遭到报应的!这不,连MSN都看不下去了!
  • mac下redis 安装与使用
  • docker1
  • 在J2ME和WAP中实现电话呼叫功能
  • Linux系统如何更改主机名,即 [root@xxxx] 改成 [root@localhost]
  • 解决Netbeans和Eclipse中的图片路径问题
  • 安装docker-compose时报错Command python setup.py egg_info failed with error code 1 in /tmp/pip-build*的解决
  • 显示一个java跳转页面
  • ImportError: No module named 'ConfigParser' 降级处理即可pip install docker-compose==1.21.2
  • 给你的2D游戏添加3D效果
  • docker2 和docker-compose
  • docker3 docker-compose.yml 文件编写
  • nginx基础1
  • nginx1
  • ➹使用webpack配置多页面应用(MPA)
  • 2017前端实习生面试总结
  • CentOS 7 防火墙操作
  • Hibernate【inverse和cascade属性】知识要点
  • iOS小技巧之UIImagePickerController实现头像选择
  • Javascript弹出层-初探
  • MySQL QA
  • Promise面试题,控制异步流程
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Vue全家桶实现一个Web App
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 聊聊flink的TableFactory
  • 前嗅ForeSpider中数据浏览界面介绍
  • 算法系列——算法入门之递归分而治之思想的实现
  • 写给高年级小学生看的《Bash 指南》
  • 译米田引理
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • AI算硅基生命吗,为什么?
  • Python 之网络式编程
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • (20050108)又读《平凡的世界》
  • (Python) SOAP Web Service (HTTP POST)
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (转)平衡树
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)Linux 多线程条件变量同步
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Standard 的管理策略
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net面试题4
  • /bin/bash^M: bad interpreter: No such file or directory