Junit4使用教程
来源:互联网 发布:在淘宝卖手机 编辑:程序博客网 时间:2024/06/08 04:33
Junit简介
JUnit is a simple framework to write repeatable tests. It is an instance of the xUnit architecture for unit testing frameworks.
Junit 是一个用于编写和运行可重复的测试的一个框架,它是用于单元测试框架体系xUnit的一个实例。
现已更新到 JUnit5 , 本篇文章中使用的是 JUnit4 的4.12 [2017-09-10] 版本。
JUnit 的特点:
提供了注释,以确定测试方法。
提供断言测试预期结果。
提供了测试运行的运行测试。
JUnit测试让您可以更快地编写代码,提高质量
JUnit是优雅简洁。
JUnit测试可以自动运行,检查自己的结果,并提供即时反馈。没有必要通过测试结果报告来手动梳理。
JUnit测试可以组织成测试套件包含测试案例,甚至其他测试套件。
Junit显示测试进度的,如果测试是没有问题条形是绿色的,测试失败则会变成红色。
什么是单元测试?
从名字上看,单元测试是为了测试某一个代码单元而写的测试代码。但是什么叫“一个代码单元”呢?是一个模块、还是一个类、还是一个方法(函数)呢?不同的人、不同的语言,都有不同的理解。一般的定义,尤其是是在OOP领域,是一个类的一个方法。在此,我们也这样理解:单元测试,是为了测试某一个类的某一个方法能否正常工作,而写的测试代码。
Junit4的使用
测试方法的组成
一般而言,一个测试方法主要包括以下三个部分:
- Init,即初始化操作,一般是新建需要测试的类的实例,并且设置一些前提条件,如数据库的连接。
- 执行操作,即调用你要测试的那个方法,并获取运行结果。
- 验证结果,验证结果是否和预期的一致。
相关注解
初始化操作相关 :
@Before
: 如果一个方法被@Before
修饰过了,那么在每个测试方法调用之前,这个方法都会得到调用。@After
: 修饰每个测试方法运行结束之后,会得到运行的方法。@BeforeClass
: 在跑一个测试类的所有测试方法之前,会执行一次被@BeforeClass
修饰的方法。一般用于初始化公共的资源,注意 只能修饰静态方法。@AfterClass
: 执行完所有测试方法之后,会执行一遍被@AfterClass
修饰的方法。一般用于释放公共的资源。与@BeforeClass
注解类似,只能修饰静态方法。
验证相关 :
JUnit为我们提供的验证结果的方法,多数都在 Assert 这个类里面,常用的有:
assertEquals(expected, actual)
:验证expected的值跟actual是一样的,如果是一样的话,测试通过,不然的话,测试失败。如果传入的是object,那么这里的对比用的是equals()。assertEquals(expected, actual, tolerance)
:这里传入的expected和actual是float或double类型的,大家知道计算机表示浮点型数据都有一定的偏差,所以哪怕理论上他们是相等的,但是用计算机表示出来则可能不是,所以这里运行传入一个偏差值。如果两个数的差异在这个偏差值之内,则测试通过,否者测试失败。assertTrue(boolean condition)
:验证contidion的值是true。assertFalse(boolean condition)
:验证contidion的值是false。assertNull(Object obj)
:验证obj的值是null。assertSame(expected, actual)
:验证expected和actual是同一个对象,即指向同一个对象。assertNotNull(Object obj)
:验证obj的值不是null。assertNotSame(expected, actual)
:验证expected和actual不是同一个对象,即指向不同的对象。fail()
:让测试方法失败。
注意:上面的每一个方法,都有一个重载的方法,可以在前面加一个String类型的参数,表示如果验证失败的话,将用这个字符串作为失败的结果报告。
JUnit的其他功能 :
@Ignore
: 忽略被修饰的测试方法。@Test(expected = IllegalArgumentException.class)
: 通过传入expected参数,验证抛出的异常是否符合期望。
实战 :
基本用法
被测试类 Calculate ,包含四个整形之间的简单的四则运算方法 :
public class Calculate { public int add(int a, int b) { return a + b; } public int subtract(int a, int b) { return a - b; } public int multiply(int a, int b) { return a * b; } public int divide(int a, int b){ if (b==0){ throw new IllegalArgumentException("Divisor should not be zero !"); } return a / b; }}
测试类 :
package cn.echo0.calculate;import org.junit.Assert;import org.junit.BeforeClass;import org.junit.Test;/** * Calculate Tester. * * @author Echo0 * @version 1.0 * @since <pre>Sep 19, 2017</pre> */public class CalculateTest { private static Calculate calculate; @BeforeClass public static void init() throws Exception { calculate = new Calculate(); } /** * Method: add(int a, int b) */ @Test public void testAdd() throws Exception { int result = calculate.add(719, 520); Assert.assertEquals(1239, result); } /** * Method: subtract(int a, int b) */ @Test public void testSubtract() throws Exception { int result = calculate.subtract(520,719); Assert.assertEquals(-199,result); } /** * Method: multiply(int a, int b) */ @Test public void testMultiply() throws Exception { int result = calculate.multiply(520,719); Assert.assertEquals("Result should be 520 !",520,result); } /** * Method: divide(int a, int b) */ @Test(expected = IllegalArgumentException.class ,timeout = 1) // 限定了期望抛出的异常,以及方法运行时间。 public void testDivide() throws Exception { int result = calculate.divide(520,0); }}
运行结果 :
测试套件的使用
测试套件用于同时运行多个测试类 。
使用步骤如下 :
- 使用
@RunWith(org.junit.runners.Suite.class)
修饰套件类 。 - 并使用
@Suite.SuiteClasses()
指定需要运行的测试类 。 - 还需要注意的是,套件类体必须为空 。
如 :
package cn.echo0.calculate;import org.junit.runner.RunWith;import org.junit.runners.Suite;@RunWith(org.junit.runners.Suite.class)@Suite.SuiteClasses({CalculateTest.class,CalculateTest1.class})public class MySuite {}
参数化设置
用于同时测试多组数据。
使用步骤如下:
- 使用
@RunWith(Parameterized.class)
更改测试运行器 - 声明变量来存放预期值与结果值
- 声明一个返回值为Collection的公共静态方法,并使用@Parameters进行修饰
- 为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
package cn.echo0.calculate;import org.junit.Assert;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.Parameterized;import java.util.Arrays;import java.util.Collection;@RunWith(Parameterized.class)public class ParameterTest { int expected; int input1 ; int input2 ; @Parameterized.Parameters public static Collection<Object[]> initTestData(){ return Arrays.asList(new Object[][]{ {2,1,1}, {3,4,-1} }); } public ParameterTest(int expected, int input1, int input2) { this.expected = expected; this.input1 = input1; this.input2 = input2; } @Test public void testAdd(){ Assert.assertEquals(expected,new Calculate().add(input1,input2)); }}
Idea Junit 插件
这里推荐 Idea 的一个用于生成Junit测试类的插件 :
JUnitGenerator V2.0,真心好用。
安装完成后,在需要生成测试类的类中 使用组合键 Alt + insert 调出 Generate 菜单,选择 JUnitTest 即可 :
最好更改一下测试类的存储路径 :
如,将其路径设置为src/test/java
(maven工程的默认测试目录),则填写的路径应该如下 :
${SOURCEPATH}/../../test/java/${PACKAGE}/${FILENAME}
总结
生命周期
对于Junit测试类 :
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass
对于每个测试方法 :
@Before -> @Test -> @After
注意事项
①测试方法上必须使用@Test进行修饰②测试方法必须使用public void 进行修饰,不能带任何的参数③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开④测试类所在的包名应该和被测试类所在的包名保持一致⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖⑥测试类使用Test作为类名的后缀(不是必须)⑦测试方法使用test作为方法名的前缀(不是必须)⑧不要在一个测试方法中使用多个断言
原文链接 : Junit4 使用教程
- Junit4.X使用教程
- Junit4使用教程
- Junit4使用教程
- JUnit4使用教程-快速入门
- JUnit4使用教程-快速入门
- JUnit4使用教程-快速入门
- JUnit4使用教程-快速入门
- JUnit4使用教程-快速入门
- JUnit4使用教程-快速入门
- JUnit4使用教程-快速入门
- JUnit4使用教程-快速入门
- JUnit4使用教程-快速入门
- Junit4教程
- Junit4教程
- Junit4教程
- JUnit4教程
- JUnit4教程
- junit4教程
- 《运营之光》-- 学习笔记(三)
- Java中String直接赋字符串和new String的区别
- 2.1嵌入式微处理器的结构和类型
- 正则表达式学习小结
- ajax
- Junit4使用教程
- [数据结构] 基本概念 PrintN函数实现
- 1.1 嵌入式系统的定义和组成
- Codeforces Round #435 A. Mahmoud and Ehab and the MEX
- 邮件系统搭建---邮件服务器Apache James Server 安装、将数据库改变为MySql
- 转载转载 非对称加密算法RSA http://snowolf.iteye.com/blog/379860
- YOLOv2—更改CelebA数据集的bbox [by zhangzexuan][17.9.24updated]
- ListView基本使用
- 2.3 线性表的链式存储结构(链表)