jUnit - 01 - 基础

说明

jUnit是java常用的一个测试框架,用好了可以很好地提高工作效率,规范工作流程。
本篇基于慕课网上一个jUnit免费在线教程总结一下自己的学习心得,整理了一下知识点。本篇主要介绍AssertEqual (断言判断)、jUnit 常用注解、jUnit套件(批量执行测试用例)、jUnit 参数化设置(多组数据同时测试).

参考资料
jUnit官网: http://junit.org/junit4/
慕课网资源: http://www.imooc.com/video/6842

jUnit环境

  • JDK 环境
  • jUnit jar包 (eclipse 里自带有,可以直接在项目 Properties -> Java Build Path -> Libraries -> Add Library -> [ jUnit ] 来添加; 也可自己下载jar包导入)

jUnit HelloWorld

1. 创建基础类

新建一个 Calculate.java 类,里面建立两个方法,一个加法,一个除法。

package com.daniel.util;

public class Calculate {
    public int add(int a,int b) {
        return a+b;
    }
    public int divide(int a,int b) {
        return a/b;
    }

}

2. 创建junit test case 类

Calculate.java 上右键,New 一个 junit test case

新建junit test case

首先会让你选择创建的方法块,这里可以暂时先不管,后面讲解。直接Next:

选择创建的方法块

这里可以选择需要创建测试的方法,而不用再自己手敲测试方法的声明:
选择测试方法

3. 编写测试方法

下面的代码分别使用 2和3 测试加法结果是否 等于5 、使用 6 和 3 测试除法结果是否为 2;

package com.daniel.util;

import static org.junit.Assert.*;
import org.junit.Test;

public class CalculateTest {

    @Test
    public void testAdd() {
        assertEquals(5, new Calculate().add(2, 3));
    }

    @Test
    public void testDivide() {
        assertEquals(2, new Calculate().divide(6, 3));
    }
}

4. 执行测试用例

直接将 CalculateTest.java run as junit Test即可,会显示执行结果与执行时间。
测试用例执行结果

解释一下上面的测试用例中各部分的含义:
Runs : 2/2 共有2个测试方法,执行了2个;
Errors: 0 没有代码异常错误;
Failures:0 没有测试失败的,即计算结果均与预期一致;
绿色长条: 表示所有测试都通过了。(如果失败会是红色);
最下面是都执行了哪些测试类和方法,都用时多久。(由于我们的测试用例只是简单的算术运算,时间小于1ms,所以只看到0)

5. Failures 与 Errors 的区别

上一节中的测试结果中,Failures 与 Errors是不同的两部分:
Failures:测试失败,即程序计算结果与预期结果不符,Assert失败,比如 2+3 预期值 填为 6。
Errors:测试错误,一般是代码错误导致,与Assert无关,比如除法运算计算 6/0 则属于 Error ,因为会抛出 算术异常。

6. 备注

创建测试用例注意事项:

  • 测试方法必须用 @Test 进行修饰;
  • 测试方法必须使用 public void 修饰,不能带任何参数;
  • 每个测试方法必须可以独立运行,各个测试方法之间不能有依赖;

为了规范代码,建议做到以下几点:

  • 为测试代码建立独立的源代码包,且命名与被测试类的包命名保持一致(如 src/A/B 与 test/A/B);
  • 测试用例的类名以XXXTest.java命令,测试类中的方法以testXXX()命名。

测试用例注解

@BeforeClass 与 @AfterClass

@BeforeClass : 使用 @BeforeClass 修饰的方法,会在测试用例加载前执行且只执行一次 ,一般用于加载配置文件、建立数据库连接等只需要执行一次的初始化设置。

@AfterClass : 使用 @AfterClass 修饰的方法,会在测试用例完成后执行且只执行一次 ,一般用于释放资源、销毁临时对象等只需要执行一次的初始化设置。

@Before 与 @After

@Before : 使用 @Before 修饰的方法,会在测试用例中的每个测试方法执行前执行一次

@After : 使用 @After 修饰的方法,会在测试用例中的每个测试方法执行后执行一次

@Ignore

@Ignore : 使用 @Ignore 修饰的方法,会被编译器忽略,该测试方法内的内容不会被执行 。

测试用例注解范例

通过执行下述代码的测试用例来感受一下上述几个注解:

package com.daniel.util;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class CalculateTest {
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println(" @BeforeClass");
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("@AfterClass ");
    }

    @Before
    public void setUp() throws Exception {
        System.out.println("@Before ");
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("@After ");
    }

    @Ignore(" test the ignore 。。。")
    public void testIgnore(){
        System.out.println("testIgnore");
    }

    @Test
    public void testAdd() {
        System.out.println("testAdd");
        assertEquals(5, new Calculate().add(2, 3));
    }

    @Test
    public void testDivide() {
        System.out.println("testDivide");
        assertEquals(2, new Calculate().divide(6, 3));
    }

}

执行结果如下:
测试用例注解执行结果

jUnit Suite套件(批量执行测试用例)

Suite实例

当我们有多个待测试类的时候,并且希望一起执行的时候,就要用到Suite了。为了方便演示,我们定义三个测试类 Task1Test,Task2Test,Task3Test,里面都编写一个输出起类名的测试方法。

  • 基础测试类 (Task2Test,Task3Test 类似)
package com.daniel.util;

import org.junit.Test;

public class Task1Test {

    @Test
    public void test() {
        System.out.println(this.getClass().getName());
    }

}
  • Suite类
package com.daniel.util;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

/* 更改默认的测试运行器为 Suite*/
@RunWith(Suite.class)

/* 使用 Suite 执行 Task1Test.class,Task2Test.class,Task3Test.class*/
@Suite.SuiteClasses({Task1Test.class,Task2Test.class,Task3Test.class})

/* 类里面保留为空 */
public class SuiteTest {

}

执行结果

Suite执行结果

jUnit 参数化设置Parameterized(多组数据同时测试)

Parameterized 实例

有些情况可能一组数据并不能达到我们的测试目的,例如我们需要进行多组数据同事测试,更常见是边界值测试,如果我们希望不同组数据执行相同的测试方法,则可考虑参数化设置。

下面演示一下对 几组数据执行加法的测试。

package com.daniel.util;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

// 1.更改默认的测试运行器为RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class ParameterTest {

    // 2.声明变量来存放预期值 和 输入值
    int expected =0;
    int input1 = 0;
    int input2 = 0;

    // 3.声明一个返回值 为Collection的公共静态方法,并使用@Parameters进行修饰
    @Parameters
    public static Collection<Object[]> t() {
        return Arrays.asList(new Object[][]{
                {5,2,3},
                {1,-1,2},
                {0,0,0}
        }) ;
    }

    // 4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
    public ParameterTest(int expected,int input1,int input2) {
        this.expected = expected;
        this.input1 = input1;
        this.input2 = input2;
    }

    @Test
    public void testAdd() {
        assertEquals(expected, new Calculate().add(input1, input2));
    }

}

执行结果

Parameterized

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值