Junit使用教程
Junit是Java的单元测试工具,同时也是极限编程的好帮手。Junit4借助于Java5的Annotation(标注类)和静态导入的新特性,与Junit3有很大的区别,所以建议初学者直接使用Junit4。
构建项目
虽然Junit早已成为Eclipse的标配,但我还是习惯使用Maven构建项目,我使用Junit版本是4.11,构建的项目JunitDemo构架如下图:
在src/main/java我们新建一个计算器类(Calculator),以待测试,Calculator.java代码如下:
package net.oseye; public class Calculator {
/**
* 加法
* @param x
* @param y
* @return
*/
public int addition(int x,int y){
return x+y;
}
/**
* 减法
* @param x
* @param y
* @return
*/
public int subtraction(int x,int y){
return x-y;
}
/**
* 乘法
* @param x
* @param y
* @return
*/
public int multiplication(int x,int y){
return x*y;
}
}
添加测试类
使用Eclipse添加测试类也是非常方便的,在src/test/java右键->New->Junit Test Case,在对话框中填写名称和选择待测试类:
点击 Next,可以选择待测试的方法:
我们选择了addition方法,生成的测试类CalculatorTest.java代码:
package net.oseye; import static org.junit.Assert.*; import org.junit.Test; public class CalculatorTest { @Test
public void testAddition() {
fail("Not yet implemented");
}
}
生成默认的测试使用fail,所以运行总会是失败的。
运行测试
在CalculatorTest.java上右键(或Ctrl+F11),运行测试用例:
@Test
每个单元测试用例都会以@Test标注,而@Test有三种方式:断言测试、异常测试和超时测试。
- 断言测试:
package net.oseye; import static org.junit.Assert.*; import org.junit.Test; public class CalculatorTest { @Test
public void testAddition() {
Calculator c=new Calculator();
assertEquals(5, c.addition(2, 3));
}
}Junit有很多断言测试方法,如
void assertEquals(long expected, long actual)
实际值和期望值相同就pass,否则就fail。
- 异常测试
package net.oseye; import static org.junit.Assert.*; import org.junit.Test; public class CalculatorTest { @Test(expected=RuntimeException.class)
public void testAddition() {
Calculator c=new Calculator();
assertEquals(5, c.addition(2, 3));
}
}如果没有抛出异常或抛出不同的异常,则测试失败。
- 超时测试
package net.oseye; import static org.junit.Assert.*; import org.junit.Test; public class CalculatorTest { @Test(timeout=1000)
public void testAddition() {
Calculator c=new Calculator();
assertEquals(5, c.addition(2, 3));
}
}timeout单位是毫秒,示例表示如果运行测试用例超过1000毫秒就失败。
@Before和@After
我上面的例子中测试方法中是要先New一个Calculator实例,如果成千上百个测试用例,我都要做一些重复准备资源代码,如New示例、I/O对文件,创建数据库连接等等,那是比较麻烦而且无意义。
Junit为我们提供了@Before和@After标注,每个测试方法执行前执行@Before标注的方法,每个测试方法执行后执行@After标注的方法,@After可以清理现场:
package net.oseye; import static org.junit.Assert.*; import org.junit.After;
import org.junit.Before;
import org.junit.Test; public class CalculatorTest {
private Calculator c=null; @Before
public void init(){
System.out.println("@Before");
c=new Calculator();
} @Test
public void testAddition() {
assertEquals(5, c.addition(2, 3));
}
@Test
public void testAddition2() {
assertEquals(8, c.addition(5, 3));
} @After
public void destroy(){
System.out.println("@After");
c=null;
}
}
运行结果:
@Before
@After
@Before
@After
示例的@After我只是销毁了c,其实这里意义不大,但比如要清理由于测试二导致的垃圾数据,就很有必要了。
@BeforeClass和@AfterClass
@Before和@After在每次执行测试方法时都会执行,这对于进行I/O操作等又比较耗资源,所以Junit又提供了@BeforeClass和@AfterClass标注,是在测试类之前和之后执行,@BeforeClass和@AfterClass必须是static类型的:
package net.oseye; import static org.junit.Assert.*; import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; public class CalculatorTest {
private static Calculator c=null; @BeforeClass
public static void init(){
System.out.println("@BeforeClass");
c=new Calculator();
} @Test
public void testAddition() {
assertEquals(5, c.addition(2, 3));
}
@Test
public void testAddition2() {
assertEquals(8, c.addition(5, 3));
} @AfterClass
public static void destroy(){
System.out.println("@AfterClass");
c=null;
}
}
输出:
@BeforeClass
@AfterClass
测试运行器Runner
这里先说下测试运行器,为后面的参数化测试和套件测试做个铺垫。
测试运行期Runner是JUnit中负责执行测试方法的类,JUnit为提供了默认的测试运行器,但是没有要求你必须使用默认运行器,因此你可以定制自己的测试运行器。
定制自己的测试运行器必须继承自abstract类org.junit.runner.Runner,然后使用@Runwith(定制的运行器.class)来指定测试使用自己的定制运行器,定制这部分可以自己尝试下,暂时不深入。
测试套件Suite
什么是测试套件?其实就是把各个测试组装在一起测试,JUnit4的测试套件反而没有JUnit3的测试套件直观,而是要使用定制的测试运行器和指定测试类,步骤是这样的:
- 创建一个空类作为测试套件的入口;
- 使用Suite运行器代替默认运行器;
- 将需要测试的类组成数组作为@SuiteClasses 的参数,以@SuiteClasses标注测试套件类;
注意:这个空类必须使用public 修饰符,而且存在public 的无参构造函数(类的默认构造函数即可)。
再添加一个测试类,用来测试减法CalculatorTest2.java:
package net.oseye; import static org.junit.Assert.*; import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test; public class CalculatorTest2 {
private static Calculator c=null; @BeforeClass
public static void init(){
System.out.println("@BeforeClass");
c=new Calculator();
} @Test
public void testSubtraction() {
assertEquals(7, c.subtraction(10, 3));
}
@Test
public void testSubtraction2() {
assertEquals(5, c.subtraction(20, 15));
} @AfterClass
public static void destroy(){
System.out.println("@AfterClass");
c=null;
}
}
生成的AllTests.java代码如下:
package net.oseye; import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class)
@SuiteClasses({ CalculatorTest.class, CalculatorTest2.class })
public class AllTests { }
Eclipse已经为你添加了标注,省了好多事。运行输出:
@BeforeClass
@AfterClass
@BeforeClass
@AfterClass
参数化测试
我们看到CalculatorTest测试类中用了两个测试用例2+3=5和5+3=8,但对于一个方法的测试可能有成千上百个测试用例,如果每个测试用例都要用一个测试方法的话那我们就惨了!
因此JUnit又为你准备了参数化测试方法,编码步骤:
- 对于测试类使用Parameterized运行器代替默认运行器;
- 创建一个静态(static)测试数据供给(feed)方法,其返回类型为Collection,并用@Parameter 注释以修饰;Collection就是输入参数和期望值;
- 通过构造函数把Collection的值传入测试类;
- 编写测试方法;
仍使用CalculatorTest测试类,代码如下:
package net.oseye; import static org.junit.Assert.*; import java.util.Arrays;
import java.util.Collection; import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class)
public class CalculatorTest {
private static Calculator c=null; private int expected;
private int x;
private int y;
public CalculatorTest(int expected,int x,int y){
this.expected=expected;
this.x=x;
this.y=y;
} @BeforeClass
public static void init(){
System.out.println("@BeforeClass");
c=new Calculator();
} @Test
public void testAddition() {
assertEquals(this.expected, c.addition(this.x, this.y));
} @AfterClass
public static void destroy(){
System.out.println("@AfterClass");
c=null;
} @Parameters
public static Collection<Object[]> data(){
return Arrays.asList(new Object[][]{
{5,2,3},
{11,8,3},
{12,8,4}
});
}
}
Junit使用教程的更多相关文章
- JUnit单元测试教程(翻译自Java Code Geeks)
JUnit单元测试教程--终极指南 JUnit单元测试教程终极指南 说明 单元测试简介 1 什么是单元测试 2 测试覆盖 3 Java中的单元测试 JUnit简介 1 使用Eclipse实现简单JUn ...
- Junit使用教程(三)
四.实例总结 1. 参数化测试 有时一个测试方法,不同的参数值会产生不同的结果,那么我们为了测试全面,会把多个参数值都写出来并一一断言测试,这样有时难免费时费力,这是我们便可以采用参数化测试来解决这个 ...
- [置顶] JUnit入门教程(二)
一:介绍 接着上次的课程,今天我们学习JUnit4的新特性 assertThat()方法,这种方式和其余的assert方法比起来,更加接进英语. 二:分析API API中的例子: 参数 T Actua ...
- Junit使用教程 转
几乎所有程序员都听说过Junit的大名,但不知真正懂得运用它的人有多少,我便是其中的一个小白. 知道Junit是用来测试的,但却把“宝刀”当成了“菜刀”用.为了从此不再菜鸟,特此总结整理了下Junit ...
- Junit使用教程(四)
一.会用Spring测试套件的好处 在开发基于Spring的应用时,如果你还直接使用Junit进行单元测试,那你就错过了Spring为我们所提供的饕餮大餐了.使用Junit直接进行单元测试有以下四大不 ...
- Junit使用教程(二)
二.核心——断言 断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过. 1. 断言核心方法 assertArrayEquals(expecteds, actua ...
- Junit使用教程(一)
几乎所有程序员都听说过Junit的大名,但不知真正懂得运用它的人有多少,我便是其中的一个小白. 知道Junit是用来测试的,但却把“宝刀”当成了“菜刀”用.为了从此不再菜鸟,特此总结整理了下Junit ...
- Junit入门教程
做开发的时候,完成一个接口.方法.函数或者功能等,需要测试,是否有bug,有逻辑错误.这里有两种方案测试 1. 在main中写测试方法 2. 使用开源框架,这里使用的junit main写测试方法优点 ...
- 使用 JUnit 进行单元测试 - 教程
tanyuanji@126.com 版本历史 JUnit 该教程主要讲解 JUnit 4.x 版本的使用,以及如何在Eclipse IDE 中如何使用JUnit 目录 tanyuanji@126. ...
随机推荐
- Android文件管理,实现全选,删除等操作
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 1.例中数据是读 ...
- 关于bootstrap的modal弹出层嵌套子Modal所引发的血案(转)
原文地址 http://blog.csdn.net/liuxiaogangqq/article/details/51821359 bootstrap的弹出层嵌套有一个问题 ,当子modal关闭时父的m ...
- Xcode 设置文件生成时的模板
1. 目的 设置 Xcode 生成的文件的格式,如姓名.公司等. 2. 步骤 2.1. 找到文件 step 1. 右键Xcode图标 step 2. 显示包内容 step 3. 找到目录 /Conte ...
- 在vue-cli项目中安装node-sass
1,使用save会在package.json中自动添加. ----npm install node-sass --save ----npm install sass-loader --save 2 ...
- 部署Sharding分片
这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群. MongoDB 的数据分块称为 ch ...
- 数据库设计的误区—>CHAR与VARCHAR
字符型字段是数据库表中最常见的字段,而字符型字段又分为定长和变长两种.一般来说,VARCHAR类型用于存储内容长度变化较大的数据,CHAR类型用于存储内容长度没有变化或变化不大的数据. 在数据的内部存 ...
- Pomelo的Filter
在pomelo中,filter分为before filter和after filter.在一个请求到达Handler被处理之前,可以经过多个before Filter组成的filter链进行一些前置处 ...
- Eclipse中TODO的分类,以及自动去除
Window-Preference-Java-Compiler-Task Tags; 这里面进行TaskTag标签的定义,默认支持FIXME.TODO.XXX三种:优先级高的在taskview中 会显 ...
- 通过spring实现javamail发送邮件功能
以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂度,也能更好的契合spring理念 首先 ...
- 报表学习总结(一)——ASP.NET 水晶报表(Crystal Reports)的简单使用
一.水晶报表简介 Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表.水晶报表是业内最专业.功能最强的报表系统,它除了强大的报表功能外.最大的优势是实现了与绝 ...