UnitTest系列文章:
使用DBUnit扩展JUnit:http://ray-yui.iteye.com/blog/1914979
使用EasyMock扩展Junithttp://ray-yui.iteye.com/blog/1916170
使用Cactus测试Servlethttp://ray-yui.iteye.com/blog/1917515
使用Spring TestContext测试Spring应用http://ray-yui.iteye.com/blog/1921424
使用Cobertura生成测试覆盖率报告http://ray-yui.iteye.com/blog/1921958
为何要编写单元测试?
企业开发当中,无论大小项目都离不开测试,包括单元测试,回归测试,性能测试等等等等,而单元测试就是来验证程序员写代码是否正确的有效手段,在日常开发当中编写单元测试是非常有必要的,试想一下若然正在开发一个庞大的项目,若然编写的每个业务逻辑都靠部署到服务器运行程序通过前台界面点击来进行测试的话,第一:效率非常低下,不自动化,第二:若然某一天某处加入了新代码出现了bug,查找出錯誤要費很大的功夫,所以笔者建议开发者要熟练的掌握单元测试的编写
什么是Junit?
Junit是java领域占有率非常高的一个单元测试框架,已几近成为了单元测试的标准,当然JUnit还存在一定的缺点,本文先从JUnit的简单使用开始
单元测试的编写原则:
1.在eclipse中创建1个source folder命名为test(使用Maven后已要求创建)
2.测试类所在的包要求和被测试类的包一致
3.测试类要使用Test作为开头或结尾,例如 --> UserServiceTest
4.测试类的每个方法,都必须是可以独立执行的,不存在顺序或依赖
JUnit3和JUnit4的区别:
JUnit3中,测试类都需要继承TestCase,而且测试类需要使用testXXX来作为开头,若然希望在测试方法前运行某个初始化方法,这个方法的名称必须是setUp,在测试方法后运行某个方法名称必须是tearDown
在JUnit4中不需要继承TestCase,而是使用了更为方便的annotation,只需要使用@Test来表示,测试前初始化方法使用@Before,测试后释放资源方法使用@After,若只想该方法只执行一次,使用@BeforeClass和@AfterClass
JUnit使用:
由于JUnit3和JUnit4的区别较为明显,所以笔者这里使用JUnit4进行讲解
package com.accentrix.ray;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/*
* 测试类最基本的格式
*/
public class TestUser {
@BeforeClass
public static void init() {
/*
* 此方法只会在运行所有单元测试前执行一次,
* 通常用來获取数据库连接,Spring管理的Bean等等
*/
}
@Before
public void setUp() {
/*
* 此方法运行每个单元测试前都会执行,
* 通常用来准备数据或获取单元测试依赖的数据或对象
*/
}
@Test
public void testAddUser() {
/*
* 测试类的主要方法,在这里写所有的测试业务逻辑
*/
}
@Test(expected = Exception.class)
public void testDleteUser() {
/*
* 请注意注解上的experced,使用该参数代表可以认为
* 这个单元测试方法会抛出Exception的异常,若然没有视为不通过
*/
}
@Test(timeout = 1000)
public void testUpdateUser() {
/*
* 请注意注解上的timeout,使用该参数代表该单元测试需要
* 在1000毫秒内完成,否则视为不通过,可以用做简单的性能测试
*/
}
@After
public void tearDown() {
/*
* 此方法运行每个单元测试后都会执行,
* 主要用来和setUp对应,清理获取的资源
*/
}
@AfterClass
public static void destroy() {
/*
* 此方法会在运行所有单元测试后执行一次,
* 通常用来释放资源,例如数据库连接,IO流等等
*/
}
}
通过上面的代码了解到JUnit单元测试类的基本格式,但所有test的方法体都为空,下面就来看以下如何判断测试类是否成功并正确,通过断言(Assert)的方式判断测试是否通过
package com.accentrix.ray;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
//静态导入
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class TestUser {
private Map<Integer, User> userMap = new HashMap<Integer, User>();
// 添加10個用戶
@Before
public void setUp() {
for (int i = 0; i < 10; i++) {
userMap.put(i, new User(i, "123", "456"));
}
}
@Test
public void testGetUser() {
User user = userMap.get(1);
// 判断用户是否为空
// assertNull代表user必須为null才通过测试,第一個参数为提示信息
assertNull("get user is null", user);
// 判断用户是否不为空
// assertNotNull代表user必须不为null才通过参数
assertNotNull("get user is not null", user);
// 判断用户名是否和输入一致
// 第一个参数为提示信息,第二个参数为实际的值,第三个参数为期望的值
String newUsername = "admin";
assertEquals("用戶名不匹配", newUsername, user.getUsername());
// 判断给定用户名是否包含在所有用户当中
// 若然包含,測試通過
Integer userId = 1;
assertTrue("用戶ID是否包含在其中", userMap.containsKey(userId));
}
// 清空用戶
@After
public void tearDown() {
userMap.clear();
}
}
在开发当中,通常是定义了真实的业务类,然后再创建我们的测试类,当然测试驱动开发例外,这里不多叙述,当我们定义了多个测试方法,但还没提供实现时,可以选择用以下方式来提醒或保证还存在没实现的方法
package com.accentrix.ray;
import static org.junit.Assert.fail;
import org.junit.Ignore;
import org.junit.Test;
package com.accentrix.ray;
import static org.junit.Assert.fail;
import org.junit.Ignore;
import org.junit.Test;
public class TestUser {
@Test
@Ignore
public void testAddUser() {
//添加@Ignore后該方法將被忽略而不去执行
}
@Test
public void testGetUser() {
//当运行测试时会提示该方法还没实现
fail("该方法暂时没提供实现");
}
}
运行结果如上图
如何运行多个单元测试?
从上图可以看到,在运行单元测试的时候都是一个单元测试类这样来运行的,但项目当中可能存在上百个测试类的时候,每次要手动一个一个单元测试的运行简直就是噩梦,以下我们来看一下如何集中运行所有的单元测试
首先创建1个Junit Test Suite,如下图
该类会生成以下的代码
package com.accentrix.ray;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({ TestUser.class })
public class AllTests {
/*
* @RunWith代表是運行Suite的类,固定写法
* @SuiteClasses中接受一个数组,里面为你需要
* 集中运行的测试类的class,以上代码为自动生成
* 当然读者可以通过Maven來运行单元测试,这里不过多叙述
*/
}
总结:
笔者在开发项目的过程当中,其实非常想保持编写JUnit的习惯,但由于项目的规模和时间的不允许,很多情况下都没有编写单元测试,但编写单元测试的益处是非常能体现出来的,若然是较大型的项目,单元测试时非常非常必要,所以建议读者允许的情况下,尽量使用单元测试来测试业务逻辑,当然Junit的能力也是有限的,例如需要结合其他的框架才能达到数据现场的维护和调试Servlet,关于结合其他框架优化JUnit请留意笔者更多文章
分享到:
相关推荐
这篇博客“JUnit学习笔记”可能是博主GreatJone在深入学习JUnit过程中所做的记录和总结,包括了JUnit的基本概念、核心组件、使用方法以及一些高级特性。 首先,JUnit的核心理念是基于断言的测试,即编写特定的测试...
Junit学习笔记,希望有用~~~~~~~~~~~~~~~~~~~~~~
本篇笔记将带你进入JUnit与NetBeans的结合使用世界,让你在NetBeans中更高效地进行单元测试。 首先,我们需要安装JUnit库到NetBeans。在NetBeans中,打开“工具”菜单,选择“库”,然后点击“新建库”。在弹出的...
总之,这个学习资源将带你深入理解JUnit的基本概念和高级特性,通过阅读`JUnit学习笔记.txt`并动手实践其中的示例,你将能熟练掌握如何利用JUnit3和JUnit4进行有效的单元测试,从而提升代码质量和项目稳定性。
这个“Junit学习.rar”压缩包显然包含了关于JUnit从3.8到4.9版本的学习资料,包括可能的操作手册、教程文档以及个人的学习笔记。以下是基于这些资源可能涵盖的一些关键知识点: 1. **JUnit基础知识**:了解JUnit的...
现在的版本都4.3.1,3.8.1的感觉好象不好找,虽然www.junit.org能够找到,但对我们这种英语不好的来说,还是不好找,再说了,现在好多的教程都是以3.8.1来写的,所以在这里把我找到的3.8.1传上来供大家以后下载 博文链接:...
《Junit 4.0 学习笔记》 JUnit 是一个广泛使用的Java编程语言的单元测试框架,尤其在敏捷开发和持续集成环境中扮演着至关重要的角色。本文将深入探讨JUnit 4.0版本的主要特性、核心概念以及如何有效利用它进行单元...
法在每个测试方法执行之后都要执行一次,相当于 JUnit3 中的 tearDown 方法,用于清理测试环境。@Test:这是 JUnit4 中的核心元数据,用于标记测试方法。当 JUnit4 运行测试时,会查找所有带有 @Test 注解的方法,并...
"Junit良葛格学习笔记"很可能包含了一系列关于如何有效利用JUnit进行测试的教程和示例。下面将详细阐述JUnit的核心概念、功能以及在实际开发中的应用。 1. **JUnit简介**: JUnit是由Ernst Leiss和Kent Beck开发的...
在“北京圣思园 junit 全套笔记及源码”中,你将深入学习 JUnit 的各种功能和最佳实践。以下是一些关键知识点: 1. **安装与配置**:首先,你需要了解如何在你的开发环境中安装 JUnit,通常是通过 Maven 或 Gradle ...
### JUnit4学习笔记——入门篇 #### 一、配置MyEclipse在项目中引入JUnit4.jar包 在使用JUnit4进行单元测试之前,首先需要确保开发环境已正确配置JUnit库。对于使用MyEclipse IDE的开发者来说,可以通过以下步骤...
通过学习和实践这些基本知识,你将能够熟练运用JUnit进行单元测试,提升代码质量和开发效率。在阅读提供的"笔记_JUnit.docx"文档时,你会找到更详细的信息,包括具体示例和进阶话题,帮助你深入理解JUnit的使用。
林信良学习笔记(内容):ajax学习笔记,算法学习笔记,计算机图形学,C++学习笔记,设计模式,Hibernate学习笔记,Java学习笔记,JSF,JSP/Servlet,JUnit,Spring,Struts等
第一部分:Junit精粹 第1章:带着你为一个简单的对象创建测试。在此过程中介绍了单元测试的好处,理念,和方法。 随着测试越来越复杂,我们把用junit创建更好的测试方案来展现。 第2章:进一步深入研究了Junit的...
JUnit知识点滴集合笔记,这个包里面包括了好几篇文档,一定会让你对JUNIT有一个全新的认识。 JUnit 4 抢先看.doc JUnit in java 真正的测试用例实战.doc JUnit起步.doc junit实现过程.doc JUnit中如何测试异常.doc ...
【Java学习笔记(源码)】是一份详细记录了Java编程语言学习过程的资源集合,包含实际的源代码示例。这份笔记旨在帮助初学者和有一定经验的开发者深入理解和掌握Java语言的核心概念、语法以及常见应用。以下是笔记中...