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


5.13-プログラム化運転TestNG


TestNGのテストをプログラムで簡単に呼び出すことができます.
TestListenerAdapter tla = new TestListenerAdapter();
TestNG testng = new TestNG();
testng
.setTestClasses(new Class[] { Run2.class });
testng
.addListener(tla);
testng
.run();

この例ではTestNGオブジェクトを作成し、テストクラスRun 2を実行します.TestListenerが追加されました(これはリスナーです).アダプタクラスorgも使用できます.testng.TestListenerAdapterが行う、orgを実現することもできる.testng.ITestListenerインタフェース.このインタフェースには、テストがいつ開始されるか、成功したか、失敗したかなど、さまざまなコールバック方法が含まれています.
似たようなものはtestngを使ってもいいです.xmlファイル呼び出しまたは仮想testngを作成します.xmlファイルを呼び出します.そのため、このパッケージorgを使用することができます.testng.xmlのクラス:XmlClass、XmlTestなど.各クラスはxmlで対等なラベルに対応しています.
たとえば、次のような仮想ファイルを作成するとします.
<suite name="TmpSuite" >
 
<test name="TmpTest" >
   
<classes>
     
<class name="test.failures.Child"  />
   
<classes>
   
</test>
</suite>

次のコードを使用する必要があります.
XmlSuite suite = new XmlSuite();
suite
.setName("TmpSuite");

XmlTest test = new XmlTest(suite);
test
.setName("TmpTest");
List<XmlClass> classes = new ArrayList<XmlClass>();
classes
.add(new XmlClass("test.failures.Child"));
test
.setXmlClasses(classes) ;

その後、このXmlSuiteをTestNGに伝えることができます.
List<XmlSuite> suites = new ArrayList<XmlSuite>();
suites
.add(suite);
TestNG tng = new TestNG();
tng
.setXmlSuites(suites);
tng
.run();

完全なAPIについては、JavaDocsを参照してください.
 

5.14-BeanShell上級グループでの選択


が足りない場合は、BeanShell式を使用して特定のテスト方法が含まれるべきかどうかを決定します.ラベルの下でこの式を使用すればいいです.
<test name="BeanShell test">
   
<method-selectors>
     
<method-selector>
       
<script language="beanshell"><![CDATA[
         groups
.containsKey("test1")
       
]]>
</script>
     
</method-selector>
   
</method-selectors>
 
<!-- ... -->

