Testng: クラスレベルでの@Test(enabled = false)アノテーションは、クラス内のすべてのメソッドを無効にする必要があります

作成日 2011年12月21日  ·  20コメント  ·  ソース: cbeust/testng

http://code.google.com/p/testng/issues/detail?id=102からコピー

TestNG6.3.1でもテスト済み

どの手順で問題が再現されますか?
私はこのようなテストクラスを持っています:

@Test(enabled = false)
パブリッククラスMyTest {
@DataProvider(name = "bla")
プライベートオブジェクト[] [] bla(){
新しいオブジェクトを返す[] [] {
new Object [] {"bla"}
};
}

@Test(dataProvider = "bla")
public void blatest(String bla){
System.out.println(bla);
}
}

期待される出力は何ですか?
メソッドblatestが実行されず、コンソール出力がないことを期待します。 代わりに、blatestが実行され、「bla」が出力されます。

どのバージョンの製品を使用していますか?
surefireプラグイン2.7.2を使用してMaven2.2.1 /3.0.3から実行するtestng5.11 /6.0.1でテストしました。

以下に追加情報を入力してください。

全てのコメント20件

こんにちはニコラス、

メソッドで@Testメソッドを使用しない場合はこれが表示されますが、使用するとすぐに(上記の例でdataProviderを使用した場合のように)、 enabled属性がオーバーライドされ、デフォルトになります。本当なので、あなたが見ている振る舞い。

これは理にかなっていますか?

はい、セドリックに感謝します。

クラスのアノテーション@test(enabled = false)がクラスを実行から完全に除外するという誤った仮定をします

少し直感に反していることに同意しますが、残念ながら今は変更するには遅すぎます...

こんにちは、セドリック!
@Testアノテーションに新しいパラメーターを追加し、それを「enabledClass」のように呼び出して、デフォルトでtrueにするのはどうですか? メソッドレベルのアノテーションに関係なくクラス全体を無効にするには、クラスレベル(enabledClass = false)でのみ使用する必要があり、メソッドに追加された場合は無視されます。
このようにして、下位互換性を維持し、同時に非常に便利な機能を提供します。
必要に応じて、私はそれを自分で実装し、プルリクエストを提供することができます。
前もって感謝します!

@ andronix83

enabledenabledClassの微妙な違いを説明する必要があるため、これにより事態がさら​​に混乱するのではないかと思います。

現在のenabled動作は最も直感的ではありませんが、この問題が発生した回数で判断すると、一般的には問題ではないようです(ほとんどありません)。

こんにちはセドリック、

私は実際に先週と同じくらい最近この問題に遭遇しました。 Facebook GraphAPIに依存するWebサーバーに取り組んでいます。 Graph APIにヒットするコードに依存するいくつかのテストメソッドと、そのサービスにまったく依存する必要のない他のテストメソッドを持つテストクラスがありました。 その後、Facebook全体で1時間以上にわたってグローバルな停止が発生しました。 これにより、このクラスの一部のテストが失敗しました。

開発チームの残りのブロックを解除したままにするために私が望んでいたのは、クラスレベルの@Test(enabled = false)アノテーションを使用して、このクラスのすべてのテストをすぐに無効にすることです。 もちろん、それはうまくいきませんでした。 代わりに、失敗した各テストメソッドを1つずつ無効にする必要があり、必要以上に時間がかかったり、この問題を解決するために必要だったりしました。

理想的には、TestNGはJUnitの@Ignoreアノテーションに似たある種の機能をサポートします: http//junit.sourceforge.net/javadoc/org/junit/Ignore.html 簡単に言えば、開発者は確かにこの機能を望んでいます。

ありがとうございました。

@ecbrodieこれはすでにサポートされています(試してみてください!)が、注意点があります。 @Testアノテーションを持つ個々のメソッドはすべて、テストを再度有効にします。

@Test(enabled = false)
public class T {
  void f() {} // will not run
}
@Test(enabled = false)
public class T {
  <strong i="10">@Test</strong>
  void f() {} // WILL run!
}

これは、メソッドレベルの属性がクラスレベルで定義された属性をオーバーライドするセマンティクスによるものです。したがって、メソッドレベルの@Testアノテーションは、デフォルト値であるため、基本的に@Test(enabled = true)と言っています...

