借用http://blog.csdn.net/andycpp/article/details/1327147等文章上面的例子和教程进行学习总结,自己敲了一遍代码,发现里面有些东西,可能版本原因,已经稍微改了,不过原理还是相似的。

1、新建一个Maven Project,在pom.xml中添加JUnit4引用:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

2、新建一个实现加减乘除、平方、开方的计算器类,然后对这些功能进行单元测试,这个类故意保留了一些Bug用于演示。

package jlc;

public class Calculator {
// 静态变量,用于存储运行结果
private static int result; public void add(int n) {
result = result + n;
} public void substract(int n) {
// Bug: 正确的应该是 result =result-n
result = result - 1;
} public void multiply(int n) {
// 此方法尚未写好
} public void divide(int n) {
result = result / n;
} public void square(int n) {
result = n * n;
} public void squareRoot(int n) {
// Bug : 死循环
for (;;)
;
} public void clear() {
// 将结果清零
result = 0;
} public int getResult() {
return result;
}
}

3、默认情况下的测试
右键点击类Calculator弹出菜单,选择“New -> Other -> Junit -> JUnit Test Case”,默认下一步...生成一个包含空的

测试用例的类CalculatorTest,测试用例可以修改。
修改后如下:

package jlc;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner; //使用了系统默认的BlockJUnit4ClassRunner,可不用写
@RunWith(BlockJUnit4ClassRunner.class)
public class CalculatorTest { private static Calculator calculator = new Calculator(); //执行顺序:@BeforeClass,@Before,@Test,@After,@AfterClass //在本类加载前执行,只执行一次。注意有关键字:static
@BeforeClass
public static void testBeforeClass() {
System.out.println("public static void testBeforeClass()");
}
//在本类加载后执行,只执行一次。注意有关键字:static
@AfterClass
public static void testAfterClass() {
System.out.println("public static void testAfterClass()");
} //在任何一个测试方法执行之前执行,一个测试类只有一个@Before和@After
@Before
public void testBefore() {
System.out.println("public void testBefore()");
calculator.clear();
} //在任何一个测试执行方法之后执行
@After
public void testAfter() {
System.out.println("public void testAfter()");
} //表明这是一个测试方法,名字没限制,返回值必须是void,多个@Test不是顺序执行的
@Test
public void testAdd() {
System.out.println("开始求和...");
calculator.add(2);
calculator.add(3);
//判断期待结果和实际结果是否相等
assertEquals(5, calculator.getResult());
} @Test
public void testSubstract() {
System.out.println("开始相减...");
calculator.add(10);
calculator.substract(2);
assertEquals(8, calculator.getResult());
} @Ignore("忽略测试某些尚未完成的方法")
@Test
public void testMultiply() {
} @Test
public void testDivide() {
System.out.println("开始相除...");
calculator.add(8);
calculator.divide(2);
assertEquals(4, calculator.getResult());
} //限时测试,因为一些方法可能有死循环等情况
@Test(timeout = 1000 )
public void testSquareRoot() {
System.out.println("开始求平方根...");
calculator.squareRoot( 4 );
assertEquals( 2 , calculator.getResult());
} //异常测试
@Test(expected = ArithmeticException.class)
public void divideByZero() {
System.out.println("开始除0...");
calculator.divide(0);
}
}

一些说明(也可以看上面代码注释):
(1)JUnit运行时都是由一个runner运行的,可以根据需要选择不同的Runner来运行测试代码。指定一个Runner,需要使用

@RunWith标注,并且把所指定的Runner作为参数传递给它。系统自动使用默认Runner BlockJUnit4ClassRunner来运行代码。
(2)执行顺序:@BeforeClass,@Before,@Test,@After,@AfterClass

右键点击测试类CalculatorTest弹出菜单,选择“Run As -> JUnit Test”,运行结果的【JUnit】栏如下:


【Console】栏输出如下,可对照查看标注的执行顺序:

public static void testBeforeClass()
public void testBefore()
开始求和...
public void testAfter()
public void testBefore()
开始相减...
public void testAfter()
public void testBefore()
开始相除...
public void testAfter()
public void testBefore()
开始求平方根...
public void testAfter()
public void testBefore()
开始除0...
public void testAfter()
public static void testAfterClass()

4、参数化测试,写一个测试函数,把这若干种情况作为参数传递进去,一次性的完成测试。

首先,要为这种测试专门生成一个新的类,为这个类指定一个Runner,特殊的功能要用特殊的Runner:@RunWith(Parameterized.class)
第二,定义测试数据的集合,也就是上述的data()方法,该方法可以任意命名,但是必须使用@Parameters标注进行修饰。这是一个二维数组,每组数据产生一个测试Instance.
第三,构造函数,取得传过来的参数。
最后,用取得的参数做测试。

新建测试类ParameterizedTest:

package jlc;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;
import java.util.List; 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 ParameterizedTest {
private static Calculator calculator = new Calculator(); private int param;
private int result; @Parameters
public static List<Integer[]> data() {
return Arrays.asList(new Integer[][] { { 2, 4 }, { 0, 0 }, { -3, 9 }, });
} // 构造函数,对变量进行初始化
public ParameterizedTest(int param, int result) {
this.param = param;
this.result = result;
} @Test
public void square() {
calculator.square(param);
assertEquals(result, calculator.getResult()); }
}

测试结果如下,成功通过:

