本文章转载自 博主 _唛唛:https://blog.csdn.net/u012882327/article/details/72642351

JUnit自动化单元测试(一):生成测试类

第一步:导入Junit4包到项目中。
可以自己到网上下载junit4 jar包,也可以用JDE自带junit测试工具包。以Eclipse为例

第二步,创建测试类。
现有Calcuate类,要测试其加减乘除四个方法,在该类的包点击右键 new other… ,新建JUnit Test Case, 填好各参数下一步,选择要测试的函数完成。




第三步,生成测试类,可以开始测试了。
经过以上步骤,生成测试类如下:

此时我们可以选择JUnit Test工具运行一下:


发现全部方法都是错误,别急,这只是第一步,下面接着讲。


JUnit自动化单元测试(二):简单测试实例讲解

我们现在有了测试类TestCalcuate,默认是这样的

package junit.demo;
import static org.junit.Assert.*;
import org.junit.Test;
public class TestCalcuate {@Testpublic void testAdd() {fail("Not yet implemented");}@Testpublic void testSub() {fail("Not yet implemented");.....

首先注解@Test表示这个方法是需要JUnit测试的方法,fail()函数的意思是测试失败,这就是为什么初始的测试类进行测试每个都会失败,因为方法里面的内容需要由我们自己写。

现在我们简单写一个testAdd

package junit.demo;
import static org.junit.Assert.*;
import org.junit.Test;
public class TestCalcuate {@Testpublic void testAdd() {Calcuate calcuate = new Calcuate(); //新建对象实例int result = calcuate.add(2, 3);    //进行add操作assertEquals(5, result);            //通过断言assertEquals看上面得到的结果是不是期望的结果}@Testpublic void testSub() {fail("Not yet implemented");.....

很好理解,要测试add方法,先创建对象,然后进行add操作,最后通过assertEquals断言看看得到的结果是不是我们期望的结果,此时再运行JUnit Test会发现testAdd成功,表示这个方法测试成功,和我们期望的一样。

接下来我们写testSub,聪明的人会发现,每个测试方法都要创建对象,一点都不人性,于是,就有了@Before和@After注解,@Before表示每次测试都会先执行一次,一般用于初始化。@After表示每次测试后都会执行一次,一般用于断开IO连接等。

package junit.demo;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.Before;
public class TestCalcuate {Calcuate calcuate;   //全局变量@Before    //每次测试都会执行一次,一般用于初始化,一般取名为setUppublic void setUp() {calcuate=new Calcuate();}@Testpublic void testAdd() {int result = calcuate.add(2, 3);    //进行add操作assertEquals(5, result);            //通过断言assertEquals看上面得到的结果是不是期望的结果}@Testpublic void testSub() {assertEquals(3, calcuate.sub(5, 2));  }  .....

现在testAdd、testSub都已完成了测试,聪明的人又会发现,引用包的时候import static org.junit.Assert.*;是什么?意思是静态导入Assert,我们用到的fail和assertEquals都是Assert的静态方法,静态导入Assert之后,就不需要我们每次开头都写”Assert.”。


JUnit自动化单元测试(三):各常用注解和测试函数详细讲解

@Test:将一个方法修饰成一个可测试的方法;只有@Test修饰之后,这个方法才会被JUnit执行。

@Test(expected=XXException.class):表示这个方法一定会抛出某个异常;如果没有抛出该异常则测试失败。

