廖雪峰Java8JUnit单元测试-2使用JUnit-1使用Before和After
1. @Before和@After
同一个单元测试内的多个测试方法:
- 测试前都需要初始化某些对象
- 测试后可能需要清理资源fileInputStream.close()
@Test
public void testCalcAdd2Number(){
Main calc = new Main();
int r = calc.calculate("1+2");
assertEquals(3,r);
}
@Test
public void testCalcAdd3Number(){
Main calc = new Main();
int r = calc.calculate("1+2+5");
assertEquals(8,r);
}
JUnit可以使用@Before和@After:
- 在@Before方法中初始化测试资源
- 在@After方法中释放测试资源
- @Before方法初始化的对象要放在实例字段中,因为实例字段的状态不会影响下一个@Test
public class MainTest {
Main calc;//@Before方法初始化的对象放在实例字段中
@Before
public void setUp(){
calc = new Main();
}
@Test
/**
* JUnit对于每个@Test方法
* 1.实例化MainTest对象,如MainTest test = new MainTest();
* 2.执行@Before方法 test.serUp();
* 3.执行@Test方法 test.test();
* 4.执行@After方法 test.tearDown();
*/
public void testCalcAdd2Number(){
int r = calc.calculate("1+2");
assertEquals(3,r);
}
@After
public void tearDown(){
calc = null;
}
@Test
public void testCalcAdd3Number(){
Main calc = new Main();//实例字段的状态不会受上次测试的,同样也不会影响到本次测试
int r = calc.calculate("1+2+5");
assertEquals(8,r);
}
@After
public void tearDown(){
calc = null;
}
}
示例
Calculator.java
public class Calculator {
public int calculator(String expression){
String[] ss = expression.split("\\+");
int sum = 0;
for(String s:ss){
sum = sum + Integer.parseInt(s.trim());
}
return sum;
}
}
CalculatorTest.java
package com.testList;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Calendar;
import static org.junit.Assert.*;
public class CalculatorTest {
Calculator calc;
@Before
public void setUp(){
calc = new Calculator();
}
@Test
public void testCalcAdd2Numbers(){
int r = calc.calculator("1+2");
assertEquals(3,r);
}
@Test
public void testCalcAdd3Numbers(){
int r = calc.calculator("1+2+5");
assertEquals(8,r);
}
@Test
public void testCalcAddLargeNumber() {
int r = calc.calculator("123+456");
assertEquals(579,r);
}
@Test
public void testCalcWithWhiteSpace(){
int r = calc.calculator("1 + 5 + 10 ");
assertEquals(16,r);
}
@After
public void tearDown(){
calc = null;
}
}

因此,使用@Before和@After可以保证:
* 单个@Test方法执行前会创建新的XxxTest示例,变量的状态不会传递给下一个@Test方法
* 单个@Test方法执行前后会执行@Before和@After方法
2.@BeforeClass和@AfterClass静态方法:
- 1.在执行所有@Test方法前执行@BeforeClass静态方法
- 2.执行所有测试
- 3.在执行所有@Test方法后执行@AfterClass静态方法
- @BeforeClass静态方法初始化的对象只能存放在静态字段中,而静态字段的状态会影响到所有@Test
public class MainTest{
static Main mainer;
@BeforeClass
public static void beforeClass(){
mainer = new Main();
}
}
JUnit执行逻辑:
- @BeforeClass
- @setUp @Test @tearDown
- @setUp @Test @tearDown
- ...
- @AfterClass
初始化测试资源称为Fixture(设备,不能移动之物)
- @Before:初始化测试对象,例如:input = new FileInputStream()
- @After:销毁@Before创建的测试对象,例如:input.close()
- @BeforeClass:初始化非常耗时的资源,例如连接数据库
- @AfterClass:清理@BeforeClass创建的资源,例如断开数据库连接
import org.junit.*;
public class SequenceTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception{
System.out.println("setUpBeforeClass");
}
@AfterClass
public static void tearDownBeforeClass() throws Exception{
System.out.println("earDownBeforeClass");
}
@Before
public void setUp() throws Exception{
System.out.println("\tsetUp");
}
@After
public void tearDown() throws Exception{
System.out.println("\ttearDown");
}
@Test
public void test1() throws Exception{
System.out.println("\t\t方法1");
}
@Test
public void test2() throws Exception{
System.out.println("\t\t方法2");
}
@Test
public void test3() throws Exception{
System.out.println("\t\t方法3");
}
}

