junit 单元测试

1.  junit

JUnit是一个Java语言的单元测试框架(回归测试框架)。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。
Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。


2.  junit 3. 和 junit 4区别

简言之: JUnit4最大的特点是引入了Java5的注释Annotation
因jdk5中的新特性,JUnit4也因此有了很大的改变。确切的说,Junit4简直就不是3的扩展版本,而是一个全新的测试框架。

分类 junit 3 junit4
继承类 需要继承TestCase类 已经不需要继承TestCase

初始化/释放资源
需要覆盖TestCase中的setUp和tearDown方法 只需要在方法前加上@Before,@After
对某个方法进行测试时
必须让这个方法以testXX开头
在方法的前面加上@Test
仅调用一次
如果想仅调用一次setUp()和tearDown() for  all test cases,
 使用TestSetup类
@BeforeClass 和 @AfterClass
断言 junit3中由于继承了TestCase,
这个TestCase就可以直接assert
junit4需要先引入Assert类,
这个类中有大量的静态方法进行断言的处理


添加了新的断言assertEquals
异常处理
旧式的异常测试是在抛出异常的代码中放入 try 块,
然后在 try 块的末尾加入一个 final() 语句
添加@Test,使用参数“expected”,
并指明抛出异常的Exception类
暂时不进行的test case
(junit 3 ,4相同)
在该方法前添加@Ignore
@Ignore("Not Ready to Run")        
@Test
在该方法前添加@Ignore
@Ignore("Not Ready to Run")        
@Test
设置超时
(junit 3 ,4相同)
在@Test,使用"timeout"参数(毫秒)
@Test(timeout=3000)
在@Test,使用"timeout"参数(毫秒)
@Test(timeout=3000)
参数化测试 不具备 junit的参数化是在类级别的,
即,每循环一次都将要执行整个类,包括@before和@after
为了能够在JUnit3环境下run JUnit4 test

提供了JUnit4Adapter


public static junit.framework.Test suite() {        
        return new JUnit4TestAdapter(SimpleMathTest.class);        
}  

参考:
http://0411.iteye.com/blog/1048294
http://android.blog.51cto.com/268543/50979/

3.   junit 4 实例

(1) 在Eclipse中使用JUnit4进行单元测试

http://blog.csdn.net/andycpp/article/details/1327147

(2)junit 测试 dao-service-controller  视频

http://www.chuanke.com/v2381598-131946-351634.html

(3) junit 数据 驱动测试 (参数化测试)

参数化测试编写流程如下:
a.为参数化测试类用@RunWith注释指定特殊的运行器:Parameterized.class;
b.在测试类中声明几个变量,分别用于存储期望值和测试用的数据,并创建一个使用者几个参数的构造函数;
c.创建一个静态(static)测试数据供给(feed)方法,其返回类型为Collection,并用@Parameter注释以修饰;
d.编写测试方法(用@Test注释)。

注:
junit的参数化是在类级别的,即,每循环一次都将要执行整个类,包括@before和@after;
TestNG的参数化是在测试级别的。

对Calculator类进行参数化测试:
<span style="font-size:14px;">package com.mengdd.junit4;

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

    public int subtract(int a, int b)
    {
        return a - b;
    }

    public int multiply(int a, int b)
    {
        return a * b;
    }

    public int divide(int a, int b) throws Exception
    {
        if (0 == b)
        {
            throw new Exception("除数不能为0");
        }
        return a / b;
    }

}</span>

测试加法的测试类:
<span style="font-size:14px;">package com.mengdd.junit4;

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

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

@RunWith(Parameterized.class)
// 指定运行器runner:使用参数化运行器来运行
public class ParametersTest
{
    private int expected;// 期待的结果值

    private int input1;// 参数1

    private int input2;// 参数2

    private Calculator calculator = null;

    @Parameters
    public static Collection prepareData()
    {
        // 测试数据
        Object[][] objects = { { 3, 1, 2 }, { -4, -1, -3 }, { 5, 2, 3 },
                { 4, -4, 8 } };
        return Arrays.asList(objects);// 将数组转换成集合返回

    }

    @Before
    public void setUp()
    {
        calculator = new Calculator();
    }

    public ParametersTest(int expected, int input1, int input2)
    {
        // 构造方法
        // JUnit会使用准备的测试数据传给构造函数
        this.expected = expected;
        this.input1 = input1;
        this.input2 = input2;
    }

    @Test
    public void testAdd()
    {
        Assert.assertEquals(this.expected,
                calculator.add(this.input1, this.input2));
    }

}</span>

参数化测试参考:

http://www.cnblogs.com/mengdd/archive/2013/04/13/3019336.html
http://blog.csdn.net/lofder_nean/article/details/8509044

4.  junit  教程

http://www.yiibai.com/junit/

你可能感兴趣的:(junit 单元测试)