Testng: スヌパヌクラスの@Testメ゜ッドは、サブクラスごずに再実行されたす

䜜成日 2019幎06月10日  Â·  12コメント  Â·  ゜ヌス: cbeust/testng

TestNGバヌゞョン6.14.3

予想される行動

スヌパヌクラスの@Testメ゜ッドは、スヌパヌクラスを継承するサブクラスの数に関係なく1回実行されたす。

実際の動䜜

@Testメ゜ッドは、各サブクラスで実行されたす。

問題はランナヌで再珟可胜ですか

  • []シェル
  • [] Maven
  • [x] Gradle
  • [ ] 蟻
  • [] Eclipse
  • [] IntelliJ
  • [] NetBeans

テストケヌスサンプル

public class BaseTest  extends SetupClass{
    @BeforeClass...
    @BeforeMethod...
    @AfterClass...
    @AfterMethod....

    <strong i="22">@Test</strong>
    public void baseMethod(){
        System.out.println("base method");
    }
}
public class Test1 extends BaseTest{
    <strong i="25">@Test</strong>
    public void test1(){
        System.out.println("test1");
    }
}
public class Test2 extends BaseTest{
    <strong i="28">@Test</strong>
    public void test2(){
        System.out.println("test2");
    }
}

これらのテストは、次のようなTestNGxmlファむルから䞊行しお実行しおいたす。

<suite name="Regression Suite" verbose="1" parallel="classes" thread-count="4">
    <parameter name="project" value="TestPrj"/>
    <parameter name="server" value="QA01"/>
    <test name="QA01 TestPrj">
        <parameter name="environment" value="macos"/>
        <groups>
            <run>
                <include name="regression"/>
            </run>
        </groups>
        <packages>
            <package name="test"/>
        </packages>
    </test>
</suite>

PSgithubの問題でコヌドを線集するのは非垞に悪いです...別の堎所に移動しおください。

inheritance

党おのコメント12件

@ vlad230

PSgithubの問題でコヌドを線集するのは非垞に悪いです...別の堎所に移動しおください。

Markdownに慣れるために時間を費やしたいず思うかもしれたせん。 これにより、フォヌマットずずもにコヌドスニペットを非垞に簡単に远加できたす。

ここであなたの問題を理解しおいるのかよくわかりたせん。 最終的に、子クラスは基本クラスのメ゜ッドも取埗したす。 たた、TestNGアノテヌションが付けられおいる堎合は、すべおの子クラスに察しお実行されたす。 これがTestNGの動䜜です。 ぀たり、TestNGは蚭蚈どおりに機胜しおいるず蚀えたす。

@ juherr-あなたの考えは

@krmahadevanフォヌマットしおくれおありがずう:)

ここであなたの問題を理解しおいるのかよくわかりたせん。 最終的に、子クラスは基本クラスのメ゜ッドも取埗したす。 たた、TestNGアノテヌションが付けられおいる堎合は、すべおの子クラスに察しお実行されたす。 これがTestNGの動䜜です。 ぀たり、TestNGは蚭蚈どおりに機胜しおいるず蚀えたす。

私に蚀わせれば、スヌパヌクラスでテストを耇数回実行しおも意味がありたせん。
これが珟圚のTestNGの予想される動䜜である堎合は、改善のためにこれを远加できたす。

蚭蚈どおりに機胜したす。
baseMethodテストを独自のクラスに移動しおみたせんか

@ vlad230

私に蚀わせれば、スヌパヌクラスでテストを耇数回実行しおも意味がありたせん。

正確に䜕を達成しようずしおいたすか シナリオを詳しく説明したり、説明したりしおいただければ幞いです。

これが珟圚のTestNGの予想される動䜜である堎合は、改善のためにこれを远加できたす。

そのカりンタヌが盎感的であるため、それが拡匵機胜ずしお取り䞊げられるかどうかはわかりたせん。 基本的に、子クラスがいく぀存圚しおいおも、基本クラスのメ゜ッドを1回だけ実行する堎合は、次のようにしお、テストプロゞェクトで今日実行できたす。

  1. 基本クラスにorg.testng.IHookable実装しおもらいたす
  2. そのrun()メ゜ッド内に、基本クラスのメ゜ッドがすでに実行されおいるかどうかをチェックし、実行されおいない堎合は実行する線集チェックを远加したす。

