16

TestNG のデータベース テストを表す基本クラスがあり、このクラスから拡張されたすべてのクラスがグループ "db-test" に属していることを指定したいのですが、これが可能ではないことがわかりました。@Test アノテーションを試しました:

@Test(groups = { "db-test" })
public class DBTestBase {
}

ただし、 @Test アノテーションは一連のメソッドをテストにしようとし、テストの実行時にEclipseで警告/エラーがポップアップするため、これは機能しません。

だから私はテストを無効にしようとしたので、少なくともグループが割り当てられています:

@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}

しかし、 @BeforeTest (および他の同様の注釈) も無効になります...もちろん、これは私が望んでいるものではありません。

特定のタイプのグループとしてクラスに注釈を付ける何らかの方法が必要ですが、TestNG ではそれはまったく可能ではないようです。他のアイデアはありますか?

4

5 に答える 5

4

TestNG は、 @Test アノテーションを持つクラスからすべてのパブリック メソッドを実行します。TestNG を実行させたくないメソッドを非公開に変更できるかもしれません

于 2008-09-16T18:06:40.610 に答える
2

答えは、カスタムorg.testng.IMethodSelector によるものです。

そのincludeMethod()は、公開されていないアノテーション付きメソッドなど、必要なメソッドを除外できます。

ただし、カスタムJava MethodSelectorを登録するには、任意の TestRunner によって管理されるXMLTestインスタンスにそれを追加する必要があります。つまり、独自のカスタム TestRunnerが必要です。

ただし、カスタム TestRunner をビルドするには、-testrunfactoryオプションを使用してTestRunnerFactoryを登録する必要があります。

ただし、 -testrunfactory はTestNGクラスによって考慮されることはありません...そのため、カスタム TestNG クラスも定義する必要があります。

  • configure(Map) メソッドをオーバーライドするために、
  • 実際に TestRunnerFactory を設定できます
  • カスタムTestRunnerを構築するTestRunnerFactory、
  • XMLTest インスタンスにカスタム XMLMethodSelector を設定する TestRunner
  • カスタム IMethodSelector を構築する XMLMethodSelector
  • 選択した TestNG メソッドを除外する IMethodSelector !

わかりました...それは悪夢です。しかし、これはコードの挑戦でもあるので、少し難しいでしょう ;)

すべてのコードはDZone スニペットで入手できます。

コードチャレンジのいつものように:

  • 1 つの Java クラス (およびかなりの数の内部クラス)
  • クラスをコピーして「source/test」ディレクトリに貼り付けます (パッケージが「test」であるため)
  • 実行します (引数は必要ありません)

マイク・ストーンからの更新:

私が最終的にやったことにかなり近いように聞こえるので、これを受け入れるつもりですが、私がやったことも追加すると思いました.

基本的に、Test (およびその他の) アノテーションの groups プロパティのように動作する Groups アノテーションを作成しました。

次に、GroupsAnnotationTransformer を作成しました。これは IAnnotationTransformer を使用して、定義されているすべてのテストとテスト クラスを調べ、テストを変更してグループを追加します。これは、グループの除外と包含に完全に対応します。

新しいアノテーション トランスフォーマーを使用するようにビルドを変更すると、すべてが完全に機能します。

ええと... 1つの注意点は、テスト以外のメソッドにグループを追加しないことです...私がこれを行った時点で、何かを変換できる別の注釈トランスフォーマーがあったためですが、どういうわけか含まれていませんでしたなんらかの理由で使用していた TestNG で...だから、注釈付きの前後のメソッドを alwaysRun=true にすることをお勧めします...これで十分です。

最終結果は、私ができることです:

@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
    @Test
    @Groups("aMethodLevelGroup")
    public void myTest() {
    }
}

そして、サブクラス化とすべてでトランスフォーマーを機能させました。

于 2008-11-08T23:12:31.067 に答える
1

注釈の継承が TestNG でどのように機能するかはわかりませんが、この記事は役に立つかもしれません。

実際には、これはより良い助けになるかもしれません。inheritGroups を見てください。

于 2008-08-12T19:03:22.737 に答える
1

次のコード チャレンジ(コミュニティ wiki 投稿)のように思えます。

グループ 'aGlobalGroup' から拡張クラスのすべてのテスト メソッドを実行できるようにする方法:

  • Extended クラス自体に「aGlobalGroup」グループを指定しますか?
  • Extended クラスのアノテーションなしの public メソッドをテストしますか?

最初の答えは簡単です。
クラス TestNG(groups = { "aGlobalGroup" }) を Base クラス レベルに追加します。

そのグループは、基本クラスと拡張クラスの両方のすべてのパブリック メソッドに適用されます。

BUT: テスト以外のパブリック メソッド (TestNG アノテーションなし) もそのグループに含まれます。

課題: TestNG 以外のメソッドを含めないようにします。

@Test(groups = { "aGlobalGroup" })
public class Base {

    /**
     * 
     */
    @BeforeClass
     public final void setUp() {
           System.out.println("Base class: @BeforeClass");
     }


    /**
     * Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. <br />
     * Will be executed even if the TestNG class tested is a sub-class.
     */
    @Test(groups = { "aLocalGroup" })
     public final void aFastTest() {
       System.out.println("Base class: Fast test");
     }

    /**
     * Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. <br />
     * Will be executed even if the TestNG class tested is a sub-class.
     */
    @Test(groups = { "aLocalGroup" })
     public final void aSlowTest() {
        System.out.println("Base class: Slow test");
        //throw new IllegalArgumentException("oups");
     }

     /**
      * Should not be executed. <br />
      * Yet the global annotation Test on the class would include it in the TestNG methods...
     */
    public final void notATest() {
       System.out.println("Base class: NOT a test");
     }

    /**
     * SubClass of a TestNG class. Some of its methods are TestNG methods, other are not. <br />
     * The goal is to check if a group specify in the super-class will include methods of this class. <br />
     * And to avoid including too much methods, such as public methods not intended to be TestNG methods.
     * @author <a href="http://stackoverflow.com/users/6309/vonc">VonC</a>
     */
    public static class Extended extends Base
    {
        /**
         * Test not part a 'aGlobalGroup', but still included in that group due to the super-class annotation. <br />
         * Will be executed even if the TestNG class tested is a sub-class.
         */
        @Test
        public final void anExtendedTest() {
           System.out.println("Extended class: An Extended test");
        }

        /**
         * Should not be executed. <br />
         * Yet the global annotation Test on the class would include it in the TestNG methods...
         */ 
        public final void notAnExtendedTest() {
            System.out.println("Extended class: NOT an Extended test");
        }
    }
于 2008-11-08T22:57:34.233 に答える
0

@Test アノテーションをメソッド レベルで指定できるため、最大限の柔軟性が得られます。

public class DBTestBase {

    @BeforeTest(groups = "db-test")
    public void beforeTest() {
        System.out.println("Running before test");
    }

    public void method1() {
        Assert.fail(); // this does not run. It does not belong to 'db-test' group.
    }

    @Test(groups = "db-test")
    public void testMethod1() {
        Assert.assertTrue(true);
    }
}

これはうまくいきますか、それともあなたの質問から何かが欠けています.

于 2008-09-30T17:23:10.673 に答える