79

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

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

4

17 に答える 17

88

これは機能します。

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

}

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

}

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

}

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

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

于 2013-09-10T21:38:29.673 に答える
65

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

@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

于 2010-04-19T18:37:51.920 に答える
30

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

@Test
public void Test1() {

}

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

}

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

}
于 2013-09-08T23:33:55.980 に答える
9

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

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

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);
    }
}

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

于 2015-01-24T09:36:54.150 に答える
8

これを使って:

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、ブラウザーの初期化やセットアップに使用できます。

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

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

ブラウザーを閉じるような最後に、@AfterTest, @AfterSuite, @AfterClass注釈を使用できます。

于 2016-03-26T10:05:23.433 に答える
6
@Test(dependsOnMethods="someBloodyMethod")
于 2013-04-22T21:01:22.983 に答える
4

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

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

于 2010-04-28T17:38:50.720 に答える
2

user1927494 の回答をピギーバックオフします。他のすべてのテストの前に単一のテストを実行する場合は、次のようにします。

@Test()
public void testOrderDoesntMatter_1() {
}

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

@Test()
public void testOrderDoesntMatter_2() {
}
于 2014-05-15T21:24:56.807 に答える
2

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>

于 2015-03-06T00:51:06.363 に答える
1

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

于 2012-08-21T04:23:43.177 に答える
0

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

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

于 2010-04-19T17:58:52.393 に答える
-5

単体テストのようなテスト?何のために?テストは独立している必要があります。そうでなければ....テストを個別に実行することはできません。それらが独立している場合、なぜ干渉するのでしょうか? さらに、複数のコアの複数のスレッドでそれらを実行する場合、「順序」とは何ですか?

于 2010-04-19T17:48:52.320 に答える