    //测试代码@Test(expected = ArithmeticException.class)public void testDiv() {int result = calcuate.div(6, 0); // 除法中,除数为0,抛出ArithmeticException}

@Test((timeout=XX):表示这个方法执行的超时时间,单位毫秒;如果这个方法在规定时内还没结果,则测试失败。

  //测试代码@Test(timeout = 3000)public void testTimeout () {while (true) {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}

@Before:会在每一个测试方法被运行前执行一次;一般用于初始化测试数据。注意:有多少个@Test修饰的方法就会执行多少次。

@After:会在每一个测试方法运行后被执行一次;一般用于注销测试数据。注意:有多少个@Test修饰的方法就会执行多少次。

@BeforeClass:它会在所有的方法运行前执行,static修饰;一般用于测试需要读取文件数据时。注意:不管有多少个@Test修饰的方法只执行一次。

@AfterClass:它会在所有的方法运行结束后执行,static修饰;一般用于断开文件连接。注意:不管有多少个@Test修饰的方法只执行一次。

@Ignore:所修饰的测试方法会被测试运行器忽略;当方法还没写完时可用,写好之后删掉@Ignore即可开始测试。

 //测试代码@Ignore@Testpublic void testIgnore () {System.out.println("我会被忽略,不会执行");}

@RunWith:可以更改测试运行器 org.junit.runner.Runner;当需要多个或自定义的运行器时用,下一篇具体讲解。

注解大致是就这么多,此外还有一些常用的断言函数:

AssertEquals:断言两个结果相等;
AssertArrayEquals:断言两个数组相等;
AssertNotEquals:断言两个结果不相等;
AssertSame:判断两个对象是否为同一个,不同于equals这里是使用“==”判断;
AssertTrue:断言结果为真;
AssertFalse:断言结果为假;
AssertNull:断言结果为空;
AssertNotNull:断言结果不为空;
AssertThat:使用Matcher做自定义的校验;
如果想了解更多的测试函数,请自行查阅Assert API,这里就不详细说明了。


JUnit自动化单元测试(四):@RunWith测试套件运行器的使用

一些常用的测试方法前面已经说了,但有人又说了,JUnit为项目里每个类都创建一个对应的测试类,虽然一次能把类里面所有的方法都测试一遍,但是,我一个项目有可能有上千百个类,总不能每个类都点一下进行测试吧。
没错,@RunWith注解就是为了这种情况,我们先声明用套件运行器进行测试,然后把需要进行测试的所有类放进套件(集合)里面,一次就可以把所有类所有方法测试完,也叫打包测试。当我们没有声明的时候默认的则是JUnit自带的运行器,一次只能测试一个类。
见代码:

//这里有三个可以放到一起测试的类TaskTest1 、TaskTest2 、TaskTespackage junit.demo;
import org.junit.Test;
public class TaskTest1 {@Testpublic void test() {System.out.println("this is TaskTest1");}}package junit.demo;
import org.junit.Test;
public static class TaskTest2 {@Testpublic void test() {System.out.println("this is TaskTest2");}}package junit.demo;
import org.junit.Test;
public static class TaskTest3 {@Test{System.out.ppuntln("this is TaskTest3");}}们新建一个套件类,用套件运行器Suite
package junit.demo;
import org.junit.runner.RunWith;
import org.junit.runners.Suite.SuiteClasses;
import org.junit.runners.Suite;@RunWith(Suite.class) //声明套件运行器
@SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class}) //将需要一起测试的类放进来
public class SuiteTest {/* * 测试套件就是组织测试类一起运行的 * 写一个作为测试套件的入口类,这个类里不需要包含其他的方法 * 1.更改测试运行器Suite.class * 2.将要测试的类作为数组传入到Suite.SuiteClasses({}) */
}

接着,我们只测试SuiteTest 这一个类就可以看到全部测试类的测试结果了。
@RunWith最主要是声明测试的运行器,都在org.junit.runners.下面有声明,其他的一般用不到了,有兴趣的朋友可以共同探讨分享。


JUnit自动化单元测试(五):参数化测试

要成为JUnit测试高手必不可少的一项技能就是参数化测试了,现在有一个方法根据不同的参数会有不同的结果,为了测试全面如果把所有可能的情况都逐个写出来测试一遍那未免太low了,此时就可以用参数化测试,举个例子:

package junit.demo;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
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 ParametersTest {private int first;private int second;/* 构造函数需要的参数会自动从参数列表中依次取出 */public ParametersTest(int first, int second) {this.first = first;this.second = second;}/* 这里就是参数化测试的关键了* 通过@Parameters修饰表示该方法是为这次测试提供参数的,默认是构造函数的参数,以集合的形式传入。* name属性则是一个名字,稍后解释。* 当然最简单的方法就像这样写就行了 */@Parameters(name = "{index}: parm({0},{1})")public static List<Object[]> data() {return Arrays.asList(new Object[][] { { 2, 6 }, { 0, 100 }, { -3, 9 } });}@Testpublic void test() {assertEquals(second, doSome(first));}/* 假如这个就是我们要测试的方法:* 如果参数大于零,则返回参数*3;* 如果参数等于零,则返回100;* 如果参数小于零,则返回参数*-3   */private Object doSome(int first) {if (first > 0) {return first * 3;}if (first == 0) {return 100;}if (first < 0) {return first * -3;}return null;}
}

OK,这样测试一下会发现三个测试成功结果

没错,Parameterized.class参数运行器相当于把参数列表里面的数据一次取一组进行测试,通过构造函数实例化将参数放进测试中,我的demo里有三组数据,因此会有三个测试结果。
同时细心的朋友会发现,每个测试结果的显示名字… 没错,就是代码里面提到的参数配置name属性:”{index}”表示集合下标,“{0}”表示第一个参数值,“{1}”表示第二个参数值。很好理解吧。

至此,整个JUnit已经讲解了十分之八,最重要还是在实际运用过程中根据据需要进行单元测试,可能在实际开发中很少有公司会正规的进行单元测试,不过身为一个开发者,没有任何的借口阻挡我们不断学习进取的脚步。

JUnit自动化单元测试相关推荐

