JUnit

#软件应用# 0 0
JUnit是用于编写和运行Java程序单元测试的开源框架,由Kent Beck和Erich Gamma建立它提供了一组注解和断言方法,以及用于执行测试的测试运行器。其现逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个,被广泛应用在Java开发领域中,成为标准的单元测试框架之一。
  • 外文名称: JUnit
  • 创始人: Kent Beck,Erich Gamma
详细介绍 PROFILE +

基本介绍

JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。

JUnit是由Erich Gamma和Kent Beck编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

安装

安装很简单,先到以下地址下载一个最新的zip包:

下载完以后解压到你喜欢的目录下,假设是JUNIT_HOME,然后将JUNIT_HOME下的junit.jar包加到你的系统的CLASSPATH环境变量中,对于IDE环境,对于需要用到的junit的项目增加到lib中,其设置不同的IDE有不同的设置,这里不多讲。

测试

最简单的范例如下:

1、创建一个TestCase的子类

package junitfaq;

import java.util.*;

import junit.framework.*;

public class SimpleTest extends TestCase {

public SimpleTest(String name) {

super(name);

}

2、写一个测试方法断言期望的结果

public void testEmptyCollection(){

Collection collection = new ArrayList();

assertTrue(collection.isEmpty());

}

注意:JUnit推荐的做法是以test作为待测试的方法的开头,这样这些方法可以被自动找到并被测试。

3、写一个suite()方法,它会使用反射动态的创建一个包含所有的testXxxx方法的测试套件

public static Test suite() {

return new TestSuite(SimpleTest.class);

}

4、写一个main()方法以文本运行器的方式方便的运行测试

public static void main(String args[]) {

junit.textui.TestRunner.run(suite());

}

}

5、运行测试

以文本方式运行:

java junitfaq.SimpleTest

通过的测试结果是:

.

Time: 0

OK (1 tests)

Time上的小点表示测试个数,如果测试通过则显示OK。否则在小点的后边标上Fail,表示该测试失败。

每次的测试结果都应该是OK的,这样才能说明测试是成功的,如果不成功就要马上根据提示信息进行修正了。

如果JUnit报告了测试没有成功,它会区分失败(failures)和错误(errors)。失败是你的代码中的assert方法失败引起的;而错误则是代码异常引起的,例如ArrayIndexOutOfBoundsException。

以图形方式运行:

java junit.swingui.TestRunner junitfaq.SimpleTest

通过的测试结果在图形界面的绿色条部分。

以上是最简单的测试样例,在实际的测试中我们测试某个类的功能是常常需要执行一些共同的操作,完成以后需要销毁所占用的资源(例如网络连接、数据库连接,关闭打开的文件等),TestCase类给我们提供了setUp方法和tearDown方法,setUp方法的内容在测试你编写的TestCase子类的每个testXxxx方法之前都会运行,而tearDown方法的内容在每个testXxxx方法结束以后都会执行。这个既共享了初始化代码,又消除了各个测试代码之间可能产生的相互影响。

实践

不要认为压力大,就不写测试代码。相反编写测试代码会使你的压力逐渐减轻,因为通过编写测试代码,你对类的行为有了确切的认识。你会更快地编写出有效率地工作代码。

下面是一些具体的编写测试代码的技巧或较好的实践方法:

1.不要用TestCase的构造函数初始化Fixture,而要用setUp()和tearDown()方法。

2.不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。

3.避免编写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的回滚就可以了。

4.当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。

5.将测试代码和工作代码放在一起,一边同步编译和更新。(使用Ant中有支持junit的task.)

6.测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。

7.确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。

8.如果你编写的软件面向国际市场,编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。

9.尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。

10.测试要尽可能地小,执行速度快。

11.不要硬性规定数据文件的路径。

12.利用Junit的自动异常处理书写简洁的测试代码

事实上在Junit中使用try-catch来捕获异常是没有必要的,Junit会自动捕获异常。那些没有被捕获的异常就被当成错误处理。

13.充分利用Junit 的assert/fail方法

assertSame()用来测试两个引用是否指向同一个对象

assertEquals()用来测试两个对象是否相等

