用JUnit4进行单元测试

用Junit进行单元测试很方便,尤其是Junit4引入了很多Annotation注解以后。看测试的示例:

待测试类:

public class Calculator {

	public int add(int a, int b) {
		return a + b;
	}

	public int minus(int a, int b) {
		return a - b;
	}

	public int square(int n) {
        return n * n;
    }
	
	//Bug : 死循环
	public void squareRoot(int n) {
        for(; ;)
        	;
    }
	
	public int multiply(int a, int b) {
		return a * b;
	}

	public int divide(int a, int b) throws Exception {
		if (0 == b) {
			throw new Exception("除数不能为零");
		}
		return a / b;
	}
}

 

 单元测试类:

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class CalculatorTest {

	private Calculator cal = new Calculator();

	@BeforeClass // 注意,这里必须是static...因为方法将在类被装载的时候就被调用(那时候还没创建实例)
	public static void before()
	{
	    System.out.println("global");
	}

	@AfterClass
	public static void after() {
		System.out.println("global destroy");
	}

	@Before
	public void setUp() throws Exception {
		System.out.println("一个测试开始。。");
	}

	@After
	public void tearDown() throws Exception {
		System.out.println("一个测试结束");
	}

	@Test
	@Ignore
	public void testAdd() {
		int result = cal.add(1, 2);
		Assert.assertEquals(3, result);
	}

	@Test
	public void testMinus() {
		int result = cal.minus(5, 2);
		Assert.assertEquals(3, result);
	}

	@Test
	public void testMultiply() {
		int result = cal.multiply(4, 2);
		Assert.assertEquals(8, result);
	}

	@Test(timeout = 1000) // 单位为毫秒
	public void testSquareRoot() {
		cal.squareRoot(4);
	}

	@Test(expected = Exception.class)
	public void testDivide() throws Exception {
		System.out.println("teddd");
		cal.divide(4, 0);// 很简单的办法.......
	}

//	@Test
//	public void testDivide() {
//		int result = 0;
//		try {
//			result = cal.divide(10, 5);
//		} catch (Exception e) {
//			e.printStackTrace();
//			Assert.fail();// 如果这行没有执行。说明这部分正确。
//		}
//		Assert.assertEquals(2, result);
//	}
}

 在Eclipse里Run As -> JUnit Test,运行测试类,Eclipse的JUnit的View显示如:

        可以看到,CalculatorTest类中总共有5个测试用例,ignore了一个,3个测试用例通过,testSquareRoot测试不通过(因为超时),所以整个的测试结果飘红了。同时,控制台的输出结果为:

global
一个测试开始。。
一个测试结束
一个测试开始。。
一个测试结束
一个测试开始。。
一个测试结束
一个测试开始。。
teddd
一个测试结束
global destroy

各种注解的说明:

@Test:

表明该方法是一个测试方法

 

@BeforeClass 和 @AfterClass:

测试用例初始化时执行 @BeforeClass方法,当所有测试执行完毕之后,执行@AfterClass进行收尾工作。标注、@BeforeClass 和 @AfterClass的方法必须是static的,因为方法将在类被装载的时候就被调用,那时候还没创建测试对象实例。

 

@Before:
使用了该元数据的方法在每个测试方法执行之前都要执行一次。

@After:
使用了该元数据的方法在每个测试方法执行之后要执行一次。

 

@Test(expected=*.class) :
通过@Test元数据中的expected属性验证是否抛出期望的异常,expected属性的值是一个异常的类型,如果抛出了期望的异常,则测试通过,否则不通过。

 

@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,如果测试方法在制定的时间之内没有运行完,则测试也失败。

 

@Ignore:
该元数据标记的测试方法在测试中会被忽略。同时可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore("该方法还没有实现"),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

 

在test方法内除了使用Assert的assertEquals()方法外,还能使用assertFalse()、assertTrue()、assertNull()、assertNotNull()、assertSame()、assertNotSame()等断言函数。而且如果使用的是Junit4,结合Hamcrest,使用

assertThat([value], [matcher statement])方法可以实现更灵活的断言判断(前提是引入hamcrest的jar包)。

例如:

// is匹配符表明如果前面待测的object等于后面给出的object,则测试通过 

assertThat( testedObj, is( object) ); 

 

// containsString匹配符表明如果测试的字符串包含指定的子字符串则测试通过

 assertThat( testedString, containsString( "developerWorks" ) );

 

// greaterThan匹配符表明如果所测试的数值testedNumber大于16.0则测试通过

 assertThat( testedNumber, greaterThan(16.0) ); 

 

// closeTo匹配符表明如果所测试的浮点型数testedDouble在20.0±0.5范围之内则测试通过 

assertThat( testedDouble, closeTo( 20.0, 0.5 ) );

 

//hasItem匹配符表明被测的迭代对象含有元素element项则测试通过assertThat(iterableObject, hasItem (element));

 

更多更详细的Hamcrest提供的断言判断参考:

http://hi.baidu.com/shenhuanyu09/item/2bcfcb981aa3188e581461b4

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////分割线

 

       上面的Caculator待测试类里,现在我如果想给square方法多弄几个测试用例,按照上面的方法,我应该写好几个@Test方法来测试,或者每次测完再改一下输入的值和期望得到的值,好麻烦。JUnit提供如下的测试:

import java.util.Arrays;
import java.util.Collection;

import org.junit.Assert;
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 CalculatorTest2{

	private Calculator cal = new Calculator();
	private int param;
    private int result;

	//构造函数,对变量进行初始化
    //定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。
    public CalculatorTest2(int param, int result) {
           this.param = param;
           this.result = result;
    }
	
	@Parameters
    public static Collection data(){
        return Arrays.asList(new Object[][]{
            {2, 4},
            {0, 0},
            {-3, 9},
      });
    }

    @Test
    public void squareTest() {
    	int temp = cal.square(param);
        Assert.assertEquals(result, temp);
    }
}

 Eclipse里JUnit的运行结果显示为:

       测试通过了,CalculatorTest2类里的parameter是每次的测试输入,result就是测试的结果。所有的测试输入和期望结果都在@Parameters标注的data函数的返回的Collection集合里,2的期望得到的平方结果值是4,0期望得到0,-3期望得到9。

 

       把测试代码提交给JUnit框架后,框架如何来运行代码呢?答案就是——Runner。在JUnit中有很多个 Runner,他们负责调用测试代码,每一个Runner都有各自的特殊功能,要根据需要选择不同的Runner来运行测试代码。JUnit中有一个默认Runner,如果没有指定,那么系统自动使用默认 Runner来运行你的代码。这里参数化测试就没有再用默认的Runner了。

 

再看看打包测试测例子:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

/**
 * 大家可以看到,这个功能也需要使用一个特殊的Runner,
 * 因此我们需要向@RunWith标注传递一个参数Suite.class。
 * 同时,我们还需要另外一个标注@Suite.SuiteClasses,
 * 来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。
 * 有了这两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要,
 * 随便起一个类名,内容全部为空既可
 *
 */
@RunWith(Suite.class)
@Suite.SuiteClasses({ CalculatorTest.class, CalculatorTest2.class })
public class AllCalculatorTests {

}

       这个测试类包含了上面的CalculatorTest.class和CalculatorTest2.class里面所有的测试函数,它的目的就是进行打包所有的测试。

 

参考:

http://blog.youkuaiyun.com/zhuangxiu/article/details/6256893

http://blog.youkuaiyun.com/songyinan1989/article/details/7445921

http://www.jb51.net/article/15797.htm

http://jingbo2759.blog.163.com/blog/static/983753152009711103710146/