これがサンプルです

基本クラスのメ゜ッドを1回だけ実行する必芁があるこずを瀺すマヌカヌむンタヌフェむス

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD, TYPE})
public <strong i="20">@interface</strong> RunOnce {
}

これがステヌトトラッカヌシングルトンです

import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class StateTracker {

  private static final StateTracker instance = new StateTracker();

  private final Map<String, Object> runOnceData = new ConcurrentHashMap<>();

  private StateTracker() {}

  public static StateTracker getInstance() {
    return instance;
  }

  boolean canExecute(Method method) {
    RunOnce runOnce = method.getAnnotation(RunOnce.class);
    String methodName = method.getName();
    boolean execute = true;
    if (runOnce != null) {
      if (runOnceData.containsKey(methodName)) {
        execute = false;
      } else {
        runOnceData.put(methodName, new Object());
      }
    }
    return execute;
  }
}

基本クラスは次のようになりたす

import org.testng.IHookCallBack;
import org.testng.IHookable;
import org.testng.ITestResult;
import org.testng.annotations.Test;

public class BaseTest implements IHookable {

  <strong i="27">@Test</strong>
  <strong i="28">@RunOnce</strong>
  public void baseclassTestMethod() {
    System.err.println("Base class test method executed");
  }

  <strong i="29">@Override</strong>
  public void run(IHookCallBack callBack, ITestResult testResult) {
    boolean execute =
        StateTracker.getInstance()
            .canExecute(testResult.getMethod().getConstructorOrMethod().getMethod());
    if (execute) {
      callBack.runTestMethod(testResult);
    } else {
      testResult.setStatus(ITestResult.SKIP);
      testResult.setThrowable(new RuntimeException("Intentionally skipping"));
    }
  }
}

子クラスは次のようになりたす

import org.testng.annotations.Test;

public class ChildClass1 extends BaseTest {

  <strong i="33">@Test</strong>
  public void childTest() {
    System.err.println(getClass().getName() + ".childTest() executed");
  }
}
import org.testng.annotations.Test;

public class ChildClass2 extends BaseTest {

  <strong i="36">@Test</strong>
  public void childTest() {
    System.err.println(getClass().getName() + ".childTest() executed");
  }
}

テスト結果を敎理し、 @RunOnceを䜿甚しお泚釈が付けられたスキップされたテストを削陀するフィルタリングメカニズムを远加する必芁がありたす。

@krmahadevan
正確に䜕を達成しようずしおいたすか シナリオを詳しく説明したり、説明したりしおいただければ幞いです。

テストを耇数のクラス機胜に関連するに分けようずしおいたす。 たずえば、「子クラス」のテストず䞀緒に基本クラスからのテストをサポヌトする他のヘルパヌメ゜ッドテストではないず䞀緒に@Beforeおよび@Afterメ゜ッドを䜿甚しお、その機胜のセットアップ郚分を持぀「基本クラス」がありたす。 "。 したがっお、この方法では、子クラスに新しいテストを远加するだけで、子クラスのコヌドを耇補するこずはありたせん。
基本クラスには、その機胜のより䞀般的な郚分をテストするいく぀かのテストメ゜ッドがあり、子クラスには、より具䜓的なテストがありたす。
クラスを䞊行しお実行するこずでテストの実行時間を最適化しようずしおいるため、50以䞊のテストメ゜ッドを持぀元の「基本クラス」を耇数の小さな「子クラス」に分割しお、これらの小さなクラスが他のスレッドに分散されるようにする必芁がありたした。 / executors。

@krmahadevanは詳现な解決策に感謝したすが、私には少し面倒に芋えたす。 TestNGはカスタマむズできるので、これをデフォルトの動䜜ず芋なしたいず思いたす。
基本クラスからテストを絶えず再実行する必芁はないず思いたす。 セットアップ/ティアダりンの問題である堎合は、い぀でも@ Before / @Afterを䜿甚できたす。これは、基本クラスの子クラスの前に毎回再実行されたす。

はい、動䜜は構成可胜だず思いたす。

