天天看點

testNG小試牛刀

    testNG是一個測試架構,其靈感來自JUnit和NUnit的,但引入了一些新的功能,使其功能更強大,使用更友善。

    testNG是一個開源自動化測試架構;testNG表示下一代。 testNG是類似于JUnit(特别是JUnit 4),但它不是一個JUnit擴充。它的靈感來源于JUnit。它的目的是優于JUnit的,尤其是當測試內建的類。 testNG的創造者是Cedric Beust(塞德裡克·博伊斯特)

    testNG消除了大部分的舊架構的限制,使開發人員能夠編寫更加靈活和強大的測試。 因為它在很大程度上借鑒了Java注解annotation(JDK5.0引入的)來定義的測試,它也可以告訴你如何使用這個新功能在真實的Java語言生産環境中。

testNG的特點:

  • 注解
  • testNG使用Java和面向對象的功能
  • 支援綜合類測試(例如,預設情況下,沒有必要建立一個新的測試每個測試方法的類的執行個體)
  • 獨立的編譯時間測試代碼運作時配置/資料資訊
  • 靈活的運作時配置
  • 主要介紹“測試組”。當編譯測試,隻要問testNG運作所有的“前端”的測試,或“快”,“慢”,“資料庫”等
  • 支援依賴測試方法,并行測試,負載測試,局部故障
  • 靈活的插件API
  • 支援多線程測試

  testNG.xml檔案記錄了一些非常簡單的術語。xml是一個以XML記錄所有測試的檔案口這個檔案能夠很容易地在一個檔案中描述所有測試套件和它們的參數,可以将它簽人到代碼庫中,或通過電子郵件發送給其他組員。也可以很容易地提取測試的子集,或分成幾種運作時配置。這個檔案并不是運作testNG所必須的。

  一個suite(套件)由一個或多個測試組成。

  一個test(測試)由一個或多個類組成。

  一個class(類)由一個或多個方法組成。

testNG相對于junit的一些優點:

  1. testNG是一個設計用來簡化廣泛的測試需求的測試架構,從單元測試到內建測試這個是testNG設計的出發點,不僅僅是單元測試,而且可以用于內建測試。設計目标的不同,對比junit的隻适合用于單元測試,testNG無疑走的更遠。可以用于內建測試,這個特性是我選擇testNG的最重要的原因。

  2. 測試的過程的三個典型步驟,注意和junit(4.0)相比,多了一個将測試資訊添加到testng.xml檔案或者build.xml測試資訊尤其是測試資料不再寫死在測試代碼中,好處就是修改測試資料時不需要修改代碼/編譯了,進而有助于将測試人員引入單元測試/內建測試。

  3. 基本概念,相比junit的TestCase/TestSuite,TestNG有suite/test/test method三個級别,即将test/test method明确區分開了。

基本使用:

  1、異常處理

     testNG可以簡單友善的檢測異常的發生,通過@ExpectedExceptions标注預期捕獲的異常,當确實發生預期的異常,testNG認為測試通過。也可以指定标注多個異常。

@Test (expectedExceptions={Exception.class,Exception2.class})

使用這個來支援異常的測試有兩個優點:

  • 使我們的意圖變得非常清楚,隻要看下@test就知道将會發生什麼
  • 消除了try、catch、fail空語句給代碼帶來的幹擾,讓代碼注重于業務邏輯。

像一次抛出多個異常,我們還是沒有辦法決定具體是那個異常沒有抛出,這樣就會想到分開測試單個異常。如:

測試類中的每個方法隻關注一個非常具體的任務,這符合軟體過程原則,單一職責原則。

2、失敗處理

     當testNG運作的case有失敗的時候,會在test-output目錄下生成一個testng-failed.xml檔案,這對于批量執行測試定位問題很有幫助,testng可以單獨執行這些失敗的測試。

有以下測試檔案:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

public

class

testngTest {

@Test

public

void

depend(){

}

@Test

(dependsOnMethods = 

"depend"

)

public

void

f(){

throw

new

RuntimeException();

}

@Test

public

void

failed(){

throw

new

RuntimeException();

}

}

産生的testng-failed.xml:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

<?

xml

version

=

"1.0"

encoding

=

"UTF-8"

?>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<

suite

guice-stage

=

"DEVELOPMENT"

name

=

"Failed suite [Default suite]"

>

<

test

name

=

"Default test(failed)"

>

<

classes

>

<

class

name

=

"com.wt.others.testngTest"

>

<

methods

>

<

include

name

=

"failed"

/>

<

include

name

=