3.总结:
- 理解JUnit执行测试的生命周期
- @Before用于初始化测试对象,测试对象以实例变量存放
- @After用于清理@Before创建的对象
- @BeforeClass用于初始化耗时资源
- @AfterClass用于清理@BeforeClass创建的资源
廖雪峰Java8JUnit单元测试-2使用JUnit-1使用Before和After的更多相关文章
- 廖雪峰Java8JUnit单元测试-1JUnit简介-1JUnit测试
测试驱动开发(Test Driver Development) 1.使用main()方法测试的缺点: 只能有1个main()方法,不能把测试代码分离 没有打印出测试结果和期望结果,例如expected ...
- 廖雪峰Java8JUnit单元测试-2使用JUnit-4超时测试
1.超时测试 可以为JUnit的单个测试设置超时: 超时设置1秒:@Test(timeout=1000),单位为毫秒 2.示例 Leibniz定理:PI/4= 1 - 1/3 + 1/5 - 1/7 ...
- 廖雪峰Java8JUnit单元测试-2使用JUnit-2异常测试
1.异常测试 对可能抛出的异常进行测试: 异常本身是方法签名的一部分: * public static int parseInt(String s) throws NumberFormatExcept ...
- 廖雪峰Java8JUnit单元测试-2使用JUnit-3参数化测试
参数化测试: 可以把测试数据组织起来 用不同的测试数据调用相同的测试方法
- 廖雪峰Python电子书总结
函数 1.注意:函数的默认参数必须指向不可变对象 未修改前: def add_end(L=[]): L.append('END') return L 存在的问题:如果连续调用多次,会出现多个 'END ...
- 廖雪峰python教程的第一个疑问
函数的参数一节中提到: def add_end(L = []); L.append('END') return L 正常调用add_end时(也就是有参数传入时): >>> add_ ...
- 爬虫:把廖雪峰的教程转换成 PDF 电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...
- Python自学笔记-生成器(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 生成器 通过列 ...
- Python自学笔记-lambda函数(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 匿名函数 通过 ...
随机推荐
- Redis学习笔记一
Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单 ...
- vuex核心
最详细的Vuex教程 什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是dat ...
- iOS原生 和 react native视图混编
在iOS原生功能中加入RN,请看之前 写的 RN与iOS交互系列文章.本篇只讲下视图混编. 关键点只有二: 1.通过 RCTRootView 加载RN视图. 2.RN中,只需要AppRegistry. ...
- Unity存储路径
一.在项目根目录中创建Resources文件夹来保存文件 可以使用Resources.Load("文件名字,注:不包括文件后缀名");把文件夹中的对象加载出来注:此方可实现对文件实 ...
- input 和 button元素 作为提交、重置、按钮功用的区别。
首先,input元素和button元素 都是可以作为普通按钮.提交按钮.重置按钮的. <input type="button" value="button" ...
- git 安装配置
一.下载安装Git 1.下载Git 官方地址为:https://git-scm.com/download/win 2.下载完之后,双击安装 3.选择安装目录 4.选择组件 5.开始菜单目录名设置 6 ...
- Java中对Array数组的常用操作
目录: 声明数组: 初始化数组: 查看数组长度: 遍历数组: int数组转成string数组: 从array中创建arraylist: 数组中是否包含某一个值: 将数组转成set集合: 将数组转成li ...
- 64位ubuntu16.04系统安装tensorflow_cpu
ubuntu16.04安装tensorflow_cpu 一.安装anaconda: ①.下载anaconda包:Anaconda3-5.2.0-Linux-x86_64.sh 这是python3.6. ...
- hql和sql的一些区别
日期格式化查询的区别: selectSql.append(" AND DATE_FORMAT(o.createDate,\'%Y-%m-%d\') = :createDate"); ...
- java基本数据类型和运算符
一.基本数据类型 种类: 内置数据类型 引用数据类型 1.内置数据类型 一共有八种基本类型,六个数字类型(四个整数类型,两个浮点型),一个布尔型,一个字符类型. (1)byte: byte数据类型是8 ...