您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
探索JUnit 4.4特性
作者:網絡轉載 發(fā)布時間:[ 2013/3/12 16:00:38 ] 推薦標簽:

    如何使用理論機制

    在 JUnit 4.4 的理論機制中,每個測試方法不再是由注釋 @Test 指定的無參測試函數(shù),而是由注釋 @Theory 指定的帶參數(shù)的測試函數(shù),這些參數(shù)來自一個數(shù)據集(data sets),數(shù)據集通過注釋 @DataPoint 指定。

    JUnit 4.4 會自動將數(shù)據集中定義的數(shù)據類型和理論測試方法定義的參數(shù)類型進行比較,如果類型相同,會將數(shù)據集中的數(shù)據通過參數(shù)一一傳入到測試方法中。數(shù)據集中的每一個數(shù)據都會被傳入到每個相同類型的參數(shù)中。這時有人會問了,如果參數(shù)有多個,而且類型都和數(shù)據集中定義的數(shù)據相同,怎么辦?答案是,JUnit 4.4 會將這些數(shù)據集中的數(shù)據進行一一配對組合(所有的組合情況都會被考慮到),然后將這些數(shù)據組合統(tǒng)統(tǒng)通過參數(shù),一一傳入到理論的測試方法中,但是用戶可以通過假設機制(assumption)在斷言函數(shù)(assertion)執(zhí)行這些參數(shù)之前,對這些通過參數(shù)傳進來的數(shù)據集中的數(shù)據進行限制和過濾,達到有目的地部分地將自己想要的參數(shù)傳給斷言函數(shù)(assertion)來測試。只有滿足所有假設的數(shù)據才會執(zhí)行接下來的測試用例,任何一個假設不滿足的數(shù)據,都會自動跳過該理論測試函數(shù)(假設 assumption 不滿足的數(shù)據會被忽略,不再執(zhí)行接下來的斷言測試),如果所有的假設都滿足,測試用例斷言函數(shù)不通過才代表著該理論測試不通過。

    清單 13 理論機制舉例

import static org.hamcrest.Matchers.*; //指定接下來要使用的Matcher匹配符
import static org.junit.Assume.*; //指定需要使用假設assume*來輔助理論Theory
import static org.junit.Assert.*; //指定需要使用斷言assert*來判斷測試是否通過

import org.junit.experimental.theories.DataPoint; //需要使用注釋@DataPoint來指定數(shù)據集
import org.junit.experimental.theories.Theories; //接下來@RunWith要指定Theories.class
import org.junit.experimental.theories.Theory; //注釋@Theory指定理論的測試函數(shù)
import org.junit.runner.RunWith; //需要使用@RunWith指定接下來運行測試的類

import org.junit.Test;

//注意:必須得使用@RunWith指定Theories.class
@RunWith(Theories.class)
public class TheoryTest {

    //利用注釋@DataPoint來指定一組數(shù)據集,這些數(shù)據集中的數(shù)據用來證明或反駁接下來定義的Theory理論,
    //testNames1和testNames2這兩個理論Theory測試函數(shù)的參數(shù)都是String,所以Junit4.4會將這5個
    //@DataPoint定義的String進行兩兩組合,統(tǒng)統(tǒng)一一傳入到testNames1和testNames2中,所以參數(shù)名year
    //和name是不起任何作用的,"2007"同樣有機會會傳給參數(shù)name,"Works"也同樣有機會傳給參數(shù)year
    @DataPoint public static String YEAR_2007 = "2007";
    @DataPoint public static String YEAR_2008 = "2008";
    @DataPoint public static String NAME1 = "developer";
    @DataPoint public static String NAME2 = "Works";
    @DataPoint public static String NAME3 = "developerWorks";

    //注意:使用@Theory來指定測試函數(shù),而不是@Test
    @Theory
    public void testNames1( String year, String name ) {
        assumeThat( year, is("2007") ); //year必須是"2007",否則跳過該測試函數(shù)
        System.out.println( year + "-" + name );
        assertThat( year, is("2007") ); //這里的斷言語句沒有實際意義,這里舉此例只是為了不中斷測試
    }

    //注意:使用@Theory來指定測試函數(shù),而不是@Test
    @Theory
    public void testNames2( String year, String name ) {
        assumeThat(year, is("2007")); //year必須是"2007",否則跳過該測試函數(shù)
        //name必須既不是"2007"也不是"2008",否則跳過該測試函數(shù)
        assumeThat(name, allOf( not(is("2007")), not(is("2008"))));
        System.out.println( year + "-" + name );
        assertThat( year, is("2007") ); //這里的斷言語句沒有實際意義,這里舉此例只是為了不中斷測試
    }


結果輸出:
第一個Theory打印出:
2007-2007
2007-2008
2007-developer
2007-Works
2007-developerWorks
第二個Theory打印出:
2007-developer
2007-Works
2007-developerWorks

    結束語

    本文通過詳細深入的理論介紹和簡單易懂的實例全面剖析了 JUnit 4.4 的三個新特性:

    提供了新的斷言語法(assertion syntax)——assertThat提供了假設機制(assumptions)

    提供了理論機制(Theories)

    相信讀者看完后一定會對 JUnit 4.4 有著非常深入的了解并可以輕松將其運用到自己的開發(fā)工程中。 

上一頁1234567下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd