一写就是两篇,这个是我带新人时写的教程,没准还会有朋友需要,适合刚接触JUnit,想学单元测试的朋友。
Junit使用说明
Junit——Java代码进行单元测试的工具,单元测试是对完成的代码,通常以类为单元进行测试,一方面要求代码编写人员所编写的类可以以一个单元存在,能够进行测试,同时也将问题直接定位到类,便于发现问题,即使修正。
单元测试的好处还有很多,推崇者设置标榜TDD,先写单元测试,后编代码。相关这些话题,网络上有很多,不在这里关注。下面具体讲如何在Eclipse中使用单元测试,以一个项目为例(特别指出,单元测试真的很有用,原本为写这篇文档而写的单元测试就测出类的一个函数存在问题J),IDE以Eclipse 3.1为例,其他版本应该大同小异。
首先,你的workspase里应该至少有一个项目,就是你要测试的项目,当然可以有多个。如图1,新建一个Java Project。
图1
项目名任意取,推荐使用Test,点击下一步后,在Projects选项卡中点击,add按钮,如图2
图2
将弹出图3所示对话框,选择要被测试的项目进行关联,可以多选。
图3
点击确定后,建好项目。在项目中新建Junit Test Case,如图4
图4
在弹出的对话框中,关注class under test里的内容,填写要测试的类,如图5。
图5
接下来的对话框中,如图6,选择要测试的方法,所有开发的方法都要测试。
图6
这样一个测试类就写好了,省下的工作就是编写测试代码了。以一个Service类为例,每一个测试类都有两个方法setUp和 tearDown,这两个方法分别会在所有测试方法执行之前执行(setUp)和所有测试方法执行之后执行(tearDown),可以在里面编写一些初始化和销毁的操作。如:
private InReportService reportService;
protected void setUp() throws Exception
{
ApplicationContext ac =
new FileSystemXmlApplicationContext("src/spring-config.xml");
reportService = (InReportService)ac.getBean("historyReportService");
}
protected void tearDown() throws Exception
{
reportService = null;
}
下面的代码是测试类中某个方法的例子,是JUnit测试的关键,具体的编写要看进行单元测试人员的经验和能力了,好的测试方法可以尽可能的考虑到所有会出现问题的地方,测试出各种潜在问题。
public void testGetReport()
{
List orgList = new ArrayList();
orgList.add("02201996");
try
{
Report report = reportService.getReport("2020707029",
orgList);
Map paramMap = report.getParameter_map();
assertEquals(2, paramMap.size());
Iterator it = paramMap.keySet().iterator();
Parameter param = (Parameter)it.next();
assertEquals("机构", param.getParameter_name());
param = (Parameter)it.next();
assertEquals("币种", param.getParameter_name());
it = paramMap.values().iterator();
while(it.hasNext())
{
List list = (List)it.next();
Iterator itList = list.iterator();
while(itList.hasNext())
{
ParameterContent pc = (ParameterContent)itList.next();
System.out.println(pc.getvalue() + " " + pc.getName());
}
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
通常有两种方法,进行测试,上例中都有涉及,一是使用assertXXX方法,如assertEquals,assertNotNull,assertNotSame等,这在运行中会给出判断;另一种是输出想测试的内容,直接在运行时查看控制台,程序中下半部分就是这么做的,这样的内容直观,但是否和预期一样要人工检验,无法通过系统判别。
测试方法编写好后,右键选择类文件,Run as选择Junit Test,如图7,即可运行单元测试,IDE会给出结果。
图7
最后指出一点,单元测试对于代码重构十分有利,当重构代码后,只要单元测试可以通过,对改动的代码,就比较有信心。
项目中service包和util包中的类都要进行单元测试,只要service单元测试通过,就可以认为dao包中的类都是满足要求的,无法涉及的就是action包中的类,因这些方法都需要request,response等参数,无法通过单元测试获得,(当然如果以后有机会接触Struts2就会发现这个问题已经得到解决),目前只有在集成测试中对action进行验证。