单元测试_JUnit常用单元测试注解介绍及代码演示
JUnit常用单元测试注解介绍及代码演示
by:授客 QQ:1033553122
1. 测试环境
Win7
eclipse-java-oxygen-3a-win32-x86_64.zip
apache-maven-3.5.4-bin.zip
https://maven.apache.org/download.cgi
https://pan.baidu.com/s/1OUNC0kZNduXJJLbpw76GZA
2. 基础概念
测试方法 :用@Test注解修饰的一些类方法。
测试类:包含一个或多个测试方法的java类;
测试套件:用@RunWith(Suite.class) 及@SuiteClasses注解的;font-size:10.5000pt;mso-font-kerning:0.0000pt;">一个或多个测试类
3. 常用Annotation
@RunWith 修饰测试类,用于修改运行器,如果不指定@RunWith则使用默认运行器。当测试类被@RunWith注解修饰时,或者类继承了一个被该注解修饰的类,JUnit将会使用这个注解所指明的运行器来运行单元测试,而不使用JUnit默认的运行器。
常见的运行器有:
@RunWith(JUnit4.class) junit4的默认运行器
@RunWith(SpringRunner.class) 集成了spring的一些功能的运行器
@RunWith(Suite.class) 配合@SuiteClasses使用,用于执行测试套件的运行器
@RunWith(Parameterized.class) 参数化运行器,配合@Parameters使用,参数化运行单元测试,需要在被修饰的测试类中的,提供数据的方法上加上一个@Parameters注解,例如,注意,这个提供数据的方法必须是静态的(static),并且返回一个集合(Collection)。
我们可以为@Parameters 提供一个“名称”,以便更清晰的标记每个测试方法在每次运行时所使用的参数
“名称”可以包含占位符,该占位符在运行时将会被替换。
·{index}: 当前参数的索引
·{0}, {1}, …: 第一个参数,第二个参数等对应的参数值。
@Test 注解将一个普通方法修饰为一个测试方法,可选参数 timeout、expected,如下:
@Test(timeout = 1000) 设置被修饰的测试方法在预期时间(例中为 1000毫秒)内执行完成,否则测试失败;
@Test(expected = Exception.class)设置被修饰的测试方法应该抛出的预期异常,异常类型为:Exception.class,如果测试方法没有抛出预期的异常,则测试失败, 例如 @Test(expected = NullPointException.class)
注意:测试方法必须是public void,即公共、无返回
参考链接:https://www.cnblogs.com/mengdd/archive/2013/04/13/3019278.html
@BeforeClass 注解用于修饰测试类中的非测试方法,该方法将在其所属测试类中的所有测试方法被执行前运行,且只运行一次,可用于做一些测试基础准备,比如数据库连接,读取文件等。
注意:@BeforeClass修饰的方法必须是被public static void 修饰的方法,即公开、静态、无返回
@AfterClass 同@BeforeClass相反,注解用于修饰测试类中的非测试方法,该方法将在其所属测试类中所有测试方法执行完成后被运行,且只运行一次,可用于做一些测试后续操作,比如断开数据库连接,关闭文件等。
注意:@AfterClass 修饰的方法必须是被public static void 修饰的方法,即公开、静态、无返回
@Before 注解用于修饰测试类中的非测试方法, 该方法会在其所属测试类中的每一个测试方法运行前运行一次
与@BeforeClass的区别在于,@Before不止运行一次,它会在每个测试方法运行之前都运行一次。主要用于为单个测试方法做一些基础的测试准备工作。
注意:@Before 修饰的方法必须是被public void 修饰的方法,即公开、无返回,但不能是被static修饰的
@After:用于修饰测试类中的非测试方法, 同@Before相反,该方法会在其所属测试类中的每一个测试方法执行完后都运行一次
注意:@After 修饰的方法必须是被public void 修饰的方法,即公开、无返回,但不能是被static修饰的
@ignore 注释掉一个测试方法或一个类,被注释的方法或类,不会被执行;
4. 运行环境配置
maven配置
确保安装了java jdk并正确设置了JAVA_HOME
下载bin.zip压缩包,解压到目标路径(例中 D:\Program Files\apache-maven-3.5.4\
),设置MAVEN_HOME及Path环境变量,如下
cmd输入mvn -v测试
Eclipse maven运行环境配置
如图,Window - Preferences - Maven -User Settings,Browse指定maven配置文件所在路径
更新项目
为了解决项目jar包依赖之类的问题,更新项目,右键项目根目录 - Maven - Update Project
如下图,默认已经选中了工程项目,默认选项配置的基础上,勾选上“Force Update of Snapshots/Releases”,OK提交
5. 单元测试实践
被测类BinarySearch
package org.shouke.demo;
public class BinarySearch {
public int binarySearch(long[] a, long key) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
long midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid;
}
return -1;
}
}
测试类BinarySearchTest
package org.shouke.test;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.shouke.demo.BinarySearch;
//@RunWith(SpringRunner.class)
@RunWith(JUnit4.class)
//@SpringBootTest
//@TestPropertySource("classpath:test-application.properties")
public class BinarySearchTest {
private BinarySearch binarySearch = new BinarySearch();
private long[] array1 = new long[] {};
@Test
public void testBinarySearch1() {
System.out.println("执行方法 testBinarySearch1");
int index = binarySearch.binarySearch(array1, 401L);
Assert.assertEquals(-1, index);
}
private long[] array2 = new long[] {123L,123L,123L,123L,123L,123L,123L,123L};
@Ignore
public void testBinarySearch2() {
System.out.println("执行方法 testBinarySearch2");
int index = binarySearch.binarySearch(array2, 401L);
Assert.assertEquals(-1, index);
}
private long[] array3 = new long[] {123L, 456L};
@Test
public void testBinarySearch3() {
System.out.println("执行方法 testBinarySearch3");
int index = binarySearch.binarySearch(array3, 401L);
Assert.assertEquals(-1, index);
}
private long[] array4 = new long[] {123L, 456L};
@Test
public void testBinarySearch4() {
System.out.println("执行方法 testBinarySearch4");
int index = binarySearch.binarySearch(array4, 40L);
Assert.assertEquals(-1, index);
}
private long[] array5 = new long[] {123L, 456L};
@Test
public void testBinarySearch5() {
System.out.println("执行方法 testBinarySearch5");
int index = binarySearch.binarySearch(array5, 123L);
Assert.assertEquals(0, index);
}
private long[] array6 = new long[] {123L, 123L};
@Test
public void testBinarySearch6() {
System.out.println("执行方法 testBinarySearch6");
int index = binarySearch.binarySearch(array6, 123L);
Assert.assertEquals(0, index);
}
@Before
public void testBeforeMethod() {
System.out.println("执行每个方法前先执行该函数");
}
@After
public void testAfterMethod() {
System.out.println("执行完每个方法后都会执行该函数");
}
@BeforeClass
public static void testBeforeClass() {
System.out.println("执行测试类的所有方法前先执行该函数");
}
@AfterClass
public static void testAfterClass() {
System.out.println("执行完测试类的所有方法后都会执行该函数");
}
}
被测类Caculator
package org.shouke.demo;
public class Caculator {
public int caculate(int arg1, int arg2) {
if (arg1 > arg2) {
return arg1 - arg2;
} else if (arg1 < arg2) {
return arg1 + arg2;
} else {
return arg1;
}
}
}
测试类CaculatorTest
package org.keshou.test;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.shouke.demo.Caculator;
import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
public class CaculatorTest {
private Caculator caculator = new Caculator();
public int arg1;
public int arg2;
public CaculatorTest(int arg1, int arg2) {
this.arg1 = arg1;
this.arg2 = arg2;
}
// @Parameterized.Parameters
@Parameterized.Parameters(name = "{index}: (arg1: {0} arg2: {1}")
public static Collectiondata() {
return Arrays.asList(new Object[][] {
{ 10, 1}, { 5, 1 }
});
}
@Test
public void testCaculate1() {
int result = caculator.caculate(arg1, arg2);
System.out.println("执行方法 testCaculate1 参数:" + arg1 + " " + arg1);
Assert.assertEquals(result, arg1-arg2);
}
@Test
public void testCaculate2() {
int result = caculator.caculate(arg1, arg2);
System.out.println("执行方法 testCaculate2 参数:" + arg1 + " " + arg1);
Assert.assertEquals(result, arg1+arg2);
}
}
说明:被@Parameters 注解修饰用于提供参数的方法有多少个参数,那么就需要为其所在类提供对应数量的类属性,及一个包含对应数量的参数的构造函数,否则会报错:java.lang.IllegalArgumentException: wrong number of arguments
测试套件类RunAllTestClass
package org.keshou.test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({CaculatorTest.class, org.shouke.test.BinarySearchTest.class})
public class RunAllTestClass {
}
说明:如果需要运行多个测试类,只需要把目标测试类名称.class放入如下的 {}中即可,测试类之间使用逗号分隔,如果不是同一个包中的测试类,记得加上对应的package名称,或者使用import提前导入对应类。
@Suite.SuiteClasses({A.class, B.class, ...})
运行单元测试
如下图,右键整个项目、单个测试类、测试套件 -> Coverage As -> JUnit Test
或者
如下图,右键整个项目、单个测试类、测试套件 -> Run As -> JUnit Test
说明:
1、如果右键时选择的是整个项目,那么项目src\test\;font-size:10.5000pt;mso-font-kerning:0.0000pt;">目录下的都有测试类都会被执行。
2、Coverage as 和 Run as 这两种运行方式的区别在于前者运行完成,会在控制台端自动打开 Coverage 界面,展示覆盖率,后者需要手动打开,打开方式如下:
Window -> Show View -> Java -> Coverage
运行结果展示
运行测试套件
单元测试_JUnit常用单元测试注解介绍及代码演示的更多相关文章
- 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
在上一篇的最后,编写了一个C#驱动RabbitMQ的简单栗子,了解了C#驱动RabbitMQ的基本用法.本章介绍RabbitMQ的四种Exchange及各种Exchange的使用场景. 1 direc ...
- STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
一.介绍: STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示, IWDG和WWDG两者特点如下图所示: 独立看门狗的手册资料: 窗口看门狗的手册资料: ...
- [原创]java WEB学习笔记100:Spring学习---Spring Bean配置:SpEL详细介绍及代码演示
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring常用注解介绍【经典总结】
Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式. Spring注解方式减少了配置文件内容 ...
- SG-UAP常用注解介绍
注解基本介绍 Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可 ...
- SpringBoot | 第六章:常用注解介绍及简单使用
前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志配置等.这章节开始,开始总结一些关于springboot的综合开发的知识点.由于SpringBoot本身是基于Sprin ...
- 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码
浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...
- .net持续集成单元测试篇之单元测试简介以及在visual studio中配置Nunit使用环境
系列目录 单元测试及测试驱动开发简介 什么是单元测试 单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验.单元测试几乎都是用单元测试框架编写的.单 ...
- Junit中常用的注解说明
Java注解((Annotation)的使用方法是@注解名 ,能通过简单的词语来实现一些功能.在junit中常用的注解有@Test.@Ignore.@BeforeClass.@AfterClass.@ ...
随机推荐
- InputStream和Reader,FileInputStream和 FileReader的区别
一.InputStream和Reader的区别 InputStream和Reader都可以用来读数据(从文件中读取数据或从Socket中读取数据),最主要的区别如下: InputStream用来读取二 ...
- [Swift]LeetCode17. 电话号码的字母组合 | Letter Combinations of a Phone Number
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that th ...
- [Swift]LeetCode811. 子域名访问计数 | Subdomain Visit Count
A website domain like "discuss.leetcode.com" consists of various subdomains. At the top le ...
- SCOI2019 退役记
退役了.D2没有翻盘,愉快出队,文化课见. 19年4月14日:某校第一届的最后一名OIer退出竞赛. 留坑. 万一退役失败了呢
- 【机器学习】--线性回归中L1正则和L2正则
一.前述 L1正则,L2正则的出现原因是为了推广模型的泛化能力.相当于一个惩罚系数. 二.原理 L1正则:Lasso Regression L2正则:Ridge Regression 总结: 经验值 ...
- asp.net core系列 25 EF模型配置(隐藏属性)
一. 隐藏属性概述 隐藏属性也叫影子属性,该属性不是在.net实体类中定义的属性,而是在EFCore模型中为该实体类型定义的属性.这些属性的值和状态完全在变更跟踪器中维护.它有二个功能:(1)当数据库 ...
- Java基础14:离开IDE,使用java和javac构建项目
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- C#3.0智能的编译器
智能的编译器 在C#3.0中,编译器变的越来越智能,我们不用提供给它完整的信息,仅需要提供必要的信息,编译器就可以进行推断为我们补全未提供的信息 自动实现的属性 在之前我们生成一个类时需要有一个字段, ...
- centos7修改网卡名字为传统名字
前言:在centos6及其之前的系统中,我们已经习惯了网卡为eth0,eht1这种网卡命名方式,在centos7上网卡名字为ens33,ens37,ens38等名字,很别扭,想统一下网卡的命名. 1 ...
- linux为什么不可以添加硬链接
假设有个文件夹1 文件夹1里面还有个文件夹2 文件夹2里面还有个文件夹3 然后发现哎呀直接文件夹3放到文件夹1下就行了访问多方便. 也就是文件夹1下有文件夹2和文件夹3,然后问题就来了文件夹1下的文件 ...