廖雪峰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/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 匿名函数 通过 ... 
随机推荐
- ASP.NET项目答辩系统课件使用中的问题记录
			使用软件:VS2008 模块一:登录模块 1-08 问题:显示属性“background”不是元素"td"的有效属性 解决:style="background-image ... 
- 不使用Visual Studio开发ASP.NET MVC应用(下篇)
			书接上回! 前文“纯手工”.彻底抛弃Visual Studio,制作了一个ASP.NET MVC应用,运行起来还不错,项目目录.源代码.web.config等所有东西都已经做到“最简”,除去了Visu ... 
- Delphi7安装
			在学习和使用Delphi之前,我们要先安装它的开发环境,本机系统为Win7 32.下面我简要介绍一下它的安装过程. (1)下载Delphi7并解压,双击setup.exe可执行文件开始安装. (2)开 ... 
- EL(Expression Language)表达式语言
			EL(Expression Language)表达式语言 EL的基本语法是以${开始,以}结束 为了能够方便地输出数据,EL提供了11个内置对象,其中 2个内置对象为了方便输出请求参数 param用来 ... 
- 埃式筛法——求n以内素数
			素数筛法的关键就在一个“筛”字.算法从小到大枚举所有数,对每一个素数,筛去它的所有倍数,剩下的就都是素数了. 例如:求1-15中的所有素数. 1. 2是素数(唯一需要事先确定的),因此筛去2的所有倍 ... 
- tp5.0隐藏路由后缀index.php
			一开始的路由是有index.php结尾的 接下来开始修改主要文件 
- 【EMV L2】Application Usage Control
			[Application Usage Control] Tag9F07,卡片数据,2bytes: Indicates issuer’s specified restrictions on the ge ... 
- EmptyBeanUtil
			package com.rscode.credits.util; import java.util.List; /** * * 判断实体是否为空 * @author tn * */ public cl ... 
- 浅谈get,post,put和delete请求
			get.put.post.delete含义与区别 1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影 ... 
- python中的Matplot库和Gdal库绘制富士山三维地形图-参考了虾神的喜马拉雅山
			首先请大家读一下面这篇文章了解什么是Gdal http://blog.csdn.net/grllery/article/details/77822595 剩下的我要公布绘制富士山的代码了,虽然基本co ... 
