Java Junit 基础笔记
Junit
1. 概念
JUnit是一个Java语言的单元测试框架。
单元测试:单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
2. Junit特性
测试工具
- 测试套件
- 测试运行器
- 测试分类
3. API
注解
| 序号 | 注释 | 描述 |
|---|---|---|
| 1 | @Test | 依附在Junit的public void方法上,作为一个测试用例。 |
| 2 | @Before | 表示必须在每一个测试之前执行,以便执行测试某些必要的先决条件。 |
| 3 | @BeforeClass | 依附在静态方法上,在类的所有测之前必须执行。一般是测试计算共享配置方法(连接到数据库)。 |
| 4 | @After | 表示在每一个测试后执行,如执行每一个测试后重置或删除某些变量。 |
| 5 | @AfterClass | 在所有测试用例后执行,可用于清理建立方法,如断开数据库连接。和@BeforeClass一样附着的方法必须是静态。 |
| 6 | @Ignore | 当想暂时禁用特定的测试执行的时候可以使用,被注解为@Ignore的方法将不被执行。 |
代码示例:
import org.junit.*; /**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestAnnotation { //指出这是附着在静态方法必须执行一次并在类的所有测试之前。
// 发生这种情况时一般是测试计算共享配置方法(如连接到数据库)
@BeforeClass
public static void beforeClass(){
System.out.println("execute beforeClass");
} //当需要执行所有的测试在JUnit测试用例类后执行,AfterClass注解可以使用以清理建立方法,
// (从数据库如断开连接)。注意:附有此批注(类似于BeforeClass)的方法必须定义为静态。
@AfterClass
public static void afterClass(){
System.out.println("execute afterClass");
} //Before注释表示,该方法必须在类中的每个测试之前执行,以便执行测试某些必要的先决条件。
@Before
public void before(){
System.out.println("execute before");
} //After 注释指示,该方法在执行每项测试后执行(如执行每一个测试后重置某些变量,删除临时变量等)
@After
public void after(){
System.out.println("execute after");
} //测试注释指示该公共无效方法它所附着可以作为一个测试用例。
@Test
public void test(){
System.out.println("execute test");
} @Test
public void test1(){
System.out.println("execute test1");
} //当想暂时禁用特定的测试执行可以使用忽略注释。每个被注解为@Ignore的方法将不被执行。
@Ignore
public void ignoreTest(){
System.out.println();
}
}
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure; /**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestRunner2 {
public static void main(String[] args) {
Result result= JUnitCore.runClasses(TestAnnotation.class);
for (Failure failure:result.getFailures()){
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
运行结果:
execute beforeClass
execute before
execute test
execute after
execute before
execute test1
execute after
execute afterClass
true
junit的执行过程
- beforeClass首先执行,只执行一次
- afterClass最后执行,只执行一次
- before在每次测试之前执行
- after在每次测试之后执行
- 每个test在after和before之间执行
断言
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | assertEquals(boolean expected, boolean actual) | 检查两个变量或者等式是否平衡 |
| 2 | assertTrue(boolean expected, boolean actual) | 检查条件是否为真 |
| 3 | assertFalse(boolean condition) | 检查条件是否为假 |
| 4 | assertNotNull(Object object) | 检查变量是否不为空 |
| 5 | assertNull(Object object) | 检查变量是否为空 |
| 6 | assertSame(Object expected, Object actual) | 检查两个引用是否指向同一个对象 |
| 7 | assertNotSame(Object expected, Object actual) | 检查两个引用是否不指向同一个对象 |
| 8 | assertArrayEquals(expectedArray, resultArray) | 检查两个数组是否相等 |
代码示例
import org.junit.Test; import static org.junit.Assert.*; public class TestAssertions { @Test
public void testAssertions(){
String str1=new String("abc");
String str2=new String("abc");
String str3=null;
String str4="abc";
String str5="abc";
int val1=5;
int val2=6;
String[] expectedArray={"one","two","three"};
String[] resultArray={"one","two","three"}; assertEquals(str1,str2); assertTrue(val1<val2); assertFalse(val1>val2); assertNotNull(str1); assertNull(str3); assertSame(str4,str5); assertNotSame(str1,str3); assertArrayEquals(expectedArray,resultArray); }
}
4. 执行测试
测试用例通过JUnitCore类来执行,它是Junit运行测试的外观类。对于只有一次的测试运行,可以使用静态方法:runClasses(Class[])
5. 套件测试
意思就是捆绑几个单元测试用例并一起执行。@RunWith和@Suite可一起用于运行套件测试
代码示例
/**
* Created by Administrator on 2017/11/1 0001.
* 被测试类
*/
public class MessageUtil { private String message; public MessageUtil(String message){
this.message=message;
} public String printMessage(){
System.out.println(message);
return message;
} public String salutationMessage(){
message="Hi!"+message;
System.out.println(message);
return message;
}
}import org.junit.Assert;
import org.junit.Test; /**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestJunit { String message="Robert";
MessageUtil messageUtil=new MessageUtil(message); @Test
public void testPrintMessage(){
// message="New Word";
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message,messageUtil.printMessage());
}
}
import org.junit.Assert;
import org.junit.Test; /**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestJunit1 { String message = "Robert";
MessageUtil messageUtil=new MessageUtil(message); @Test
public void testSalutationMessage(){
System.out.println("Inside testSalutationMessage()");
message="Hi!"+"Robert";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
测试执行类:
```
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
/**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestRunner2 {
public static void main(String[] args) {
Result result= JUnitCore.runClasses(JunitTestSuite.class);
for (Failure failure:result.getFailures()){
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
```
- 运行结果
Inside testPrintMessage()
Robert
Inside testSalutationMessage()
Hi!Robert
true
6. 忽略测试
- 一个含有@Ignore 注释的测试方法不会被执行
- 如果一个测试类有@Ignore注释,则它的测试方法将不会被执行
7. 时间测试
timeout参数与@Test注释一起使用,当一个测试用例比指定毫秒数花费更多时间,那么Junit将会自动将它标记为失败。
代码示例:
/**
* Created by Administrator on 2017/11/1 0001.
*/
public class MessageUtil { private String message; public MessageUtil(String message){
this.message=message;
} public void printMessage(){
System.out.println(message);
while (true);
} public String salutationMessage(){
message="Hi!"+message;
System.out.println(message);
return message;
}
}import org.junit.Assert;
import org.junit.Test; /**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestJunit4 { String message = "Robert";
MessageUtil messageUtil=new MessageUtil(message); @Test(timeout = 1000)
public void testPrintMessage(){
System.out.println("Inside testPrintMessage");
messageUtil.printMessage();
} @Test
public void testSalutationMessage(){
System.out.println("Inside testSalutationMessage");
message="Hi!"+"Robert";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure; /**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestRunner2 {
public static void main(String[] args) {
Result result= JUnitCore.runClasses(TestJunit4.class);
for (Failure failure:result.getFailures()){
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}运行结果
Inside testSalutationMessage
Hi!Robert
Inside testPrintMessage
Robert
testPrintMessage(TestJunit4): test timed out after 1000 milliseconds
false
8. 异常测试
expected参数与@Test注释一起使用,可以测试代码是否抛出你想要得到的异常。
代码示例
/**
* Created by Administrator on 2017/11/1 0001.
*/
public class MessageUtil { private String message; public MessageUtil(String message){
this.message=message;
} public void printMessage(){
System.out.println(message);
// return message;
// while (true);
int a=0;
int b=1/a;
} public String salutationMessage(){
message="Hi!"+message;
System.out.println(message);
return message;
}
}
import org.junit.Assert;
import org.junit.Test; /**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestJunit5 { String message = "Robert";
MessageUtil messageUtil=new MessageUtil(message); @Test(expected = ArithmeticException.class)
public void testPrintMessage(){
System.out.println("Inside testPrintMessage");
messageUtil.printMessage();
} @Test
public void testSalutationMessage(){
System.out.println("Inside testSalutationMessage");
message="Hi!"+"Robert";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
运行结果
Inside testSalutationMessage
Hi!Robert
Inside testPrintMessage
Robert
true
9. 参数化测试
参数化测试允许开发人员使用不同的值反复运行同一个测试用例。
- 用@RunWith(Parameterized.class)来注释test类
- 创建一个由@Parameterized.Parameters注释的公共静态方法,返回一个对象的集合(数组)来作为测试数据集合。
- 创建一个公共构造函数,用来接收和存储测试数据。
- 用例会反复运行,为每一组测试数据创建一个实例变量
- 用实例变量作为测试数据的来源来创建你的测试用例
代码示例
判断是不是素数:public class PrimeNumberChecker { public Boolean validate(final Integer primeNumber){
for (int i = 2; i < (primeNumber / 2); i++) {
if (primeNumber%i==0){
return false;
}
}
return true;
}
}
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized; import java.util.Arrays;
import java.util.Collection; /**
* Created by Administrator on 2017/11/1 0001.
*/ @RunWith(Parameterized.class)
public class PrimeNumberCheckerTest { private Integer inputNumber;
private Boolean expectedResult;
private PrimeNumberChecker primeNumberChecker; @Before
public void initialize(){
System.out.println("initialize");
primeNumberChecker=new PrimeNumberChecker();
} public PrimeNumberCheckerTest(Integer inputNumber,Boolean expectedResult){
System.out.println("construct");
this.inputNumber=inputNumber;
this.expectedResult=expectedResult;
} @Parameterized.Parameters
public static Collection primeNumbers(){
return Arrays.asList(new Object[][]{
{2,true},
{6,true},
{19,true},
{22,true},
{23,true}
});
} @Test
public void testPrimeNumberChecker(){
System.out.println("test");
System.out.println("Parameterized Number is : " + inputNumber);
Assert.assertEquals(expectedResult,
primeNumberChecker.validate(inputNumber));
}
}import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure; /**
* Created by Administrator on 2017/11/1 0001.
*/
public class TestRunner2 {
public static void main(String[] args) {
Result result= JUnitCore.runClasses(PrimeNumberCheckerTest.class);
for (Failure failure:result.getFailures()){
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}运行结果
construct
initialize
test
Parameterized Number is : 2
construct
initialize
test
Parameterized Number is : 6
construct
initialize
test
Parameterized Number is : 19
construct
initialize
test
Parameterized Number is : 22
construct
initialize
test
Parameterized Number is : 23
testPrimeNumberChecker[1](PrimeNumberCheckerTest): expected:<true> but was:<false>
testPrimeNumberChecker[3](PrimeNumberCheckerTest): expected:<true> but was:<false>
false
Java Junit 基础笔记的更多相关文章
- 一位菜鸟的java 最基础笔记
java的特性 简单性(Simple). 结构体系中立(Architecture Neutral). 面向对象(Object Oriented). 易于移植(Portable). 分布式(Distri ...
- java概念基础笔记整理
1.构造方法没有类型,有类型的不是不叫构造方法. 2.一个类的的成员变量可以是java允许的任何数据类型,一个类可以把某个对象作为自己的一个成员变量,如果用这样的类创建对象,那么该对象中就会其他对象, ...
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错
原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...
- 老李分享:《Java Performance》笔记1——性能分析基础 1
老李分享:<Java Performance>笔记1——性能分析基础 1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- 转!java基础笔记
原博文地址:http://blog.csdn.net/u012152619/article/details/48024345 Java标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都 ...
- 【代码笔记】Java常识性基础补充(一)——赋值运算符、逻辑运算符、三元运算符、Scanner类、键盘输入、Random类、随机数
为什么要进行Java常识性基础补充? 之前学习Java语言,学得很多很杂,而且是很多不同的方面插入讲解的,比如在跟班上课,自学java编程例子,java语法,过了很久,因为各种原因长时间不怎么写,有时 ...
- Java Script 学习笔记 -- 基础知识
Java script 概述 java Script 的简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...
随机推荐
- yii2 高级版新建一个应用(api应用为例子)
先在项目的根目录下复制一份 backend 为 api: cp backend/ api -r 拷贝 api 环境 cp -a environments/dev/frontend environmen ...
- MVC ---- IEnumerable<T>、List<T> 前台遍历展示
突然做前台数据展示,发现IEnumerable 对一个列表的展示还是可以,但要是多个类型放在一个表中如何处理呢,如下: 一个类IEnumerable遍历 后台 public IEnumerable&l ...
- Cocos2d-x学习笔记(八)精灵对象的创建
精灵类即是Sprite,它实际上就是一张二维图. 它首先直接继承了Node类,因此,它具有节点的特征,同时,它也直接继承了TextureProtocol类,因此,它也具有纹理的基本特征. 这里,有必要 ...
- 【转】VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
☞ 本文主要介绍软件『VMware Workstation(虚拟机)』的相关内容:VMware网络连接模式—桥接.NAT以及仅主机模式的详细介绍和区别. 其下列版本/分支可以参考本文: 全部版本/分支 ...
- 解决“centos 下bash: g++: 未找到命令...”
简单测试一个C++的“Hello World”,发现报错:“bash: g++: 未找到命令...”,因为没有安装编译器G++:然后就百度,出现一大堆的解决办法,什么“sudo apt-get ins ...
- Unity中使用的一套敏感词过滤方式
当项目中的敏感词数量不是很多的时候,直接用数组来遍历过滤其实也可以,但是具体的数量有多大,这个肯定不好说,因此,对.txt中的敏感词合理组织后再进行过滤就显得非常有必要了. 如上图,左边是txt中配置 ...
- R语言-attach、detach、with
在R语言中,对于串列,数据框中的数据的进行操作时,为了避免重复地键入对象名称,可使用attach或with. 1.attach() 假设data.frame包含列name,age attach(one ...
- javascritp文章 You-Dont-Know-JS
https://github.com/getify/You-Dont-Know-JS 有6个系列.git在线免费. 第一本, up and going (点击链接) Mission: 作者建议在开始学 ...
- JS-Object(2) 原型对象 ,prototype属性。
基础✅ prototype(✅) JS中的继承 使用JSON数据 构建对象实战 基础 关键字"this"指向了当前代码运行时的对象( 原文:the current object t ...
- UVA-10539 Almost Prime Numbers
题目大意:这道题中给了一种数的定义,让求在某个区间内的这种数的个数.这种数的定义是:有且只有一个素因子的合数. 题目分析:这种数的实质是素数的至少两次幂.由此打表——打出最大区间里的所有这种数构成的表 ...