单元测试 Junit

一、Junit概述

1. Junti简介 

JUnit是一个回归测试框架,用于Java开发人员编写单元测试之用。现在开源测试工具,很多都是对于JUnit的扩展。

JUnit目前主要有3.8与4.0两个版本,区别比较大,为编写单元测试提供了主要的接口。目前主流的IDE都提供了对于JUnit的支持。 

2. 使用junit注意事项

测试的方法返回值必须是void。

标准的命名规则是test+方法名。

不能有参数。

3. 如何测试

明确需求。

知道输入什么,知道出现什么结果。

知道输入什么,知道不该出现什么结果。

4. Junti类管理

一般我们的测试类放在项目test文件夹。

测试包名可以和项目被测类所使用的包名一样。

测试类的取名一般为测试类名+Test。

5. 编写测试代码的技巧

测试方法的执行顺序是不确定的。

不要用TestCase的构造函数初始化Fixture,而要用setUp()和tearDown()方法。 

当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。

测试类和测试方法应该有一致的命名方案。

测试要尽可能地小,执行速度快。

二、Junit的使用

1. JUnit3的单元测试 

测试类需要继承TestCase。

测试方法必须用test开头,不能包含返回值,不能包括参数。

使用setUp()方法进行初始化环境。每一个测试用例都会执行该方法。

使用teardown()方法清理测试环境,如可以进行数据库还原恢复等操作。每一个测试用例都会执行该方法。

下面使用具体示例了解Junit3的单元测试实现。

被测试类:

public class Calculator {
      public int add(int num1,int num2){
          return num1 + num2;
      }
}
Junit3单元测试实现:
import junit.framework.TestCase;
import static org.junit.Assert.*;
public class CalculatorTest extends TestCase{

    public void setUp() throws Exception {
    }

    public void tearDown() throws Exception {
    }

    public void testAdd() {
        int num1 = 1;
        int num2 = 2;
        Calculator obj = new Calculator();
        int expResult = 3;
        int result = obj.add(num1, num1);
        assertEquals(expResult, result);
    }

}

2. JUnit4的测试

可以不继承TestCase类。

测试方法名可以和被测试的名称一样,需要在方法名上加上@Test标签注解。

初始化测试环境:随便写一个方法,如:initData(){},加上@Before标签注解。

清理测试环境:随便写一个方法,如:clearData(){},加上@After标签注解。

注意:@Before和@After注释的方法只能各有一个。这个取代了JUnit以前版本中的setUp和tearDown方法。

Junit4单元测试实现:

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

public class CalculatorTest{

    @Before
    public void initData() throws Exception {
    }

    @After
    public void clearData() throws Exception {
    }

    @Test
    public void testAdd() {
        int num1 = 1;
        int num2 = 2;
        Calculator cal = new Calculator();
        int expResult = 3;
        int result = cal.add(num1, num1);
        assertEquals(expResult, result);
    }
    
}

三、Junit4元数据

@Before:

使用了该元数据的方法在每个测试方法执行之前都要执行一次。

@After:

使用了该元数据的方法在每个测试方法执行之后要执行一次。

@Test(expected=*.class)

在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型。

@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,

如果测试方法在制定的时间之内没有运行完,则测试也失败。

@ignore:

该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

四、组装一个测试套件并运行

1. Junit3中创建测试套件示例

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 * JUnit3.8中批量运行所有的测试类。。直接在该类上Run As JUnit Test即可
 * @see 这里就用到了设计模式中典型的组合模式,即将不同的东西组合起来
 * @see 组合之后的东西,即可以包含本身,又可以包含组成它的某一部分
 * @see TestSuite本身是由TestCase来组成的,那么TestSuite里面就可以包含TestCase
 * @see 同时TestSuite里面还可以继续包含TestSuite,形成一种递归的关系
 * @see 这里就体现出来了,所以这是一种非常非常好的设计模式,一种好的策略
 */
public class TestAll extends TestCase {
    //方法名固定的,必须为public static Test suite()
    public static Test suite() {
        //TestSuite类实现了Test接口
        TestSuite suite = new TestSuite();
        //这里传递的是测试类的Class对象。该方法还可以接收TestSuite类型对象
        suite.addTestSuite(CalculatorTest.class);
        suite.addTestSuite(MyStackTest.class);
        return suite;
    }
}

2.Junit4中创建测试套件

JUnit4中测试套件的创建步骤:

① 创建一个空类作为测试套件的入口

② 使用org.junit.runner.RunWith 和org.junit.runners.Suite.SuiteClasses注解 修饰该空类

③ 将org.junit.runners.Suite 作为参数传入RunWith注解,即使用套件运行器执行此类

④ 将需要放入此测试套件的测试类组成数组,作为SuiteClasses注解的参数

⑤ 保证这个空类使用public 修饰,而且存在公开的不带有任何参数的构造函数

Junit4中创建测试套件示例:

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

/**
 * JUnit4.x测试套件的举例
 * @see 下面的CalculatorTest.class和ParameterTest.class均为我们自己编写的JUnit4单元测试类
 */
@RunWith(Suite.class)
@SuiteClasses({CalculatorTest.class,MyStackTest.class})
public class TestAll {
}



部分资料来源:http://blog.csdn.net/everwhl/article/details/8891585


转载于:https://my.oschina.net/hongdengyan/blog/181770

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值