14.确保测试代码与时间无关

15.使用文档生成器做测试文档。

JUnit和ant结合

ant提供了两个target:junit和junitreport运行所有测试用例,并生成html格式的报表

具体操作如下:

1.将 junit.jar 放在 ANT_HOMElib 目录下

2.修改 build.xml,加入如下 内容:

-------------- One or more tests failed, check the report for detail... -----------------------------

运行这个target,ant会运行每个TestCase,在report目录下就有了很多TEST*.xml和一些网页打开report目录下的 index.html就可以看到很直观的测试运行报告,一目了然。

在Eclipse中开发、运行JUnit测试相当简单。因为Eclipse本身集成了JUnit相关组件,并对JUnit的运行提供了无缝的支持。

使用帮助

junit3.x

我们通常使用junit 3.8

(1)、使用junit3.x版本进行单元测试时,测试类必须要继承于TestCase父类;

(2)、测试方法需要遵循的原则:

A、public的

B、void的

C、无方法参数

D、方法名称必须以test开头

(3)、不同的Test Case之间一定要保持完全的独立性,不能有任何的关联。

(4)、我们要掌握好测试方法的顺序,不能依赖于测试方法自己的执行顺序。

demo:

public class TestMyNumber extends TestCase {

private MyNumber myNumber;

public TestMyNumber(String name) {

super(name);

}

// 在每个测试方法执行 [之前] 都会被调用

@Override

public void setUp() throws Exception {

// System.out.println("欢迎使用Junit进行单元测试…");

myNumber = new MyNumber();

}

// 在每个测试方法执行 [之后] 都会被调用

@Override

public void tearDown() throws Exception {

// System.out.println("Junit单元测试结束…");

}

public void testDivideByZero() {

Throwable te = null;

try {

myNumber.divide(6, 0);

Assert.fail("测试失败");

} catch (Exception e) {

e.printStackTrace();

te = e;

}

Assert.assertEquals(Exception.class, te.getClass());

Assert.assertEquals("除数不能为 0 ", te.getMessage());

}

}

junit4.x

(1)、使用junit4.x版本进行单元测试时,不用测试类继承TestCase父类,因为,junit4.x全面引入了Annotation来执行我们编写的测试。

(2)、junit4.x版本,引用了注解的方式,进行单元测试;

(3)、junit4.x版本我们常用的注解:

A、@Before 注解:与junit3.x中的setUp()方法功能一样,在每个测试方法之前执行;

B、@After 注解:与junit3.x中的tearDown()方法功能一样,在每个测试方法之后执行;

C、@BeforeClass 注解:在所有方法执行之前执行;

D、@AfterClass 注解:在所有方法执行之后执行;

E、@Test(timeout=xxx)注解:设置当前测试方法在一定时间内运行完,否则返回错误;

F、@Test(expected=Exception.class)注解:设置被测试的方法是否有异常抛出。抛出异常类型为:Exception.class;

G、@Ignore注解:注释掉一个测试方法或一个类,被注释的方法或类,不会被执行。

demo:

package com.an.junit;

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 TestMyNumber {

private MyNumber myNumber;

@BeforeClass

// 在所有方法执行之前执行

public static void globalInit() {

System.out.println("init all method...");

}

@AfterClass

// 在所有方法执行之后执行

public static void globalDestory() {

System.out.println("destory all method...");

}

@Before

// 在每个测试方法之前执行

public void setUp() {

System.out.println("start setUp method");

myNumber = new MyNumber();

}

@After

// 在每个测试方法之后执行

public void tearDown() {

System.out.println("end tearDown method");

}

@Test(timeout=600)// 设置限定测试方法的运行时间 如果超出则返回错误

public void testAdd() {

System.out.println("testAdd method");

int result = myNumber.add(2, 3);

assertEquals(5, result);

}

@Test

public void testSubtract() {

System.out.println("testSubtract method");

int result = myNumber.subtract(1, 2);

assertEquals(-1, result);

}

@Test

public void testMultiply() {

System.out.println("testMultiply method");

int result = myNumber.multiply(2, 3);

assertEquals(6, result);

}

@Test

public void testDivide() {

System.out.println("testDivide method");

int result = 0;

try {

result = myNumber.divide(6, 2);

} catch (Exception e) {

fail();

}

assertEquals(3, result);

}

@Test(expected = Exception.class)

public void testDivide2() throws Exception {

System.out.println("testDivide2 method");

myNumber.divide(6, 0);

fail("test Error");

}

public static void main(String[] args) {

}

}