5、打包测试,一次把所有测试跑一遍。

这个功能也需要使用一个特殊的 Runner ,因此需要向 @RunWith 标注传递一个参数 Suite.class 。同时,还需要另外一个标注 @Suite.SuiteClasses ,来表明这个类是一个打包测试类,把需要打包的类作为参数传递给该标注就可以了。

新建测试类SuiteTest,

package jlc;

import org.junit.runner.RunWith;
import org.junit.runners.Suite; //用来执行分布在多个类中的测试用例
@RunWith(Suite.class)
@Suite.SuiteClasses({ CalculatorTest.class, ParameterizedTest.class })
public class SuiteTest { }

运行结果如下:

学习使用JUnit4进行单元测试的更多相关文章

  1. J2EE 第二阶段项目之JUnit4进行单元测试(五)

    今天学习了JUnit4进行单元测试.这样就可以不写页面直接进行过功能模块测试.也不是很深入的了解. JUnit4和自己写的代码可以分割开来. 首先呢准备两个jar包: 可以对mapper进行测试,当然 ...

  2. 在Eclipse中使用JUnit4进行单元测试(图文教程一)

    在Eclipse中使用JUnit4进行单元测试 单元测试,JUnit4. 这两个有什么关系呢?这就好比(草)单元测试和(割草机).用这个JUnit4工具去辅助我们进行测试.其实不理解这个也没关系,听多 ...

  3. 在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试(初级篇) 在Eclipse中使用JUnit4进行单元测试(中级篇) 在Eclipse中使用JUnit4进行单元测试(高级篇)

  4. 【Java】在Eclipse中使用JUnit4进行单元测试(初级篇)

    本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能 ...

  5. springMVC整合Junit4进行单元测试

    springMVC整合Junit4进行单元测试 标签: springMVC整合Junit4junit单元测试教程springMVC入门教程   spring(10)  版权声明:本文为博主原创文章,未 ...

  6. (转)用JUnit4进行单元测试

    场景:从开始写代码至今,对于单元测试一直没有重视,但是也厌倦了了程序中的额System.out和log日志输出.单元测试使我看到了在开发过程中的安全性和便捷性,所以下决心好好整理下. 有感而发——&l ...

  7. 在eclipse中使用JUnit4,以及使用JUnit4进行单元测试的技巧

    一 在eclipse中使用JUnit4 首先在工程上右键,选择属性,找到Java Builder Path,添加JUnit4的lib,如下图:   在要测试的类上右键新建 Junit test cas ...

  8. maven 学习---使用Maven运行单元测试

    要通过Maven运行单元测试,发出此命令: mvn test 这会在你的项目中运行整个单元测试. 案例学习 创建两个单元测试,并通过 Maven 的运行它.参见一个简单的 Java 测试类: pack ...

  9. Idea 使用 Junit4 进行单元测试

    目录 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安装 2. 编写测试代码 3. 生成测试类 4. 运行 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安 ...

随机推荐

  1. php高并发,大流量

    一般使用LVS+PHP集群(1000台),就算日均80亿次请求,每秒有10万并发,那分到每台机器的请求只有100个.只要你的PHP程序不是太差,100QPS总没问题吧? 而真正的瓶颈在于数据库和存储系 ...

  2. Maven的作用、用途、内涵、愿景

    maven被许多人认为是一个构建工具.许多人最初是从熟悉ant而转到maven的,因此很自然地这样认为maven是一个构建工具.但是maven并不仅仅是一个构建工具,也不是ant的一个替代工具.mav ...

  3. 文件、文件夹操作(I)

    遍历一个目录下的所有文件 首先我们获取用户文档目录路径 let manager = FileManager.default let urlForDocument = manager.urls(for: ...

  4. python 读csv文件时,在csv类型上执行类型转换

    csv 产生的数据都是字符串类型的,它不会做任何其他类型的转换.如果需要做这样的类型转换,必须自己手动去实现 import csv,re from collections import namedtu ...

  5. Gibbs Sampling深入理解

    二维Gibbs Sampling算法 Gibbs Sampling是高维概率分布的MCMC采样方法.二维场景下,状态(x, y)转移到(x’, y’),可以分为三种场景 (1)平行于y轴转移,如上图中 ...

  6. redis的优缺点和使用场景

    1. 使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,li ...

  7. jQuery实现无刷新切换主题皮肤功能

    主题皮肤切换功能在很多网站和系统中应用,用户可以根据此功能设置自己喜欢的主题颜色风格,增强了用户体验.本文将围绕如何使用jQuery实现点击无刷新切换主题皮肤功能. 查看演示DEMO:https:// ...

  8. Python建立多线程任务并获取每个线程返回值

    1.进程和线程 (1)进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.进程也可以派生新的进程来执行其他任务,不过每个新进程都拥有自己的内存和数据栈,所 ...

  9. git获取一个版本相对于另一个版本新增,修改,删除的文件

    git diff --name-status 00ef237ef0f0a4b8bd9609c2b6d570472028212d abf13b4d58abbb05a7d494cdc205d025978a ...

  10. netty集成ssl完整参考指南(含完整源码)

    虽然我们在内部rpc通信中使用的是基于认证和报文头加密的方式实现安全性,但是有些时候仍然需要使用SSL加密,可能是因为对接的三方系统需要,也可能是由于open的考虑.中午特地测了下netty下集成ss ...