上海花千坊419论坛

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 】编辑上传提供,当前页面所展示的词条介绍涉及宣传内容属于注册用户个人编辑行为,网站不完全保证内容信息的准确性、真实性,也不代表本站立场。
相关知识文章
十大跑分软件排行 电脑跑分软件哪个好 靠谱的电脑检测软件推荐
电脑跑分,即是利用软件对电脑硬件进行性能测试,分数越高,在一定程度上代表着性能越强。如今电脑配置各不相同,要想更准确的测试出性能如何,得先知道跑分软件哪个好,接下来请跟随maigoo小编一起看看3D Mark、鲁大师、AIDA64、PCMark、FurMark、GPU-Z、CPU-Z、象棋、GeekBench等电脑跑分软件!
十大看图软件 看图软件排行榜 看图软件哪个好用
看图软件什么最好?一款看图软件的实用性如何,得看它的图片打开速度、功能数量、支持格式;现在看图软件越来越多,但实际体验差异明显;MAIGOO网编辑就此,为大家筛选了一批好用的看图软件,其中有ACDSee、2345看图王、美图看看、Honeyview、Google Picasa、XNview、ImageGlass、光影看图、Irfanview等,你用过多少?
十大动画制作软件 动漫制作软件盘点 自己做动画的软件有哪些
动画制作分为二维动画与三维动画技术,涉及软件主要分为2D和3D二种类型。在动画行业中制作动画的软件种类越来越多,越来越丰富,你知道哪个动画制作软件比较好用?画动漫软件哪个好?下面MAIGOO小编就为大家介绍十大最好用动画制作软件,分别有Maya、Adobe Animate、3DS Max、AE、C4D、Blender、万彩动画大师、Houdini、TVP、Anime Studio Pro。
十大好用的手机克隆APP 一键换机助手排名 手机搬家软件哪个好
手机克隆是非常实用的一种手机数据搬家软件,能够将联系人、短信等个人信息,以及照片、音乐、视频等重要数据从旧手机一键导入新手机中。那么手机搬家软件哪个好用?一键换机软件有哪些?下面,买购小编为大家分享十大好用的手机克隆APP,包括华为手机克隆、欢太手机搬家、VIVO互传、小米换机、荣耀换机克隆等等,一起来了解一下吧。
九大刷机软件排行 手机刷机软件哪种好 安卓刷机软件哪个好
刷机分为卡刷和线刷,通过一定的技术手段,为手机重新写入系统;对许多刷机者而言,刷机就是玩机,享受不一样的使用体验,那么市场上的刷机软件哪种好?免费刷机软件有哪些?MAIgoo小编为大家筛选了一批手机刷机软件,其中有奇兔刷机、刷机大师、甜椒刷机助手、卓大师刷机专家、线刷宝、爱思助手、兔兔助手等!
七大分屏软件推荐 手机同屏多窗口软件 手机分屏软件哪个好
机分屏软件既能发挥大屏幕的多视角操作优势,又能免去后台应用来回切换的繁琐,一边打游戏一边聊天,足以让效率翻倍;maigoo编辑针对手机分屏技术,盘点了VMOS、多任务分屏、SkyOlin Helper、多屏任务插件、牛轧糖平行窗口、XHFW3、XMultiWindow等安卓分屏软件,一起来看看这些分屏软件的分屏效果如何!
十大建模软件排行榜 3d建模软件有哪些 3d制图软件哪个好
3d建模软件颠覆了传统的2D模式,在游戏、影视、建筑/室内设计、VR/AR、电商、工业设计、军工设计等多个重要领域有着广泛应用,并在一定程度上改变着行业的发展格局,那么在这种大环境下,相关从业者和爱好者有哪些3D制图软件可以使用?3DS MAX、Maya、Rhino、Blender、ZBrush、SketchUp等建模软件效果如何?下面跟随maigoo编辑来看看!
十大画图软件排行 绘图软件都有哪些 画画软件用什么好
近些年,我国绘图软件行业的自主软件品种不断增多,质量不断提升,于2019年达到2250亿元的市场规模,然而面对如今各行各业的需求,国产画图工具能否满足要求呢?国内外哪种制图软件最好用呢?下面跟随MAIgoo编辑一起了解下Photoshop、Illustrator、CorelDRAW、SAI、Visio、Origin、Painter、AutoCAD等热门画图软件!
十大好用的手机测速软件 wifi测速app哪个好 最准的测网速软件
手机测速软件可以帮助你了解当下的网络环境,同时也在一定程度上,体现了一款的手机的网络性能。那么,你知道手机测速用什么软件好吗?本文中,买购网编辑就带大家了解下Speedtest、花瓣测速、测网速UUSpeed,以及全球网测、网络万用表、安兔兔评测、泰尔网测等测速app。下面一起来看看。
十大好用的硬盘分区工具 硬盘分区软件哪个好 磁盘分区软件推荐
硬盘分区软件的作用,就是帮助我们划分硬盘的储存空间,以方便我们管理不同的文件、软件和其它数据。本文中,买购小编就带大家看看硬盘分区软件哪个好,例如傲梅分区助手、DiskGenius、MiniTool分区向导,以及Partition Magic、易我分区大师等电脑硬盘分区工具,都具有一定代表性。下面一起来了解下。
十大好用的电脑清理软件 磁盘清理软件哪个好 电脑垃圾清理软件推荐
在这个信息化时代,电脑已成为人们工作和生活的必备工具。然而软件越来越臃肿,电脑的内存空间也一次次告急。为了保持较好的使用体验,学会使用电脑垃圾清理软件是非常有必要的。那么,你知道现在市面上电脑清理软件哪个好用吗,下面跟随买购小编来了解下CCleaner、WizTree、Glary Utilities、360清理大师-Win10等应用。
十大专业显卡测试软件 显卡测试工具哪个好 显卡性能测试软件推荐
显卡是电脑上最重要的配置之一,其性能强弱影响着电脑综合性能的表现。本文中,买购网编辑就带大家看看日常测试显卡用什么软件。现阶段使用较为广泛的有3D Mark、Unigine Superposition、Furmark,以及GPU-Z、Heaven Benchmark、Geekbench 6、Fraps等。这些显卡测试工具你都用过吗?下面一起来了解下。
十大手机识图软件排行 拍照识图app哪个好用 识图搜图软件推荐
拍照识图软件可以帮助人们快速了解生活中的事物,例如查询植物、商品等;也可以帮助人们找到更高质量的同款图片。本文中MaiGoo小编将和大家看一份手机识图软件名单,其中有形色、百度App、Google Lens,以及万能识图、搜图神器、慧眼识图、搜狗识图等。下面一起来了解下这些识图app和网站。
十大数据分析必备软件 数据分析工具排名 好用的大数据分析软件
数据,可以帮助人们更好地理解事物本质,指导人们的决策。各行各业的发展,都需要大量数据的支撑。本文中,maiGOO小编就和大家一起看看数据分析工具软件有哪些,例如Power BI、Statistics Analysis System、Tableau,以及Mongo DB、Zoho Analytics等,都是较具代表性的大数据分析软件。这些软件你用过哪些,一起了解下。
十大好用的虚拟光驱软件 虚拟光驱工具有哪些 虚拟光驱软件推荐
虚拟光驱软件的作用,就是在电脑上模拟出一个光驱。这个光驱不能直接读取实体光盘,而是通过加载存放在硬盘里的光盘镜像文件来读取信息。本文中,买购小编将带领大家看看虚拟光驱工具有哪些、虚拟光驱软件哪个好,例如DAEMON Tools、Alcohol 120%、UltraISO软碟通、gBurner Virtual Drive等,都较具代表性,一起来了解下。
十大编程软件排行榜 编程开发工具大全 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小编为此盘点了一批去除马赛克的软件,其中有JavPlayer、Video Enhancer、DeepCreamPy、TecoGAN、Face Depixelizer、EnhanceNet等视频马赛克去除工具,一起看看!
十大AI换脸软件排行 视频换脸软件哪个好 ai换脸工具推荐
在人工智能的大潮下,许多ai换脸软件纷纷进入市场,虽然存在隐私问题,但凭借独特的娱乐性,依旧掀起了一股换脸热潮,那么AI换脸软件有哪些?ai换脸工具哪个好?下面,maigoo编辑为大家分享十大AI换脸软件排行榜,包括DeepFaceLab、Faceswap、Openfaceswap、FakeAPP、Swapface、Remaker、Reface等热门换脸p图软件,一起来了解下吧。
十大主流手机操作系统 手机系统性能排名 最好用的手机系统
最好用的手机系统是什么?操作系统是一个手机品牌从市场中脱颖而出的关键,它会直接影响到产品的性能和用户的体验。本文中,Maigoo小编立足全国手机市场,盘点了十大主流手机操作系统,名列前茅的有iOS、HarmonyOS、OriginOS,以及FlymeOS、ColorOS、HyperOS、MagicOS、realme UI、MyOS等。一起来详细了解下。
十大调色软件推荐 手机调色软件排行榜 配色软件app哪个最好
在互联网社交越来越发达的今天,各类拍照修图产品层出不穷,而伴随人脸识别、大数据等技术的成熟,修图软件App的功能亦更加完善,玩法更加多样。在这个社交看颜值的年代,Vsco、Snapseed、MIX滤镜大师、泼辣修图、黄油相机等手机调色软件也理所当然的受到了欢迎,那么这些照片调色软件有何独特之处,下面和maigoo小编一起看看!