web-dev-qa-db-ja.com

TestNGでのテストの実行順序

TestNGでテストの実行順序をカスタマイズする方法は?

例えば:

public class Test1 {
  @Test
  public void test1() {
      System.out.println("test1");
  }

  @Test
  public void test2() {
      System.out.println("test2");
  }

  @Test
  public void test3() {
      System.out.println("test3");
  }
}

上記のスイートでは、テストの実行順序は任意です。 1回の実行の場合、出力は次のようになります。

test1
test3
test2

記述された順序でテストを実行するにはどうすればよいですか?

68
Badri

これは動作します。

_@Test(priority=1)
public void Test1() {

}

@Test(priority=2)
public void Test2() {

}

@Test(priority=3)
public void Test3() {

}
_

priorityは実行順序を推奨しますが、以前の優先度レベルが完了したことを保証しません。 _test3_は、_test2_が完了する前に開始できます。保証が必要な場合は、依存関係を宣言します。

依存関係を宣言するソリューションとは異なり、priorityを使用するテストは、1つのテストが失敗しても実行されます。この依存関係の問題は、 documentation に従って@Test(...alwaysRun = true...)で回避できます。

79
user1927494

TestNGでは、dependsOnMethodsおよび/またはdependOnOnGroupsを使用します。

@Test(groups = "a")
public void f1() {}

@Test(groups = "a")
public void f2() {}

@Test(dependsOnGroups = "a")
public void g() {}

この場合、g()はf1()およびf2()が完了して成功した後にのみ実行されます。

ドキュメントには多くの例があります: http://testng.org/doc/documentation-main.html#test-groups

59
Cedric Beust

問題の特定のシナリオに対処するには:

@Test
public void Test1() {

}

@Test (dependsOnMethods={"Test1"})
public void Test2() {

}

@Test (dependsOnMethods={"Test2"})
public void Test3() {

}
22
user2759895

これを使って:

public class TestNG
{
        @BeforeTest
        public void setUp() 
        {
                   /*--Initialize broowsers--*/

        }

        @Test(priority=0)
        public void Login() 
        {

        }

        @Test(priority=2)
        public void Logout() 
        {

        }

        @AfterTest
        public void tearDown() 
        {
                //--Close driver--//

        }

}

通常、TestNGは多くの注釈を提供します。ブラウザ/セットアップの初期化に@BeforeSuite, @BeforeTest, @BeforeClassを使用できます。

スクリプトに多数のテストケースを記述し、割り当てられた優先度に従って実行する場合は、優先度を割り当てることができます。その後、0,1,2,3 ....から始まる@Test(priority=0)を使用します。

その間、多数のテストケースをグループ化し、グループ化して実行できます。そのために@Test(Groups='Regression')を使用します

最後に、ブラウザーを閉じるなど、@AfterTest, @AfterSuite, @AfterClassアノテーションを使用できます。

7
Bharat Mane

TestNGで@Test(priority = )オプションを使用したくない場合は、 javaassist ライブラリとTestNGのIMethodInterceptorを使用して、テストに従って優先順位を付けます。テストメソッドがテストクラスで定義される順序。これは、提供されたソリューション here に基づいています。

このリスナーをテストクラスに追加します。

package cs.jacob.listeners;

import Java.util.Arrays;
import Java.util.Comparator;
import Java.util.List;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;

public class PriorityInterceptor implements IMethodInterceptor {
    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {

    Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() {
        private int getLineNo(IMethodInstance mi) {
        int result = 0;

        String methodName = mi.getMethod().getConstructorOrMethod().getMethod().getName();
        String className  = mi.getMethod().getConstructorOrMethod().getDeclaringClass().getCanonicalName();
        ClassPool pool    = ClassPool.getDefault();

        try {
            CtClass cc        = pool.get(className);
            CtMethod ctMethod = cc.getDeclaredMethod(methodName);
            result            = ctMethod.getMethodInfo().getLineNumber(0);
        } catch (NotFoundException e) {
            e.printStackTrace();
        }

        return result;
        }

        public int compare(IMethodInstance m1, IMethodInstance m2) {
        return getLineNo(m1) - getLineNo(m2);
        }
    };

    IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]);
    Arrays.sort(array, comparator);
    return Arrays.asList(array);
    }
}

これは基本的にメソッドの行番号を見つけて、行番号の昇順、つまりクラスで定義されている順序でソートします。

6
jacobcs
@Test(dependsOnMethods="someBloodyMethod")
5
user2137872