testngでxmlファイルにタグが見つかった場合、TestNGは現在のタグ内のグループとメソッドのタグを無視します.BeanShellはテストメソッドが含まれているかどうかの唯一の決定要因になります.
次に、BeanShellスクリプトの追加説明を示します.
  • はboolean値を返さなければなりません.この制約に加えて、有効なBeanShellコードはすべて許可されます(たとえば、平日にtrueを返し、週末にfalseを返す必要がある場合があります.これにより、異なる日付でテストできます).
  • TestNGは、javaを呼び出すために次の変数を定義します.lang.reflect.Method method:現在の試験方法org.testng.ITestNGMethod testngMethod:現在のテスト方法の説明java.util.Mapgroups:現在のテストメソッドが属するグループのマッピング
  • また、CDATA宣言を使用してBeanshell式(前例のように)を囲み、XMLの文字冗長な参照を回避する必要があります.

  • 5.15 - 注解转换器


    TestNGでは、実行時にすべての注釈の内容を変更できます.ソースコードに注釈を付けると、ほとんどの場合、正常に動作する場合に役立ちます(この原文はこの意味で、あまり違和感があります).しかし、いくつかの場合、値を変更する可能性があります.
    そのため、注釈変換器(Annotation Transformer)を使用します.
    注釈変換器とは、次のインタフェースを実現するクラスです.
    public interface IAnnotationTransformer {

     
    /**
       * This method will be invoked by TestNG to give you a chance
       * to modify a TestNG annotation read from your test classes.
       * You can change the values you need by calling any of the
       * setters on the ITest interface.
       *
       * Note that only one of the three parameters testClass,
       * testConstructor and testMethod will be non-null.
       *
       * @param annotation The annotation that was read from your
       * test class.
       * @param testClass If the annotation was found on a class, this
       * parameter represents this class (null otherwise).
       * @param testConstructor If the annotation was found on a constructor,
       * this parameter represents this constructor (null otherwise).
       * @param testMethod If the annotation was found on a method,
       * this parameter represents this method (null otherwise).
       */

     
    public void transform(ITest annotation, Class testClass,
         
    Constructor testConstructor, Method testMethod);
    }

    他のTestNGリスナーのように、コマンドラインまたはantでこのクラスを指定できます.
      java org.testng.TestNG -listener MyTransformer testng.xml

    またはプログラムでは、
      TestNG tng = new TestNG();
      tng
    .setAnnotationTransformer(new MyTransformer());
     
    // ...

    transform()を呼び出すと、ITest testパラメータの設定方法を呼び出して、さらに処理する前に値を変更できます.
    たとえば、ここではプロパティinvocationCountの値を上書きする方法を示しますが、テストクラスのinvoke()メソッドのみが影響を受けます.
      public class MyTransformer implements IAnnotationTransformer {
       
    public void transform(ITest annotation, Class testClass,
           
    Constructor testConstructor, Method testMethod)
       
    {
         
    if ("invoke".equals(testMethod.getName())) {
            annotation
    .setInvocationCount(5);
         
    }
       
    }
     
    }

    IAnnotationTransformerでは、@Test注記を1つだけ変更できます.他の(注釈@Factoryまたは@DataProviderを構成すると仮定)を変更する必要がある場合は、IAnnotationTransformer 2を使用します.

    5.16 - 方法拦截器


    TestNGがテストメソッドをどのような順序で呼び出すかを計算すると、これらのメソッドは2つのグループに分けられます.
  • を順番に実行する方法.ここでは、すべてのメソッドに依存し、これらのメソッドは特定の順序で実行されます.
  • 不定順序で実行する方法.ここでの方法は最初のカテゴリに属しません.メソッドの実行順序はランダムで、次は何なのか分かりません(それでも、デフォルトではTestNGはクラスでメソッドを整理しようとします).

  • 2番目のカテゴリをよりよく制御するために、TestNGは次のインタフェースを定義します.
    public interface IMethodInterceptor {
     
     
    List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context);

    }

    メソッドでmethodsと呼ばれるリストパラメータには、不定序で実行されるすべてのメソッドが含まれています.あなたのinterceptメソッドもIMethodInstanceリストを返します.次のいずれかの場合があります.
  • の内容はパラメータで受信ものと一致するが、順序が異なる
  • .
  • IMethodInstanceオブジェクトのセット
  • より大きなIMethodInstanceオブジェクトのセット
  • ブロッキングを定義したら、TestNGを渡して、次の方法で行います.
    java -classpath "testng-jdk15.jar:test/build" org.testng.TestNG -listener test.methodinterceptors.NullMethodInterceptor /
     -testclass test.methodinterceptors.FooTest

    antで対応する構文については、listenersプロパティantドキュメントの説明を参照してください.
    たとえば、次のメソッドブロッカーはメソッドを並べ替え直し、「fast」グループのメソッドは常に先に実行されます.
    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
     
    List<IMethodInstance> result = new ArrayList<IMethodInstance>();
     
    for (IMethodInstance m : methods) {
       
    Test test = m.getMethod().getMethod().getAnnotation(Test.class);
       
    Set<String> groups = new HashSet<String>();
       
    for (String group : test.groups()) {
          groups
    .add(group);
       
    }
       
    if (groups.contains("fast")) {
          result
    .add(0, m);
       
    }
       
    else {
          result
    .add(m);
       
    }
     
    }
     
    return result;
    }

    5.17 - 从JavaDoc 注解迁移到JDK 注解


    プロジェクトがjavadoc annotationsを使用していたが、その後JDK annotationsに変換する場合は、これらをすべて変換する必要があります.
    TestNGはこれらを手伝ってくれるツールを提供しています.
     
    java org.testng.AnnotationConverter -srcdir directory [-overwrite|-d destdir] [-quiet]

    上記のコマンドは、ソースファイルを1つのフォーマットから別のフォーマットに変換します.パラメータなしで実行すると、すべてのパラメータの使用方法が表示されます.
    変換後のファイルは、あまりきれいではないかもしれませんので、正確性を確認してください.だからバージョン管理ツールを使ったほうがいいです.好きでなければ操作を取り消すことができます.変換器自体も、上記の推奨文法規則を使用していると仮定します.

    5.18 - TestNG 监听器


    TestNGの動作を修正するためのインタフェースがたくさんあります.これらのインタフェースは、総称して「TestNGリスナー」と呼ばれています.次に、現在サポートされているListenerのリストを示します.
  • IAnnotationTransformer (doc, javadoc)
  • IReporter (doc, javadoc)
  • ITestListener (doc, javadoc)
  • IMethodInterceptor (doc, javadoc)
  • IInvokedMethodListener (doc, javadoc)

  • これらのインタフェースを実現すると、TestNGにこれらのインタフェースを知ることができます.以下の方法があります.
  • コマンドラインで-listener
  • を使用
  • antで
  • を使用
  • はtestng.xmlでラベル
  • を使用
    次に、3つ目の方法の例を示します.
    <suite>

    <listeners>
     
    <listener class-name="com.example.MyListener" />
     
    <listener class-name="com.example.MyMethodInterceptor" />
    </listeners>

    ...

    5.19 - 依赖注入


    TestNGでは、自分の方法で追加のパラメータを宣言できます.この場合、TestNGはこれらのパラメータに正しい値を自動的に入力します.依存注入はこのような場所で使用されます.
  • @Beforeまたは@Testメソッドは、ITestContextのタイプのパラメータを宣言することができる.
  • @Afterは、実行したばかりのテストメソッドを表すITestResultのタイプの単数を宣言できます.
  • @Beforeメソッドおよび@Afterメソッドは、現在のパラメータを含むXmlTestタイプのパラメータを宣言できます.
  • @BeforeMethodはjavaのタイプを宣言することができます.lang.reflect.Methodのパラメータ.このパラメータは,@BeforeMethodが呼び出しを完了するとすぐに呼び出されるそのテストメソッドをその値として受け取る.
  • @BeforeMethodは、Object[]のタイプのパラメータを宣言します.このパラメータには、次の試験方法に埋め込むパラメータのリストが含まれ、javaなどのTestNG注入も可能である.lang.reflect.Methodまたは@DataProviderから.
  • @DataProviderは、ITestContextまたはjavaのタイプを宣言することができる.lang.reflect.Methodのパラメータ.次のタイプのパラメータでは、呼び出されるメソッドがその値として受信されます.

  • 5.20 - 监听方法调用


    TestNGがテスト(@Test注釈によって呼び出される)または構成(@Before or@After注釈を使用する方法)を呼び出すたびに、Listener IinvokedMethodListenerは通知を得ることができます.次のインタフェースを実現する必要があります.
    public interface IInvokedMethodListener extends ITestNGListener {
     
    void beforeInvocation(IInvokedMethod method, ITestResult testResult);
     
    void afterInvocation(IInvokedMethod method, ITestResult testResult);
    }

    さらにTestNGリスナーについての節で議論したように,1つのリスナーとして宣言する.