  1. 机器学习中qa测试_机器学习自动化单元测试平台

    机器学习自动化单元测试平台.零代码.全方位.自动化测试方法/函数的正确性和可用性. 原理 后端不需要写任何单元测试代码(逻辑代码.注解代码等全都不要), 这个工具会自动生成测试参数,并执行方法,拿到返 ...

  2. Karma和Jasmine自动化单元测试

    2019独角兽企业重金招聘Python工程师标准>>> 转自http://blog.fens.me/nodejs-karma-jasmine/ 前言 在Java领域,Apache, ...

  3. 几款好用的自动化单元测试框架和工具

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证,可以快速验证代码是否准确地实现了设计目的,帮助提高代码设计的合理性(能进行单元测试的函数,一定是低耦合的)和健壮性(遍 ...

  4. 在maven项目中使用Junit进行单元测试

    在maven项目中使用Junit进行单元测试(一) 在maven项目中使用Junit进行单元测试一 创建maven项目 编写测试用代码 小结 这是第一篇博文,所以我决定先从比较简单的内容写起,同时熟悉 ...

  5. Karma和Jasmine自动化单元测试——本质上还是在要开一个浏览器来做测试

    1. Karma的介绍 Karma是Testacular的新名字,在2012年google开源了Testacular,2013年Testacular改名为Karma.Karma是一个让人感到非常神秘的 ...

  6. 使用junit进行单元测试_使用JUnit对ADF应用程序进行单元测试

    使用junit进行单元测试 JUnit是Java语言的单元测试软件包,由于ADF构建在J2EE框架之上,因此可以用于测试Oracle ADF应用程序. 单元测试基本上是根据某些定义的测试标准来验证最小 ...

  7. 使用junit进行单元测试_使用JUnit5对DynamoDB应用程序进行单元测试

    使用junit进行单元测试 在上一篇文章中,我描述了新的Java 2 AWS开发工具包,它为调用不同AWS服务的Java客户端提供了非阻塞IO支持. 在本文中,我将介绍一种用于单元测试AWS Dyna ...

  8. 使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

    在上一篇文章中 ,我写了NetBeans 7.4 beta中提供的提示 ,这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力. 在本文中,我将研究如何使用NetBeans 7.4 ...

  9. junit进行单元测试_通过JUnit规则轻松进行AppEngine单元测试

    junit进行单元测试 by Ramesh Lingappa 通过拉梅什·林加帕(Ramesh Lingappa) 通过JUnit规则轻松进行AppEngine单元测试 (AppEngine unit ...

最新文章

  1. 对一个“世纪数学难题”的重新思考
  2. zoj 3761(并查集+搜索)
  3. 【STM32】STM32CubeMX教程--功能介绍
  4. 2019款享域视频_钱都花哪了?单日投放最高2443款,复盘2019年买量最烧钱的100款手游...
  5. 爬虫登录获取cookie的难点
  6. mysql插入记录到有约束的表_MySQL学习笔记-约束以及修改数据表
  7. 信息收集(C段扫描)
  8. JZOJ 5442 荒诞
  9. 企查查app新增企业数据抓取
  10. linux ps输出项的含义,【整理】ps命令输出字段的含义
  11. 基于云桌面的外部设备重定向技术调研
  12. 面对DDoS攻击的威胁时应该怎么做呢?
  13. 【计算机网络】服务访问点是什么意思?
  14. 千言数据集:文本相似度——数据读取部分
  15. IDEA 教程(基础篇)第01话:Windows 系统下安装 IntelliJ IDEA (超级详细)
  16. java对接银联商务公众号+服务窗支付(1)
  17. qsv如何转换AVI格式 如何将qsv转换成AVI
  18. FFmpeg 混音学习【一】FFmpeg aac音频混流学习及问题记录
  19. 美国留学遇到困难怎么办?
  20. (附源码)SSM化妆品网上商城数据分析系统JAVA计算机毕业设计项目

热门文章

  1. 通达信交易接口:让交易更高效
  2. 区块链技术应用落地解决方案 区块链溯源服务
  3. JSP养老院管理系统JSP养老院系统javaweb养老院系统JSP敬老院管理系统JSP敬老院系统
  4. php OpenSSL工具命令导出.cer证书密钥
  5. (附源码)node医保药品集中采购平台-采购系统的设计与实现 毕业设计271542
  6. Word页码设置页码从指定页面从1开始
  7. 百度云ROM移植教程
  8. 猪,是怎么看互联网的!
  9. 一起来看看压敏电阻器的电路防护作用吧!
  10. if...if 和if...elif的区别