6

私のクラスには多くのメソッドがあり、コードを実行すると、メソッドはランダムに呼び出されますが、私のクラスでは、すべてのメソッドはその前任者に依存します。つまり、2 番目のメソッドは 1 番目のメソッドに依存し、3 番目のメソッドは 2 番目のメソッドに依存します。 .すべてのメソッドを順番に実行したい

以下のメソッドを試してコードをテストしましたが、それでもメソッドはランダムに呼び出されます

//using sequential
@Test(sequential = true)
public void Method1(){
}


@Test(sequential = true)
public void Method2(){
}

//using singleThreaded 
@Test(singleThreaded=true)
public void Method1(){
}


@Test(singleThreaded=true)
public void Method2(){
}

私もtestngで次のパラメータを渡しました

<test name="Test" preserve-order="true" annotations="JDK">
 <classes>
 <class name="com.test" >
 <methods>
 <include name="method1"/>
 <include name="method2"/>
 <include name="method3"/>...
 </methods>
 </class>
  </classes>

 </test>

 </suite>

メソッドを順番に実行する代わりに、でテストしたところ@Test(dependsOnMethod="")、メソッドがスキップされました。

testngでテストを順番に実行するには?

4

7 に答える 7

6

@testアノテーションに優先度を追加するだけでなく、特定の方法ですべてのテストメソッドを実行したい場合。以下を参照してください:-

@test(priority=0)

function1()
{}

@test(priority=1)

function2()

{}


@test(priority=5)

function3()

{}

@test(priority=3)

function4()

{}

@test(priority=2)

function5()

{}

この場合、関数 1 は関数 2 よりも先に呼び出され、その後、関数 5 が優先順位のために関数 3 の代わりに呼び出されます。

于 2013-10-04T13:57:33.730 に答える
2

sequentialまず、またはsingleThreadedパラメータは必要ありません。スイートに単一のメソッドを記述するだけで十分です。あなたの問題はおそらく別の場所にあります。クラス自体ではなく、スイートを使用してテストを開始していることを確認してください。

毎回スイートを使用したくない場合 (退屈で、エラーが発生しやすく、柔軟性がないため)、この問題に対するいくつかの解決策を次に示します。

  1. 依存するメソッドを 1 つのメソッドにまとめて、 を過度に使用しReporter.log(String, boolean)ます。これは に似てSystem.out.println(String)いますが、文字列を TestNG レポートに保存します。2 番目の引数には常に true を渡します。これは、メッセージを STDOUT にも出力する必要があるかどうかを示します。すべてのステップの前にこれを行うと、テスト出力だけで、問題のある (読み取りに失敗した) テスト ステップを特定するのに十分なはずです。

    さらに、これを行う場合、ソフト アサーションを使用する可能性があります。これは基本的に、1 つのオプションのステップが機能しないという理由だけで、テスト全体を中止して失敗する必要がないことを意味します。次の重要なポイントまで続行し、その時点または最後に中止できます。エラーは引き続き保存され、テスト実行を失敗または不安定としてマークするかどうかを決定できます。

  2. @Test(priority = X)X が数値の場合に使用します。すべてのテスト メソッドに優先度を付けると、優先度の低いものから高いものの順に実行されます。これの利点は、ステップの間にメソッドを配置でき、単一の注釈が独立していることです。ただし、欠点は、これにより強い依存関係が強制されるのではなく、順序のみが強制されることです。つまり、優先度が 1 のメソッド testA が失敗した場合でも、優先度が 2 のメソッド testB が実行されます。

    ただし、おそらくリスナーを使用してこれを回避できます。これはまだ試していません。

  3. を使用し@Test(dependsOnMethods = {"testA"})ます。ここでの引数は文字列ではなく、文字列のリストであることに注意してください (投稿で間違っています)。つまり、testB が testA に依存している場合、testA が失敗すると、testB はスキップされたとマークされます。この注釈の欠点は、すべてのメソッドを他のメソッドに依存する非常に厳密なチェーンにすべてのメソッドを配置する必要があることです。この連鎖を断ち切ると、たとえば、何にも依存しない複数のメソッドが存在したり、同じメソッドに依存するメソッドがいくつか存在したりすると、地獄の台所に陥ります...

残念ながら、priority と dependsOnMethods の両方を一緒に使用しても、期待どおりの結果が得られません。ハード依存関係を使用する場合、優先度はほとんど無視されます。

于 2015-10-13T11:27:14.157 に答える
2

Dependsonmethods は、依存するメソッドが失敗した場合にテストをスキップします。testB が testA に依存している場合、testA が失敗した場合、testB を実行しても意味がないため、これは論理的に正しいです。testA の後に testB を実行するだけで、testB が testA の結果に依存しない場合は、@test アノテーションに alwaysrun=true を追加します。これらはとして知られています。ソフト依存関係。こちらを参照してください。

于 2013-10-03T15:51:22.103 に答える
0

リスナーで @Priority を使用して実行を制御できます。このリンクを参照してください - http://beust.com/weblog/2008/03/29/test-method-priorities-in-testng/

于 2013-10-03T10:36:17.527 に答える
0

I assume, based on your annotations, that you're using TestNG. I agree with others here that 'sequential' is not the way to go.

Option 1: dependsOnMethods

If your intent is that downstream methods are not even attempted when an upstream dependency fails, try dependsOnMethods instead. With this setup, if an earlier test fails, further tests are skipped (rather than failed).

Like this:

// using dependsOnMethods
@Test
public void method1(){
    // this one passes
}

@Test(dependsOnMethods = {"method1"})
public void method2(){
    fail("assume this one fails");
}

@Test(dependsOnMethods = {"method1"})
public void method3(){
    // this one runs, since it depends on method1
}

@Test(dependsOnMethods = {"method2"})
public void method4(){
    // this one is skipped, since it depends on method2
}

Option 2: priority

If your intent is that all tests are executed, regardless of whether upstream test pass, you can use priority.

Like this:

Other notes

I agree wholeheartedly with sircapsalot, that tests should be small and self-contained. If you're using a lot of dependencies, you probably have a problem with your overall test framework.

That said, there are instances where some tests need to run first, others need to run last, etc. And there are instances where tests should be skipped if others fail. For example, if you have tests "updateOneRecord" and "updateManyRecords", you could logically skip multiple if one didn't work.

(And as a final note, your method names should begin with lowercase characters.)

于 2016-05-11T16:12:35.963 に答える
0

dependsOnMethodsTestNG フレームワークの依存関係を使用してみてください。

于 2015-03-11T09:35:16.787 に答える
0

これはひどいテスト ロジックです.. 経験豊富なプロのソフトウェア テスト エンジニアとして.. この自動化パスからすぐに分散することをお勧めします。

優れたテスト アーキテクチャでは、各メソッドが自己完結型である必要があり、続行する前に他のテストの完了に依存するべきではありません。なんで?テスト 2 がテスト 1 に依存しているとします。テスト 1 が失敗するとします。今度はテスト 2 が失敗します。最終的には、テスト 1、2、3、4、5 のテストが失敗することになります。原因でした。

あなたへの私のお勧めは、自給自足で、保守可能で、短いテストを作成することです。

これはあなたの努力に役立つ素晴らしい読み物です: http://www.lw-tech.com/q1/ug_concepts.htm

于 2013-10-03T16:26:52.637 に答える