【訳】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">
さらに、プロパティ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と似ている.
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タスクを使用して
下書きは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/ディレクトリを参照してください.