1. 程式人生 > >軟體測試_JUnit+Ant構建自動的單元測試(2)

軟體測試_JUnit+Ant構建自動的單元測試(2)

引數化測試

和建立Test Case差不多,不過需要:
為測試類新增@RunWith(Parameterized.class),@RunWith 用來執行套件測試
否則Junit的預設執行無參構造方法,右鍵直接執行就難了:

java.lang.Exception: Test class should have exactly one public zero-argument constructor

建立一個公共的建構函式,用於接受測試資料
這裡還是三角形判斷方法為例,則引數abc對應三邊,result為預期結果

    public TestTriangle
(Integer a, Integer b, Integer c, Integer result) { this.a = a; this.b = b; this.c = c; this.result = result; }**

建立一個公共的靜態方法,帶有@Parameters (或@Parameterized.Parameters),它返回一個Collection來作為測試資料集合
這裡的順序和構造方法的引數列表順序一樣,所以依次為a、b、c、result

    @Parameterized.Parameters
    public
static Collection primeNumbers() { return Arrays.asList(new Object[][] { { 3, 3, 3, 3 }, { 3, 3, 4, 2 }, { 3, 4, 5, 1 }, { 3, 4, 9, 1 }, { 3, 4, -1, -1 } }); }

為每組測試資料建立一個例項變數,以此建立你的測試用例
所以修改測試方法如下,被測試類也可以作為測試用例的field

    /**
     * Test method for {@link Triangle#judgeTrangle(int, int, int)}.
     */
    @Test
    public void testJudgeTrangle() {
        //fail("Not yet implemented"); // TODO
        System.out.println("Parameterized Number is : " + a +", "+b+", "+c);
        Triangle t = new Triangle();
        assertEquals(this.result, t.judgeTrangle(this.a, this.b, this.c));
    }

執行結果
因為{ 3, 4, 9, 1 }這一組的結果(測試為0)和預期的1不一樣,所以會有Failure
引數化測試執行

試過直接在測試方法內測試所有資料,結果覆蓋率較低
想不到是什麼描述

Ant執行測試
測試用例的測試結果與預期相同時
ant

不相同時
這裡寫圖片描述

附:完整程式碼

package test;
import static org.junit.Assert.*;

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

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import test.Triangle;
import junit.framework.TestCase;

/**
 * 
 */
/** 
 * @author bottomheater  Email:[email protected]
 * @version 建立時間:2016年6月14日 下午9:06:13 
 * 類說明 
 */
/**
 * @author Administrator
 *
 */
@RunWith(Parameterized.class)
public class TestTriangle{

    private Integer a;
    private Integer b;
    private Integer c;
    private Integer result;


    @Parameterized.Parameters
    public static Collection primeNumbers() {
        return Arrays.asList(new Object[][] {
             { 3, 3, 3, 3 },
             { 3, 3, 4, 2 },
             { 3, 4, 5, 1 },
             { 3, 4, 9, 1 },
             { 3, 4, -1, -1 }
        });
    }

    public TestTriangle(Integer a, Integer b, Integer c, Integer result) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.result = result;
    }

    /**
     * Test method for {@link Triangle#judgeTrangle(int, int, int)}.
     */
    @Test
    public void testJudgeTrangle() {
        //fail("Not yet implemented"); // TODO
        System.out.println("Parameterized Number is : " + a +", "+b+", "+c);
        Triangle t = new Triangle();
        assertEquals(this.result, t.judgeTrangle(this.a, this.b, this.c));
    }

}