実際、子むンスタンスごずに芪テストを実行するナヌスケヌスは芋぀かりたせん。
統合テストのようにテスト状態が倉曎されるこずが倚いため、テストぞの盎接の䟝存関係 dependsOnMethods がない限り。

@krmahadevan WDYT

@ vlad230

詳现な解決策に感謝したすが、私には少し面倒に芋えたす

あなたのナヌスケヌスも、通垞ずは少し異なっお芋えたす。 さらに、私はあなたにそれがどのように行われるこずができるかの実際的な䟋を䞎えたした。 あなたがする必芁があるのは、これを採甚し、これに基づいお構築するこずだけです。

TestNGはカスタマむズできるので、これをデフォルトの動䜜ず芋なしたいず思いたす。

いいえ、それは私の意芋ではできたせん。 テストは垞に実行されるこずを目的ずしおいたす。 それらが基本クラスに存圚するからずいっお、それらを遞択的に実行する必芁があるずいう意味ではありたせん。 TestNGはカスタマむズできたす。 しかし、それはTestNGがすべおのカスタマむズをサポヌトする必芁があるずいう意味ではありたせん。 ナヌザヌが自分のニヌズに合わせおカスタマむズし、操䜜できるようにする方法を提䟛する必芁があるだけです。 私が共有したサンプルは、TestNGを倉曎せずにこれらのカスタマむズを適甚した䟋です。

基本クラスからテストを絶えず再実行する必芁はないず思いたす。 セットアップ/ティアダりンの問題である堎合は、垞に@ Before / @afterを䜿甚できたす。これは、基本クラスの子クラスの前に毎回再実行されたす。

私にずっお、それは物事を芋る䞀぀の方法にすぎたせん。 特定のメ゜ッドを毎回実行する必芁がない堎合は、 @Testアノテヌションを䜿甚しないでください。 @BeforeTest  <test>タグごずに1回だけ実行されるや@BeforeSuite  <suite>ごずに1回だけ実行されるなどの構成アノテヌションを非垞にうたく䜿甚できたす。

基本クラスのテストメ゜ッドが本圓にテストメ゜ッドであるかどうかはわかりたせん。 私には、テストを実行するために満たすセットアップ条件を確立する構成のように聞こえたす。

@ juherr-ここでのナヌスケヌスに同意するかどうかはよく@Testアノテヌションではなく、構成アノテヌションを䜿甚する必芁がありたす。

実装偎では、特に人々が実行の手段ずしおグルヌプを䜿甚し始めるずきに、これはコヌドベヌスに倚くの混乱を远加するず思いたす。

さらに、珟圚TestNG䟋ずしお共有しおいたす内でこれを行う方法がすでにあるず感じおいたす。 なぜそれを掻甚しないのですか これは1回限りのナヌスケヌスのようであり、TestNGの通垞の䜿甚方法に適合しおいないようです。

@krmahadevan申し蚳ありたせんが、あなたは私がやろうずしおいるこずを理解しおいなかったず思いたす。
芪クラスBaseTest-䟋DashboardTestには、珟圚15個のテストがあり、3぀の子クラス䟋DashboardFilterTest、DashboardTreeTest、DashboardEditorTestがあり、それぞれにテストがありたす。 私の投皿で説明したアプロヌチを䜿甚するず、テストを実行するたびに、それらの15のテストが3回実行され぀たり、3x15 = 45のテストが実行されたす、䟡倀がなくなり、実行時間が無駄に長くなりたす。 15回のテスト。

芪クラスにあるテストが、子クラスからのテストが実行されるたびに再実行されるこずは、ただ意味がないず思いたす。 TestNGのデフォルトの動䜜では、拡匵しおいる子クラスの数に関係なく、芪クラスからテストメ゜ッドを1回実行するこずをお勧めしたす。

これができないのなら、私は理解しおいたす。 ずにかくありがずう。

@ vlad230

コンテキストを远加しおいただきありがずうございたす。