Junit4 单元测试 最近公司一直在鼓励写单元测试,故最近自己也整理了些比较常用的单元测试用法,在这里跟大家分享!以下便是我们经常写的一个测试类,那么其中的一些内容我们是否完全都理解呢,下面我来给大家介绍下:package com.lyancafe.csr.bo; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.tim 阅读详情

相关推荐

从“烧电路”到“软杀伤”:拆解高功率微波(HPM)让无人机失灵的三种物理效应

本文深度解析高功率微波(HPM)如何通过热效应、电磁效应和非线性效应三种物理机制使无人机失灵。从电子元件的热损伤到系统的电磁干扰,再到电路中的非线性破坏,HPM技术为反无人机系统提供了高效的非动能打击手段。文章还探讨了现代无人机的多层级防护策略与应对方案。

weixin_42531886的博客 253

Junit 4 Tutorials(Junit 4 系列教程) 二、Junit4 注解

Junit 4 annotations provide the basic functionality to write junit test. Basic Junit 4 annotations explained in this post are @BeforeClass, @AfterClass, @Before, @After and @Test. @BeforeClass annota

我的程序人生(亦山札记) 8227

华为昇腾910B3显卡实战:手把手教你部署DeepSeek 32B模型(含Bge-zh向量库配置)

本文详细介绍了在配备8张华为昇腾910B3显卡的服务器上,从零部署DeepSeek 32B大模型推理服务的完整实战方案。内容涵盖环境准备、模型配置、多卡负载分配,并集成了BGE中文向量模型与ChromaDB向量数据库,最终通过Open WebUI构建了可投入生产的企业级AI应用栈,为私有化大模型部署提供了具体参考。

weixin_29038345的博客 1710

Junit测试、反射

# 今日内容 1. Junit单元测试 2. 反射 3. 注解 ## Junit单元测试: * 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。 2. 白盒测试:需要写代码的。关注程序具体的执行流程。 * Junit使用:白盒测试 * ...

weixin_30800987的博客 185

保姆级教程:SAP ABAPer如何为VF01销售发票和MIRO发票校验配置凭证替代(含AC_DOCUMENT BADI完整代码示例)

本文详细解析了SAP ABAP中通过AC_DOCUMENT BADI实现VF01销售发票和MIRO发票校验的凭证替代技术。从技术选型到BADI实施步骤,再到核心逻辑代码示例,为ABAP开发者提供了一套完整的解决方案,帮助应对财务部门复杂的业务需求。

weixin_30421809的博客 354

AI原生应用在UGC内容审核中的实战经验

AI原生应用(AI-Native Application)——以机器学习模型为核心驱动力,深度整合数据、算法、工程架构的完整系统——为破解这一三角难题提供了全新范式。全链路数据驱动:从数据采集、模型训练到决策优化,形成闭环自治系统,无需人工规则干预多模态深度理解:同时处理文本、图像、音频、视频等多类型内容,理解语义而非简单匹配特征自适应进化能力:通过人机协同反馈持续学习新型违规模式,模型周级迭代成为常态审核效率提升300%:单条视频审核耗时从2.3秒降至0.7秒。

AI算力网络与通信的博客 1149

JUnit4 学习

JUnit4  是一个单元测试框架  在开发中也为我们少了不少的麻烦  如何合理的处理和建立JUnit的测试  就显得非常关键了 1.先要在工程引入的是JUnit4的包 2.建立一个JUnit4的测试类  就是在新建中找到  JUnit Test Case      起来后 我们可以进行 对我们要进行测试的类  进行测试了   有一句话  从一个前辈这里学到的 JUnit 只能证明的是

89lovelc 586

SAP入门技术分享四:模块化程序

SAP入门技术分享三:模块化程序

ITxiaoangzai的博客 1152

junit学习(二)——junit自动生成Test Method