特色功能

优点

另外junit是在极限编程和重构(refactor)中被极力推荐使用的工具,因为在实现自动单元测试的情况下可以大大的提高开发的效率,但是实际上编写测试代码也是需要耗费很多的时间和精力的,那么使用这个东西好处到底在哪里呢?笔者认为是这样的:

极限编程

要求在编写代码之前先写测试,这样可以强制你在写代码之前好好的思考代码(方法)的功能和逻辑,否则编写的代码很不稳定,那么你需要同时维护测试代码和实际代码,这个工作量就会大大增加。因此在极限编程中,基本过程是这样的:构思-> 编写测试代码-> 编写代码-> 测试,而且编写测试和编写代码都是增量式的,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。

重构

其好处和极限编程中是类似的,因为重构也是要求改一点测一点,减少回归错误造成的时间消耗。

其他情况

我们在开发的时候使用junit写一些适当的测试也是有必要的,因为一般我们也是需要编写测试的代码的,可能原来不是使用的junit,如果使用junit,而且针对接口(方法)编写测试代码会减少以后的维护工作,例如以后对方法内部的修改(这个就是相当于重构的工作了)。另外就是因为junit有断言功能,如果测试结果不通过会告诉我们哪个测试不通过,为什么,而如果是像以前的一般做法是写一些测试代码看其输出结果,然后再由自己来判断结果是否正确,使用junit的好处就是这个结果是否正确的判断是它来完成的,我们只需要看看它告诉我们结果是否正确就可以了,在一般情况下会大大提高效率。

特性

JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:

1、用于测试期望结果的断言(Assertion)

2、用于共享共同测试数据的测试工具

3、用于方便的组织和运行测试的测试套件

4、图形和文本的测试运行器