意味がありますか?

こんにちは@cbeust 、その例に感謝します、しかしそれはすでに問題の理解でした、それであなたは私を誤解したかもしれないと思います。 @Test(enabled = true / false)の現在のセマンティクスと、メソッドで設定されているものをすべて無視するようにクラスレベルでenabledのオーバーライドを実際に指定する方法が必要な場合、私が作成しようとしていたのはレベル、おそらくそれはある種のenabledClass注釈値を追加することに対するあなたのスタンスを再考する時です。

@Test(enabled)セマンティクスで採用した元のアプローチに対して軽蔑しているようです。 それが実際に当てはまる場合は、そのセマンティクスをより直感的に感じるものに取り入れてみませんか?

同意しました。 @Test(enabledClass = false)は理にかなっており、下位互換性を損なうことなく提案を実装する唯一の方法だと思います。 かなり簡単なはずです。

たぶんあなたや@juherrはPRを提出することに興味がありますか?

気分が悪いです。 クラスでのみ使用される新しい属性を追加するというアイデアは好きではありません。
次に、 enable=falseをソースで使用する場合は、テストを実行するときにソースを変更する必要があるため、悪い習慣だと思います。
IMO、クラスの選択を解除する場合は、代わりにtestng.xmlを使用する必要があります。
@ecbrodieどのようにテストを実行しますか?

ところで、代わりに私が提案するのは、クラスでのenable=falseのデフォルトの動作をオーバーライドするIAnnotationTransformer実装を提供することです。
IAnnotationTransformerは、クラスにenable=falseがある場合、すべてのテストでenable=falseになります。
下位互換性を損なうことはなく、特定のパラメーターを追加することもありません。
@cbeustどう思いますか?

@juherr Cool PR、 IAnnotationTransformer行うのは確かに非常に簡単です。

私の唯一の懸念は、ユーザーにとって、 enabledClass属性とは対照的に、使用するのが少し難解であるということです。

クラスレベルでのみ適用可能な属性がすでにいくつかあることに注意してください( suiteNametestName )。

私が言ったように、私はユースケースが好きではありません。 そして、私はそれが過去4年間でそれを尋ねたたった2人のために十分であると思います:)

@juherrまあまあ

@ecbrodie PRについてどう思いますか?

https://github.com/cbeust/testng/pull/816

@cbeust
ちょっと興味があるんだけど。 これを実行できる組み込みのAnnotationTransformerを提供した場合はどうなりますか?

はい、それは#816が提案するものです

@juherr
そのPR情報を共有していただきありがとうございます。 これがマージされるのを待っている理由は何ですか?

以下のようなシナリオがある場合はどうなりますか?

@Test(groups = { "regression", "smoke" }, dependsOnGroups = { "Creation" })
public class EditName {

    @Test(dataProvider="SomeTestData",dataProviderClass=SearchData.class)
    public void TC_1(String Msg) throws Exception{
        System.out.println(Msg);
    }

    @Test(dataProvider="SomeTestData",dataProviderClass=SearchData.class, dependsOnMethods = { "TC_1" }))
    public void TC_2(String Msg) throws Exception{
        System.out.println(Msg);
    }
}
  1. TC_1とTC_2は、回帰グループと煙グループの両方に属しますか?
  2. TC_1とTC_2の両方がグループ「作成」に依存しますか?
  3. TC_2は、グループ「Creation」とTC_1に依存しますか、それともTC_1だけに依存しますか?

@ Rameshwar-Juptimathサンプルとこの問題の関係は何ですか?

クラスおよびメソッドレベルでの@Testのこれらの直感的でない動作のため。
ベストプラクティスとして何を推奨する必要がありますか?
テストで両方を使用することは避けるべきですか?
ケースごとに異なるデータプロバイダーを持つためにメソッドレベルで多かれ少なかれそれを使用しているので、クラスにそれを持たないようにする必要がありますか?
考え?

@aliciatang動作は、すべてのアノテーション属性で同じです。メソッドの値は、クラスの値をオーバーライドします。

6.13以降、期待する動作である@Ignoreを使用できます。 @Ignoreドキュメントはここにあります

このページは役に立ちましたか?
0 / 5 - 0 評価