JUnit单元测试

JUnit官网
1.背景
JUnit单元测试框架是基于Java语言的主流单元测试框架,多数的Java IDE软件都已经集成了Junit单元测试框架。JUnit是由Erich Damma和Kent Beck编写的一个回归测试框架,目前主流的版本是JUnit4以上版本。


2.使用技巧
这里写图片描述

Eclipse中使用:编译器的JUnit的控制面板中,Runs:表示测试方法的总数,Errors:表示抛出异常的方法的计数器,Failures:表示测试方法失败的计数器;测试方法出现绿色的打钩表示测试方法通过。

测试方法必须用@Test修饰,而且使用public void进行修饰,不能带任何修饰方法:
assertEquals(期望值,实际值)

测试失败的两种情况
1.Failure一般表示由单元的测试使用的断言方法判断失败所引起的,即测试点出现了问题,这就是说输出的结果和我们的预期结果不一样
2.error是由代码异常引起的,它可以产生于测试代码本身的错误,也就是可能是代码本身隐藏的一个bug(测试用例不是用来你是对的,而是用来证明你没有错!)


3.JUnit的运行流程
@BeforeClass:修饰的方法会在所有方法被调用前执行,而且该方法是静态的,所以当测试类加载后接着就会运行它,而且在内存中只会存在一份实例,它比较适合加载一些配置文件;
@AfterClass:static修饰所修饰的方法通常会用来对资源的清理,比如用来关闭数据库;
@Before和@After会在每一个测试方法前后各执行一次。


JUnit的常用注解

注解名称注解含义
@Test将一个普通的方法修饰成一个测试方法
@BeforeClass修饰的方法会在所有方法被调用前执行,而且该方法是静态的,所以当测试类加载后接着就会运行它,而且在内存中只会存在一份实例,它比较适合加载一些配置文件,此注解对应的方法只能执行一次
@AfterClassstatic修饰所修饰的方法通常会用来对资源的清理,比如用来关闭数据库 ;此注解对应的方法也是只能执行一次
@Before会在每一个测试方法前执行一次
@After会在每一个测试方法hou执行一次
@Test(expected = xxx.class)将一个普通的方法修饰成一个测试方法
@Test(timeout = 毫秒)可以避免死循环或者测试性能
@Ignore(“…..”)所修饰的测试方法会被忽略
@RunWith可以更改测试运行器
@FixMethodOrder(MethodSorters.JVM)控制测试方法之间的顺序:按照JVM得到的方法顺序(代码中方法的定义顺序)执行,但是JVM不好控制,不建议使用
@FixMethodOrder(MethodSorters.NAME_ASCENDING)控制测试方法之间的顺序:按照方法名的顺序执行

示例代码
1测试demo
1.1:新建一个计算类

package com.dong.test;

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

1.2:新建一个对应上面计算类的测试类

package com.dong.test;

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculateTest {

    /*语法要求:
     *1.测试方法上必须使用@Test
     *2.测试方法用public void 修饰,而且不带参数
     *
     *规范:
     *1.新建一个源代码目录来保存测试代码
     *2.测试单元中的每个方法必须可以独立测试,测试方法之间不能有任何的依赖
     *3.测试类使用Test作为测试类的后缀
     *4.测试方法使用test作为方法名的前缀
    */
    @Test
    public void testCalculate() {
        Calculate calculate = new Calculate();
        int actual = calculate.add(1, 2);
        assertEquals(3, actual);//assertEquals("期望值", "实际值");
    }

}

2.JUnit中的运行流程

package com.dong.test;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
 * 测试单元的执行顺序
 * @author msi
 *
 */
public class JUnitFlowTest {

    @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");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }

}

运行结果:

@BeforeClass
@Before
test1
@After
@Before
test2
@After
@AfterClass


控制测试方法顺序
@FixMethodOrder(MethodSorters.JVM):按照JVM得到的方法顺序(代码中方法的定义顺序)执行,但是JVM不好控制,不建议使用
@FixMethodOrder(MethodSorters.NAME_ASCENDING):按照方法名的顺序执行

package com.dong.test;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
/**
 * @FixMethodOrder(MethodSorters.NAME_ASCENDING):按照方法名的顺序执行
 * @author msi
 *
 */
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class JUnitFlowTest {

    @Test
    public void testB() {
        System.out.println("testB");
    }

    @Test
    public void testA() {
        System.out.println("testA");
    }

    @Test
    public void testD() {
        System.out.println("testD");
    }


}

testA
testB
testD


补充:测试的思想:测试回环,也就是在测试单元中往数据库中添加了什么数据,后面应该删除该数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值