【訳】TestNG公式文書中国語版(07)——試験方法、試験類と試験グループ(5.7-5.12)


5.7-工場


工場では、テストを動的に作成できます.たとえば、テストメソッドを作成し、Webページに複数回アクセスし、毎回異なるパラメータを持つ必要があるとします.
public class TestWebServer {
 
@Test(parameters = { "number-of-times" })
 
public void accessPage(int numberOfTimes) {
   
while (numberOfTimes-- > 0) {
     
// access the web page
   
}
 
}
}
testng.xml:
<test name="T1">
  
<parameter name="number-of-times" value="10"/>
  
<class name= "TestWebServer" />
</test>

<test name="T2">
  
<parameter name="number-of-times" value="20"/>
  
<class name= "TestWebServer"/>
</test>

<test name="T3">
  
<parameter name="number-of-times" value="30"/>
  
<class name= "TestWebServer"/>
</test>

パラメータが多くなると管理が難しくなるので、工場を使ってやるべきです.
public class WebTestFactory {
 
@Factory
 
public Object[] createInstances() {
   
Object[] result = new Object[10];  
   
for (int i = 0; i < 10; i++) {
      result
[i] = new WebTest(i * 10);
   
return result;
 
}
}
の新しいテストクラスは次のとおりです.
public class WebTest {
 
private int m_numberOfTimes;
 
public WebTest(int numberOfTimes) {
    m_numberOfTimes
= numberOfTimes;
 
}

 
@Test
 
public void testServer() {
   
for (int i = 0; i < m_numberOfTimes; i++) {
     
// access the web page
   
}
 
}
}

あなたのtestng.xmlはファクトリメソッドを含むクラスを参照するだけで、テストインスタンスは実行時に作成されます.
<class name="WebTestFactory" />

ファクトリメソッドは、@Testおよび@Before/Afterタグなどのパラメータを受け入れることができ、Object[]を返します.これらの返されるオブジェクトは任意のクラス(必ずしもファクトリメソッドと同じクラスではない)であり、TestNG注釈さえ必要としない(例ではTestNGに無視される)

5.8-クラスレベルの注記

通常@Testは、メソッドだけでなくクラスを注釈するためにも使用できます.
@Test
public class Test1 {
 
public void test1() {
 
}

 
public void test2() {
 
}
}
クラスにある@Testは、すでにマークアップされているかどうかにかかわらず、クラス内のすべてのpublicメソッドをテストメソッドにします.もちろん、@Test注記を使用して、特に特別なプロパティを追加する場合は、テスト方法を繰り返し表示できます.
例:
@Test
public class Test1 {
 
public void test1() {
 
}

 
@Test(groups = "g1")
 
public void test2() {
 
}
}
前例ではtest 1()もtest 2()も処理されたが、その上でtest 2()は現在もグループ「g 1」に属している.
 

5.9-タイムアウト時に並列に実行

suiteラベルで使用できます
parallelプロパティを使用して、テストメソッドを異なるスレッドで実行します.このプロパティには、次のような値があります.
<suite name="My suite" parallel="methods" thread-count="5">
<suite name="My suite" parallel="tests" thread-count="5">
<suite name="My suite" parallel="classes" thread-count="5">
  • parallel="methods":TestNGは、互いに依存しない限り、異なるスレッドでテストメソッドを実行します.相互に依存するメソッドは、同じスレッドで実行され、その実行順序に従います.
  • parallel="tests":TestNGは同じスレッドで同じタグの下のすべてのメソッドを実行しますが、各ラベルのすべてのメソッドは異なるスレッドで実行されます.これにより、すべての非スレッドセキュリティクラスを同じラベルの下にグループ化し、TestNGマルチスレッドの特性を利用しながら、これらのクラスを同じスレッドで実行することができます.
  • parallel="classes":TestNGは同じスレッド内の同じクラスですべてのメソッドを実行しますが、各クラスは異なるスレッドで実行されます.