"depend"

/>

<

include

name

=

"f"

/>

</

methods

>

</

class

<!-- com.wt.others.testngTest -->

</

classes

>

</

test

<!-- Default test(failed) -->

</

suite

<!-- Failed suite [Default suite] -->

說明這failed和f方法都失敗了,由于f方法依賴了depend的方法,是以depend方法也被列出來。不僅包含失敗的方法,也包含它所依賴的方法。

那麼修改之後,隻需要運作這個檔案就能夠很容易的調試失敗的測試方法。

3、使用參數

  testNG傳參數的兩種方式(xml檔案,@DataProvider)

  • 使用testng.xml設定參數

   參數在xml檔案中可以在suite級别定義,也可以在test級别定義;testNG會嘗試先在包含目前類的test标簽中尋找參數,如果沒找到則在上層的suite标簽中查找。即在test标簽中相同的參數對目前類目前方法的優先級比較高。 testNG支援這種傳參方式的類型如下:String、 int/Integer、boolean/Boolean、 byte/Byte、 char/Character、 double/Double、 float/Float、 long/Long、 short/Short。對于非上述類型TestNG無法通過這種方式進行傳參,可以通過@DataProvider方式傳參

  •  DataProvider方式傳參

       隻提供了一個字元串屬性:名稱,供測試方法作為傳遞參數的annotation使用兩種DataProvider,一種是傳回一個二維數組對象,如上面的例子;另外一種DataProvider是傳回一個Iterator,DataProvider可以向測試方法傳遞任意類型任意數目的參數,利用DataProvider提供不同的參數集合對一個測試方法進行多次調用。

4、Annotation

  快速預覽,這些可以在官方的文檔上找到更詳細的資料。

  @BeforeSuite:        被注釋的方法将在所有測試運作前運作

  @AfterSuite:        被注釋的方法将在所有測試運作後運作

  @BeforeTest:        被注釋的方法将在測試運作前運作

  @AfterTest:        被注釋的方法将在測試運作後運作

  @BeforeGroups:        被配置的方法将在清單中的gourp前運作。這個方法保證在第一個屬于這些組的測試方法調用前立即執行。

  @AfterGroups:        被配置的方法将在清單中的gourp後運作。這個方法保證在最後一個屬于這些組的測試方法調用後立即執行。

  @BeforeClass:        被注釋的方法将在目前類的第一個測試方法調用前運作。

  @AfterClass:        被注釋的方法将在目前類的所有測試方法調用後運作。

  @BeforeMethod:        被注釋的方法将在每一個測試方法調用前運作。

  @AfterMethod:        被注釋的方法将在每一個測試方法調用後運作。

5、分組

  testNG的annotation有分組的功能,這些分組的名稱和編号完全由我們自己來決定。@Test(groups={"fast","database"})定義了分組之後可以在排除或者運作某個組。testNG容許執行複雜的測試方法分組。不僅可以申明方法屬于組,而且可以指定分組包含其他分組。然後TestNG可以被調用,并被要求包含某些分組和排除其他的分組。這将提供怎樣劃分測試的最大彈性,并且如果想運作兩個不同的測試裝置不需要重新編譯。

6、依賴

  有些時候,需要測試方法按照一個特定的順序被調用。這非常有用,比如:

     *在運作更多測試方法前确認特定數量的測試方法調用完成并且成功

    *初始化測試并希望這個初始化方法也作為測試方法(被标記為@Before/After的方法将不作為最終報告的一部分)

  為了做到這點,需要使用@Test注解的dependsOnMethods屬性或者dependsOnGroups屬性。

  這裡有兩種依賴:

     * 強依賴。在運作你的測試方法前所有依賴方法必須運作并且成功。哪怕有一個依賴方法失敗,測試方法都不會被調用,在報告中将被标記為SKIP。

     * 軟依賴。測試方法在依賴方法運作後總是會被運作,即使某些依賴方法失敗。對于隻想确認測試方法是按照特定順序運作,而測試方法并不真正依賴其他方法是否成功的情況下非常有用。軟依賴通過在@Test注解中增加"alwaysRun=true"來實作。

  除了上面基本的使用之外還有,testNG在并發測試、異步測試和多線程測試方面的應用等等。

  關于testng的使用可以參考官方文檔:http://testng.org/doc/documentation-main.html

  這是看了《java測試新技術--testng》這本書的一點記錄,雖沒有全部了解,但是對于很多部分還是了解了解了。知道有這麼個東西。

轉載于:https://www.cnblogs.com/silence-hust/p/4219869.html