上一篇中CalculateTest中的四个方法都是手敲的,要是方法比较少还好,要是比较多得敲到什么时候啊?下面说个半自动生成Test method的方法。 在MyEclipse的左侧视图中选中Calculate.java---->右击---->New---->Other....---->JUnit Test Case---->Next,然后就会弹出形如以下的图:...

总有一天,你的日积月累,会成为别人的望尘莫及 2324

一篇讲透:豆包、元宝、DeepSeek、Kimi、WorkBuddy,职场里到底怎么分工

这篇文章深入分析了当前主流AI工具(WorkBuddy、豆包、腾讯元宝、DeepSeek、Kimi)的特点和使用场景,帮助读者根据不同工作需求选择合适的AI助手。核心观点包括: AI工具各有所长:豆包适合快速创作初稿,元宝擅长信息检索整理,DeepSeek强于逻辑分析,Kimi专精文本处理,WorkBuddy则更适合任务推进和成果交付。 使用前需明确需求:是要创意发散、信息整理,还是任务执行?不同阶段应选用不同工具组合。 提供了6个具体职场场景的解决方案,包括文章创作、课程设计、会议纪要等,并给出详细的操作

weixin_39284145的博客 1万+

STM32入门教程:智能马桶盖控制

通过编写相应的代码,您可以根据需要实现其他功能,例如座圈温度调节和液晶显示屏显示等。初始化配置 首先,使用STM32CubeMX创建一个新的工程,并选择您所使用的STM32单片机型号。智能马桶盖是一种集成了多种功能的智能家居设备,通过控制芯片来实现自动冲水、座圈加热、座圈温度调节等功能。在本教程中,我们将使用STM32系列单片机来控制智能马桶盖的各个功能。以上代码演示了如何通过STM32的GPIO控制引脚来控制智能马桶盖的冲水和座圈加热功能。写代码 接下来,我们将通过编写代码来控制智能马桶盖的各个功能。

2401_85258012的博客 657

JUnit4单元测试入门详解