  • さらに、プロパティthread-countを使用すると、現在の実行に実行可能なスレッドの数を指定できます.
    注意:@TestのプロパティtimeOutは、パラレルモードと非パラレルモードの両方で動作します.
    @Testメソッドが異なるスレッドで呼び出されることも指定できます.属性threadPoolSizeを使用して実装できます.
    @Test(threadPoolSize = 3, invocationCount = 10,  timeOut = 10000)
    public void testServer() {
    の前例では、メソッドtestServerは3つのスレッドで10回呼び出されます.さらに、10秒のタイムアウト設定により、これら3つのスレッドのいずれも、現在呼び出されているスレッドをブロックしないことが保証されます.

    5.10-再実行に失敗したテスト

    テストsuiteが失敗するたびにTestNGは出力ディレクトリにtestng-failedというテストを作成する.xmlのファイル.このXMLファイルには、失敗したテストを再実行するための必要な情報が含まれています.これにより、テスト全体を実行する必要がなく、失敗したテストを迅速に再実行できます.したがって、典型的なセッションは次のように見えます.
    java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs testng.xml
    java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs test-outputs/testng-failed.xml

    注意したいのはtestng-failed.xmlには、すべての失敗メソッドの実行に必要な依存性が含まれているため、前回失敗したメソッドにSKIPが発生しないことを完全に保証できます.

    5.11-JUnitテスト

    TestNGはJUnitテストを実行できます.やるべきことはすべてtestngです.ClassNamesプロパティで実行するJUnitテストクラスを設定し、testng.junitプロパティはtrueに設定されています.
    <test name="Test1"   junit="true">
     
    <classes>
       
    <!-- ... -->

    TestNGがこのような状況で表現した行為はJUnitと似ている.
  • すべてのクラスで実行するテストメソッドはtest*の最初の
  • から開始します.
  • クラスにsetUp()メソッドがある場合、各テストメソッドの実行前に
  • が呼び出される.
  • クラスにtearDown()メソッドがある場合、各テストメソッドの後に
  • が呼び出されます.
  • テストクラスがsuite()メソッドを含む場合、このメソッドによって返されるすべてのテストクラスが
  • 呼び出されます.

    5.12 - JDK 1.4

    TestNGはJDK 1.4でも動作します.JDK 1.4 jarを使用して、リリース版で見つけることができます(名前は
    testng-...-jdk14.jar).唯一の違いは、ポピュラーなXDoclet JavaDoc注釈構文を使用する注釈の方法です.
    public class SimpleTest {
     
    /**
      * @testng.before-class = "true"
      */

     
    public void setUp() {
       
    // code that will be invoked when this test is instantiated
     
    }
     
    /**
      * @testng.test groups = "functest" dependsOnGroups = "group1,group2"
      */

     
    public void testItWorks() {
       
    // your test code
     
    }
    }

    JavaDoc構文の規則はかなり直接的であり、JDK 1.5注記と唯一異なるのは、文字列配列が単一のカンマまたはスペースで区切られた形式で表されることである.ただし、値を二重引用符で表記する場合はオプションですが、後でJDK 1.5に移行するのが容易になるように二重引用符を使用することを強くお勧めします.
    また、antタスクを使用してタグにsourcedirプロパティ(または-sourcedirがコマンドラインの下にある)を指定する必要があります.これにより、TestNGはテストファイルを順番に見つけ、JavaDoc注釈を解析することができます.
    下書きはJDK 1.4とJDK 5の注釈の異同を比較することである.
    JDK 5
    JDK 1.4
    @Test(groups = { "a", "b"},dependsOnMethods = { "m1"})
    /*** @testng.test groups = "a b"*              dependsOnMethods = "m1"*/
    @AfterMethod(alwaysRun = true)
    /*** @testng.before-method alwaysRun = "true"*/
    @Parameters({ "first-name", "last-name"})
    /*** @testng.parameters value = "first-name last-name"*/
    @Factory@Parameters({ "first-name", "last-name"})
    /*** @testng.factory* @testng.parameters value = "first-name last-name"*/
    @DataProvider(name = "test1")
    /*** @testng.data-provider name="test1"*/
    TestNG's JDK 1.4の例とサポートについては、JavaDoc注釈にマッピングされた完全なJDK 1.5の説明を含むリリース版のtest-14/ディレクトリを参照してください.