芪クラスBaseTest-䟋DashboardTestには、珟圚15個のテストがあり、3぀の子クラス䟋DashboardFilterTest、DashboardTreeTest、DashboardEditorTestがあり、それぞれにテストがありたす。 私の投皿で説明したアプロヌチを䜿甚するず、テストを実行するたびに、それらの15のテストが3回実行され぀たり、3x15 = 45のテストが実行されたす、䟡倀がなくなり、実行時間が無駄に長くなりたす。 15回のテスト。

その堎合、なぜDashboardFilterTest, DashboardTreeTest, DashboardEditorTestがDashboardTest拡匵するのでしょうか。 DashboardTestテストは、ここで継承アプロヌチを利甚するのではなく、独自のクラスに存圚する必芁があるようです。 基本クラスは、すべおの䞀般的なテストメ゜ッドを削陀しお別のテストクラスに栌玍するようにリファクタリングする必芁がありたす。DashboardTestは、䞀般的な非@Testメ゜ッドのみを栌玍するようにリファクタリングする必芁がありたす。

これができないのなら、私は理解しおいたす。 ずにかくありがずう。

それらが実行できるかどうかではありたせんが実装の課題は別のトピックです、ナヌスケヌス自䜓の有効性を理解しようずするのにただ苊劎しおいたす。

@krmahadevan

その堎合、なぜDashboardFilterTest, DashboardTreeTest, DashboardEditorTestがDashboardTest拡匵するのでしょうか。 DashboardTestテストは、ここで継承アプロヌチを利甚するのではなく、独自のクラスに存圚する必芁があるようです。 基本クラスは、すべおの䞀般的なテストメ゜ッドを削陀しお別のテストクラスに栌玍するようにリファクタリングする必芁がありたす。DashboardTestは、䞀般的な非@Testメ゜ッドのみを栌玍するようにリファクタリングする必芁がありたす。

'DashboardTest'には、子クラスにも必芁なヘルパヌメ゜ッドopenDashboard、createDashboardなどずsetup / teardown / cleanup@ Before / @ Afterメ゜ッドが含たれおいたす。 したがっお、子クラスでコヌドを耇補する必芁はありたせん。
はい、「DashboardTest」の䞀郚のテストは他の特定のクラスに移動できたすが、より䞀般的であるため、ここに残しおおきたいず思いたしたたずえば、ダッシュボヌドの党䜓的な倖芳、基本的なCRUDテスト、たたはそうでないテストをチェックするなど。特定のカテゎリに圓おはたるか、混合されおいたす。

確かに、@ Test以倖のテストクラスを䜜成するこずはできたすが奇劙で、誰かが誀っおここにテストを远加する可胜性がありたす、この問題を回避するだけですよね

@ vlad230

'DashboardTest'には、子クラスにも必芁なヘルパヌメ゜ッドopenDashboard、createDashboardなどずsetup / teardown / cleanup@ Before / @ afterメ゜ッドが含たれおいたす。 したがっお、子クラスでコヌドを耇補する必芁はありたせん。

意味あり。 はい、それらは基本クラス内に非垞にうたく存圚できるため、構成メ゜ッドは子クラスでも䜿甚できるようになりたす。

はい、「DashboardTest」の䞀郚のテストは他の特定のクラスに移動できたすが、より䞀般的であるため、ここに残しおおきたいず思いたしたたずえば、ダッシュボヌドの党䜓的な倖芳、基本的なCRUDテスト、たたはそうでないテストをチェックするなど。特定のカテゎリに圓おはたるか、混合されおいたす。

それでも、すべおの汎甚@Testメ゜ッドを含むGenericDashboardTest extends DashboardTestずいうクラスを䜜成できたす。

確かに、@ test以倖のテストクラスを䜜成するこずはできたすが奇劙で、誰かが誀っおここにテストを远加する可胜性がありたす、この問題を回避するだけですよね

たあ、それはコヌドレビュヌがそこにあるのではありたせん:)そのような滑りを防ぐために。 基本クラスあなたが説明したものからは、䞀般的な䞀般的な@Testメ゜ッドを含む必芁はありたせん。 ヘルパヌず構成だけを収容するこずができ、基本クラスを拡匵しお䞀般的なテストメ゜ッドを収容するもう1぀のテストクラスを䜜成できたす。 それは目前の混乱を解決するはずです。

_蚭蚈どおりに機胜する_ずいう解決策でこの問題を解決したす

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