本百科词条由网站注册用户【 CN109625 】编辑上传提供,当前页面所展示的词条介绍涉及宣传内容属于注册用户个人编辑行为,网站不完全保证内容信息的准确性、真实性,也不代表本站立场。 版权声明 反馈 我要认领
相关知识文章
十大编程软件排行榜 编程开发工具大全 c语言编程软件有哪些
世界上主流的编程语言有C、Java、Python、C++、C#、Visual Basic、PHP等,针对这些编程语言,又有相对应的Visual C++、Visual Studio、Eclipse、Dev-C++、Notepad++、MyEclipse、JDK、Code::Blocks、Gcc、Sublime Text、IntelliJ IDEA、Ultraedit、C-Free等编程软件,被广泛运用,下面跟随maigoo网编辑一起了解下这些编程工具!
十大群发软件推荐 微信群发软件哪个好 群发短信软件有哪些
消息群发功能适用于旅游、教育、金融、邮政等各行各业,可发送节日祝福、天气变化、扣款/付款通知、催收、特价商品提醒等各种类型的信息。那么对个人用户而言,好用的微信群发软件、短信群发软件有哪些呢?下面maigoo小编为大家分享十大好用的群发软件,包括腾讯云短信、阿里云通信、中国移动云MAS、天翼云通信、263云通信、网易云信IM等等,一起来了解下吧
十大装修软件推荐 装修设计软件排名 装修软件app哪个好
近些年,各大小家装公司逐渐向数字化转型。随着行业内一线品牌齐家网在香港的上市,标志着互联网家装模式的成熟。如今线上家装领域中,土巴兔装修、酷家乐设计师、齐家、爱空间装修、好好住、住小帮、知户型等装修软件,已成为越来越多业主的选择,这些家装设计软件带来的一站式服务,让装修变得更省心。下面和maigoo编辑一起看看!
十大AI换脸软件排行 视频换脸软件哪个好 ai换脸工具推荐
在人工智能的大潮下,许多ai换脸软件纷纷进入市场,虽然存在隐私问题,但凭借独特的娱乐性,依旧掀起了一股换脸热潮,那么AI换脸软件有哪些?ai换脸工具哪个好?下面,maigoo编辑为大家分享十大AI换脸软件排行榜,包括DeepFaceLab、Faceswap、Openfaceswap、FakeAPP、Swapface、Remaker、Reface等热门换脸p图软件,一起来了解下吧。
国内十大聊天工具 国内聊天软件排行 聊天交友软件推荐
近五年来,我国移动社交用户规模持续增长,到2019年已有7.77亿人左右,同时,各类社交产品层出不穷,企图从中分一杯羹;那么时至今日,用户活跃度最高的聊天软件有哪些呢?微信、QQ、陌陌、钉钉、探探、Soul、积目、米聊等聊天工具市场占有率如何?下面跟随maigoo小编看看这些聊天交友软件!
七大去马赛克软件排行 视频去马赛克软件哪个好用 马赛克去除工具推荐
马赛克是使用频率最高、使用范围最广的一种图片/视频处理手段,涉及新闻、动漫、电影、连续剧、写真等方面。作为一种具备了数十年历史的处理技术,马赛克沿用到今天有什么破解方法呢?Maigoo小编为此盘点了一批去除马赛克的软件,其中有JavPlayer、Video Enhancer、DeepCreamPy、TecoGAN、Face Depixelizer、EnhanceNet等视频马赛克去除工具,一起看看!
十大室内设计软件 装修设计软件排名 家装设计软件哪个最好用
室内设计是一个专业性极强的领域,设计师要在安全、实用、有限预算的前提下,充分考虑空间、色彩、光影、装饰、陈设、绿化等要素进行设计。那么在当今室内设计领域,有哪些好用的装修设计软件呢?3DS MAX、AutoCAD、草图大师、Photoshop、ArchiCAD、Vray、Lightscape、Sweet Home 3D等室内设计软件如何?下面跟随买购网编辑一起看看!
十大国外社交软件app 国外聊天软件哪个最火 外国常用聊天app盘点
不同国家都有自己流行的社交软件,有的软件用户基数庞大,有的安全私密性更高,有的虽小众但使用体验好。那么,你知道国外用什么聊天软件吗?下面,maigoo小编就为大家盘点国外最火的十大聊天软件,包括WhatsApp、Facebook Messenger、Instagram Direct、iMessage、Skype、Telegram等,一起来了解下这些国外社交软件app吧。
十大跑分软件排行 电脑跑分软件哪个好 靠谱的电脑检测软件推荐
电脑跑分,即是利用软件对电脑硬件进行性能测试,分数越高,在一定程度上代表着性能越强。如今电脑配置各不相同,要想更准确的测试出性能如何,得先知道跑分软件哪个好,接下来请跟随maigoo小编一起看看3D Mark、鲁大师、AIDA64、PCMark、FurMark、GPU-Z、CPU-Z、Fritz Chess Benchmark、GeekBench等电脑跑分软件!
十大最好玩的bt游戏平台 bt游戏平台app排行榜 bt手游平台哪个好
bt游戏直译过来就是变态游戏,当然这并不是真的变态,而是在游戏玩法、充值等方面比普通游戏要特殊,例如充值比例更大、福利更多。在MaiGoo小编看来,现阶段相对热门的bt手游平台有咪噜游戏、梨子手游、八门神器、爪游控、3733游戏等。各平台运营情况请以官方实时调整为准!
十大体育直播软件 体育直播app哪个好 体育赛事直播app推荐
每年全球各大赛事不断,目前体育直播观看的软件有腾讯体育、央视体育、咪咕视频、爱奇艺体育、企鹅体育等(包括视频直播和文字直播)。买购小编要提醒大家的是,这些体育直播平台中,部分赛事直播是要收费,具体以官方实时调整为准,本榜单不具有唯一性。
十大好用的AI视频生成软件推荐 ai一键生成视频工具有哪些
在这个数字化时代,视频内容已成为吸引观众的最强大工具之一,随着AI技术的发展,用AI生成视频的工具越来越多,那ai一键生成视频工具有哪些比较好呢?Maigoo小编为大家带来了十大好用的AI视频生成软件推荐,如:Runway、Pika、Sora、Genmo、Stable video diffusion、Dream Machine、Pixverse等,一起来看看吧。
十大看短剧的软件 追短剧aap哪个好 好看的短剧app推荐
好看的短剧app有哪些?短剧行业不断发展,市场规模不断扩大,中国的短剧作品已出口至其它国家。本文中Maigoo小编带来了十款好用的短剧APP推荐,名列其中的有红果短剧、星芽短剧、爱奇艺随刻,以及河马剧场、ReelShort、DramaBox、ShortTV、GoodShort等。各app的运营情况请以实际为准,本文仅供参考。
十大多开分身app排行 分身软件哪个好用 应用分身软件推荐
应用分身软件可以让我们在手机上安装两个同样的app,并且不受限制的使用,满足我们的社交、工作和游戏需求。本文中Maigoo小编为大家整理了时下较热门的十大多开分身app,分别是小X分身、双开助手微分身版、悟空分身、分身大师、麻吉分身、无尽分身、微分身王、VMOS Pro等。这些多开软件你都用过吗,一起来了解下。
十大解压软件 解压缩软件哪个好用 文件压缩软件哪个好
在这个信息碎片化的时代,电脑上各种类型的文件数不胜数,一款好用的压缩软件,既能以较高质量集合保存个人信息,又能节省硬盘空间;纵观全网,备受推崇的解压缩软件有WinRAR、7-zip、2345好压、360压缩、Bandizip、快压、WinZip、PeaZip等,下面跟随MaiGoo网编辑了解下这些解压软件!
国外十大最火的短视频app推荐 外国人常用的短视频软件有哪些
在这个视频当道的时代,每个人的生活与各种短视频app紧密相连。本文中,买购网编辑就带大家看看国外短视频软件有哪些、国外短视频app哪个最火,例如TikTok、Likee、Instagram,以及Kwai、YouTube、Snapchat、Triller、Vmate、Mico等,都较具代表性。下面一起了解下这些国外短视频平台。
十大国产操作系统排行榜 最好用的国产操作系统推荐
科学技术是第一生产力。在21世纪,“技术独立”对一个国家的重要性不言而喻。那么,现阶段国产操作系统有哪些,国产电脑操作系统哪个相对较好?下面Maigoo编辑为大家分享十大国产操作系统排行榜,包括鸿蒙HarmonyOS、欧拉OpenEuler、中标麒麟NeoKylin、统信UOS、中科方德桌面操作系统、普华Linux、深度Deepin等等,一起来了解下吧。
十大手游模拟器排行榜 最好用的手游模拟器 手机游戏模拟器推荐
模拟器在手游行业中的地位越来越重要,早在2020年,我国模拟器用户数量就已突破1.3亿。那么好用的手游模拟器有哪些呢?下面maigoo小编为大家分享十大手游模拟器排行榜,包括腾讯手游助手、雷电模拟器、夜神模拟器、MuMu模拟器、逍遥模拟器、蓝叠模拟器等等等,都当下市场份额较高的手游模拟器,一起来了解下吧。
十大最好玩小程序游戏 微信小程序游戏排行 最火微信小游戏推荐
微信小程序游戏是一种轻量级的游戏应用,不仅开发成本低、访问便捷、占用手机空间少,还支持多种游戏类型。那么你知道时下最热门的微信小程序游戏有哪些吗?本篇文章Maigoo小编盘点了十大好玩的小程序游戏,包括寻道大千、咸鱼之王、元梦之星、这城有良田、欢乐斗地主、贪吃蛇大作战、怪物联萌等,一起来看看吧!
十大游戏陪玩软件排行 游戏陪练app哪个好 陪玩打游戏的软件
随着国内游戏陪玩市场的不断完善,各大游戏陪玩平台也在不断洗牌,那么当下最火的游戏陪玩软件有哪些呢?下面maiGoo小编为大家盘点十大游戏陪练app,包括斗鱼一起玩、小鹿组队、点点开黑、哈哈喵开黑、猎游、捞月狗等,一起来了解下吧。