JUnit4单元测试入门详解 1.JUnit4概述: JUnit4主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先看一下在JUnit 3中我们是怎样写一个单元测试的。比如下面一个类: public class AddOperation { public int add(int x, int y){ return x + y

Mark 1851

掌握RDMA核心:从同步构建到异步事件的连接艺术

本文深入解析RDMA编程中的双模式设计,揭示同步配置与异步事件机制的协作关系。第一部分阐述同步函数rdma_bind_addr和rdma_listen的本地化角色,强调它们仅完成本地端点配置。第二部分剖析异步事件模型,重点分析连接请求和建立事件的处理流程。通过完整生命周期序列图展示两种模式的交互过程,并提供错误处理、资源管理和性能调优的实用建议。文章指出,理解同步本地配置与异步网络响应这一责任划分,是掌握RDMA编程的关键所在。

数字人生 283

Junit4单元测试

Junit4单元测试一、简介Junit4单元测试1.1 Junit1.2 单元测试1.3 Junit4单元测试好处1.4 测试覆盖及代码覆盖率二、使用Junit4单元测试(IDEA)2.1 配置2.2 新建test目录2.3 IDEA自动生成测试类三、测试类的编写(SSM)3.1 Dao类(Mapper类)3.2 Service类3.3 Controller类 一、简介Junit4单元测试 1.1...

ShootingStar_1998的博客 2849

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

本文绝大部分内容引自这篇文章:http://www.devx.com/Java/Article/31983/0/page/1我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的。但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数

华丽的痘痘 48万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android单元测试学习之 Junit4

assertArrayEquals([String message],expectedArray,resultArray) | 断言预期数组和结果数组相等,数组类型可能是int,short,long,byte,char,Object || assertSame([String message],java.lang.Object expected,java.lang.Object actual) | 断言两个对象引用相同的对象 || @Runwith | 放在测试类名之前,用来确定这个类怎么运行的。

2401_84240189的博客 1794

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

junit4单元测试总结

junit4单元测试总结 本文开发环境为myeclipse10.7 1.  准备工作 1.1. 选择需要单元测试的文件 创建maven工程,右击需要单元测试的文件,选择New->other,选择Junit Test Case; 1.2. 选择Junit 4 代码放到src/test/java 1.3. 选择单元测试函数 添加Junit 4 引用 1.4. 生成te

bejustice的专栏 1831

Junit4单元测试的使用

综上所述,基本Junit单元测试的使用就完成了,单元测试为我们项目开发中的一些不确定因素的解决提供了有效的帮助,如果能够利用好,将会提高我们的开发效率。创建好测试类以后我们还需要创建需要进行单元测试的方法,并且使用注解对这些方法进行响应的标注。在了解Junit单元测试常用注解的意义后,我们就可以进行单元测试。要使用单元测试,首先我们得在项目中导入Junit4的jar包。: 表示要进行单元测试的方法,且返回值必须为void。: 表示这个方法一定在单元测试方法之后执行。此时就为我们生成了一个测试类。

dasfsafadf的博客 1447

JUnit4单元测试以及简单实现

随着我们的项目深入,代码量也越来越多。这时如果出现BUG,面对成千上万行代码,一步一步调试效率实在低。所以理应在开发的过程中,每写出一个函数或方法,就当即测试该函数是否正确或者是否达到我们想要的效果。我们应当确保每一个函数都是正确的,需要对函数进行方方面面的测试,这样的测试我们就叫做单元测试。 JUnit是一个Java语言的单元测试框架。用于编写和运行可重复的测试。他是用于单元测试框架体系x...

Hy-Vincent的博客 3338

在IntelliJ IDEA中使用Junit4进行单元测试

最近在看java核心技术卷,看到“调试技巧”这一节的时候提到了JUnit这个单元测试框架激起了我的兴趣,所以花了点时间查找到了一些资料,也是略知一二了。特意在这记录一下:) 什么是单元测试? 单元测试(英語:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。在java里面的最想单元当然技术方法了,所以单元测试就是对方法的测试。(当然单元测试也可以说是对类的测试,关键看你如何“定义”单元) 使用步骤: 第一步: 安装Junit插件,按..

NEXTLJP的博客 1974

Java的单元测试(Junit4)

Java的单元测试(Junit4)1.概念2.单元测试的优点(为什么要使用单元测试)3.Junit特点4.断言(Assertion)4.1 断言的常见用法4.2 @Test4.3 异常测试4.3.1 @Test异常测试4.3.2 @Rule异常测试 前言:在软件构造学习以及代码实践中学会了使用Junit测试,Junit测试对代码的编写,测试与正确性检测有很大帮助。在此总结一下使用到的Junit相关知识。 1.概念 Java程序最小功能单元是方法,java单元测试就是针对单个java方法的测试。 Junit是

Arthurshinor的博客 806

单元测试之Junit4详解(真)

单元测试之Junit4详解(真) GitHub官网地址 文章目录单元测试之Junit4详解(真)@[toc]代码测试什么是单元测试**为什么要使用单元测试**Android中的测试注意Junit介绍使用导入依赖基本使用,断言方法测试套件参数化测试分类测试假设测试断言方法assertArrayEqualsassertEqualsassertNotEquals()assertNull()ass...

qq_43520650的博客 2206

使用Junit4进行单元测试

  Unit 是 Java 社区中知名度最高的单元测试工具。它诞生于 1997 年,由 Erich Gamma 和 Kent Beck 共同开发完成。其中 Erich Gamma 是经典著作《设计模式:可复用面向对象软件的基础》一书的作者之一,并在 Eclipse 中有很大的贡献;Kent Beck 则是一位极限编程(XP)方面的专家和先驱。   麻雀虽小,五脏俱全。JUnit 设计的...

anfenmo3398的博客 186
上一篇: Java中的ThreadLocal
下一篇: 应用Spring AOP(一)
micky2046
博客等级 码龄17年 1粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值