指定した順序でテストを実行するという点で質問を正しく理解できた場合、TestNG IMethodInterceptorを使用できます。 http://beust.com/weblog2/archives/000479.html を活用してそれらを活用する方法をご覧ください。

事前初期化を実行する場合は、IHookable http://testng.org/javadoc/org/testng/IHookable.html および関連するスレッド http://groups.google .com/group/testng-users/browse_thread/thread/42596505990e8484/3923db2f127a9a9c?lnk = gst&q = IHookable#3923db2f127a9a9c

4
Kartik

TestNg.xmlで実行するテストメソッドを指定することにより、テストケースを目的の順序で実行できます。

<suite>
<test name="Selenium1">
                <classes>
                        <class name="com.test.SeleniumTest" >
                            <methods><include name="methodB"></include>
                                <include name="methodA"></include>
                            </methods>    
                         </class>
                </classes>
 
        </test>
</suite>
2
seetha

私は同じ問題に直面しましたが、考えられる理由はtestngの並列実行によるものであり、解決策はtestng.xmlでPriorityオプションを追加するか、単にpreserve-order = "true"を更新することです。

<test name="Firefox Test" preserve-order="true">
1
Kiran

@Testの優先度パラメーターを使用することで、テストの実行順序を制御できます。

1
Madan

クラスファイル内のメソッドの順序は予測できないため、依存関係を使用するか、メソッドをXMLに明示的に含める必要があります。

デフォルトでは、TestNGはXMLファイルで見つかった順序でテストを実行します。このファイルにリストされているクラスとメソッドを予期しない順序で実行する場合は、preserve-order属性をfalseに設定します

1
san1deep2set3hi

User1927494の答えを捨てて、他のすべてのテストの前に1つのテストを実行したい場合、これを行うことができます。

@Test()
public void testOrderDoesntMatter_1() {
}

@Test(priority=-1)
public void testToRunFirst() {
}

@Test()
public void testOrderDoesntMatter_2() {
}
1
Big Gunz

dependsOnMethodsのような追加のものを使用する場合、testng.xmlファイルで@Testフロー全体を定義することができます。知る限り、スイートXMLファイル(testng.xml)で定義された順序は、他のすべての順序付け戦略をオーバーライドします。

0
Akshay Maldhure

特定の順序でテストを実行する方法があります。ただし、通常、テストは、必要な機能のみをテストし、テスト対象以外のコードの副作用に依存しないことを保証するために、反復可能で独立している必要があります。

したがって、質問に答えるには、特定の順序でテストを実行することが重要である理由などの詳細情報を提供する必要があります。

0
Kelly S. French

use:preserve-order = "true" enabled = "true"これは、記述した方法でテストケースを実行します。

<suite name="Sanity" verbose="1" parallel="" thread-count="">   
<test name="Automation" preserve-order="true"  enabled="true">
        <listeners>
            <listener class-name="com.yourtest.testNgListner.RetryListener" />
        </listeners>
        <parameter name="BrowserName" value="chrome" />
        <classes>
            <class name="com.yourtest.Suites.InitilizeClass" />
            <class name="com.yourtest.Suites.SurveyTestCases" />
            <methods>
                <include name="valid_Login" />
                <include name="verifyManageSurveyPage" />
                <include name="verifySurveyDesignerPage" />
                <include name="cloneAndDeleteSurvey" />
                <include name="createAndDelete_Responses" />
                <include name="previewSurvey" />
                <include name="verifySurveyLink" />
                <include name="verifySurveyResponses" />
                <include name="verifySurveyReports" />
            </methods>
        </classes>
    </test>
</suite>
0
Ankit Gupta

重要な説明を含む回答:

TestNG」には、テストの実行順序を決定する2つのパラメーターがあります。

@Test(dependsOnGroups= "someGroup")

そして:

@Test(dependsOnMethods= "someMethod")

どちらの場合も、これらの機能はメソッドまたはグループに依存しますが、

ただし、違い:

この場合:

@Test(dependsOnGroups= "someGroup")

このメソッドはグループ全体に依存するため、依存する関数の実行直後にこのメソッドも実行されるとは限りませんが、実行の後半や他のテストの実行後でも実行される場合があります。

このパラメータの同じテストセット内で複数の使用がある場合、これは問題の安全なレシピであることに注意することが重要です。テストセット全体の依存メソッドが最初に実行されてから、それらに依存するメソッド。

ただし、この場合:

@Test(dependsOnMethods= "someMethod")

このパラメーターが同じテストセット内で複数回使用された場合でも、依存メソッドはすぐに実行された後、引き続き実行されます。

それが明確で助けになることを願っています。

0
Gavriel Cohen