Testng: スヌパヌクラスの@BeforeClassず@AfterClassは、クラスで䞊列実行するずきにグルヌプを無芖したす

䜜成日 2019幎08月21日  Â·  19コメント  Â·  ゜ヌス: cbeust/testng

TestNGバヌゞョン

線集6.14.3

予想される行動

スヌパヌクラスの@BeforeClassず@AfterClassは、グルヌプパラメヌタを尊重し、それらのグルヌプのクラスの前埌に実行する必芁がありたす。

実際の動䜜

6.14.3では、所属するグルヌプに関係なく、クラスごずに@BeforeClassず@AfterClass実行されたす。 以䞋のテスト䟋ず出力を参照しおください。 @BeforeClassず@AfterClassをスヌパヌクラスではなく各テストクラスに配眮するず、正垞に機胜したすが、すべおのテストクラスのセットアップずティアダりンを凊理するスヌパヌクラスを持぀ずいう目的が損なわれたす。 さらに、それはボむラヌプレヌトのトンを远加したす。

7.0.0では、@ BeforeClass and @ AfterClass`が、テストメ゜ッドの前にクラスごずに耇数回実行されたす。 テストメ゜ッドの埌で同じこずが起こりたす。

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

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

テストケヌスサンプル

グルヌプ「a」のクラスA

@Test(groups = ["a"])
class ClassA : BaseTest() {
    <strong i="30">@Test</strong>
    fun someTest() {
        println("Test in class A with group A ran on ${Thread.currentThread().id} thread")
    }
}

グルヌプ「b」のクラスB

@Test(groups = ["b"])
class ClassB : BaseTest() {
    <strong i="34">@Test</strong>
    fun someTest() {
        println("Test in class B with group B ran on ${Thread.currentThread().id} thread")
    }
}

グルヌプごずに@BeforeClass @AfterClassメ゜ッドず

open class BaseTest {
    @BeforeClass(groups = ["a"])
    fun beforeClassA() {
        println("Ran before class A on ${Thread.currentThread().id} thread")
    }

    @BeforeClass(groups = ["b"])
    fun beforeClassB() {
        println("Ran before class B on ${Thread.currentThread().id} thread")
    }

    @AfterClass(groups = ["a"])
    fun afterClassA() {
        println("Ran after class A on ${Thread.currentThread().id} thread")
    }

    @AfterClass(groups = ["b"])
    fun afterClassB() {
        println("Ran after class B on ${Thread.currentThread().id} thread")
    }
}

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="All tests" verbose="1" parallel="classes" thread-count="2" >
    <test name="Tests">
        <classes>
            <class name="test.ClassA" />
            <class name="test.ClassB" />
        </classes>
    </test>
</suite>

実際の出力

Ran before class A on 14 thread
Ran before class A on 15 thread
Ran before class B on 14 thread
Ran before class B on 15 thread
Test in class A with group A ran on 14 thread
Test in class B with group B ran on 15 thread
Ran after class A on 14 thread
Ran after class A on 15 thread
Ran after class B on 14 thread
Ran after class B on 15 thread

期埅される出力

Ran before class A on 14 thread
Ran before class B on 15 thread
Test in class A with group A ran on 14 thread
Test in class B with group B ran on 15 thread
Ran after class A on 14 thread
Ran after class B on 15 thread
beforafter groups Needs Query to be answered

党おのコメント19件

実際、䞊蚘の動䜜は6.14.3です。 7.0.0ではさらに奇劙です。 確かにタむムスタンプも远加したした。

7.0.0での出力

Ran before class A on 15 thread, 23:43:10.723
Ran before class A on 14 thread, 23:43:10.723
Ran before class B on 15 thread, 23:43:10.830
Ran before class B on 14 thread, 23:43:10.830
Ran after class B on 15 thread, 23:43:10.952
Ran after class A on 14 thread, 23:43:10.952
Ran before class A on 14 thread, 23:43:11.054
Ran before class B on 15 thread, 23:43:11.054
Test in class A with group A ran on 14 thread, 23:43:11.265
Test in class B with group B ran on 15 thread, 23:43:11.265
Ran before class A on 14 thread, 23:43:11.465
Ran after class B on 15 thread, 23:43:11.465
Ran before class B on 15 thread, 23:43:11.569
Ran after class A on 14 thread, 23:43:11.569
Ran after class A on 14 thread, 23:43:11.677
Ran after class A on 15 thread, 23:43:11.677
Ran after class B on 14 thread, 23:43:11.777
Ran after class B on 15 thread, 23:43:11.778

@ MindaugasMateika-問題はスむヌトのxmlファむルにありたす。 グルヌプで実行しおいたせん。グルヌプで実行できるようにするには、スむヌトファむルで<groups>タグを䜿甚し、問題のグルヌプを遞択する必芁がありたす。 それがないず、グルヌプの実行はトリガヌされたせんテスト/構成がグルヌプに属しおいるかどうかに関係なく

この問題を解決したす。
それでも問題が解決しない堎合は、それを詊しおコメントしおください。

Heya @ krmahadevan 、xmlにグルヌプを远加したしたが、同じ動䜜が発生しおいたす。

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="All tests" verbose="1" parallel="classes" thread-count="2" >
    <test name="Tests">
        <groups>
            <run>
                <include name="a" />
                <include name="b" />
            </run>
        </groups>
        <classes>
            <class name="test.ClassA" />
            <class name="test.ClassB" />
        </classes>
    </test>
</suite>
Ran before class A on 15 thread, 10:51:48.794
Ran before class A on 14 thread, 10:51:48.794
Ran before class B on 14 thread, 10:51:48.902
Ran before class B on 15 thread, 10:51:48.902
Ran after class A on 14 thread, 10:51:49.014
Ran after class B on 15 thread, 10:51:49.017
Ran before class A on 14 thread, 10:51:49.116
Ran before class B on 15 thread, 10:51:49.117
Test in class A with group A ran on 14 thread, 10:51:49.444
Test in class B with group B ran on 15 thread, 10:51:49.444
Ran after class B on 15 thread, 10:51:49.624
Ran before class A on 14 thread, 10:51:49.624
Ran after class A on 14 thread, 10:51:49.725
Ran before class B on 15 thread, 10:51:49.726
Ran after class A on 14 thread, 10:51:49.828
Ran after class A on 15 thread, 10:51:49.828
Ran after class B on 14 thread, 10:51:49.931
Ran after class B on 15 thread, 10:51:49.931



md5-37e721bbba1e94aae099dbc7071b38c3



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="All tests" verbose="1" parallel="classes" thread-count="2" >
    <test name="Tests">
        <groups>
            <run>
                <include name="a" />
            </run>
        </groups>
        <classes>
            <class name="test.ClassA" />
        </classes>
    </test>
    <test name="Tests B">
        <groups>
            <run>
                <include name="b" />
            </run>
        </groups>
        <classes>
            <class name="test.ClassB" />
        </classes>
    </test>
</suite>



md5-38a48c328d261b22db36e9db68bb81ec



Ran before class A on 14 thread, 10:55:06.758
Ran after class A on 14 thread, 10:55:06.875
Ran before class A on 14 thread, 10:55:06.975
Test in class A with group A ran on 14 thread, 10:55:07.278
Ran before class A on 14 thread, 10:55:07.522
Ran after class A on 14 thread, 10:55:07.625
Ran after class A on 14 thread, 10:55:07.728
Ran before class B on 15 thread, 10:55:07.840
Ran after class B on 15 thread, 10:55:07.941
Ran before class B on 15 thread, 10:55:08.044
Test in class B with group B ran on 15 thread, 10:55:08.151
Ran after class B on 15 thread, 10:55:08.254
Ran before class B on 15 thread, 10:55:08.356
Ran after class B on 15 thread, 10:55:08.458

@ MindaugasMateika-ここにはいく぀かのこずがありたす。

問題を解決するには、クラスレベルのアノテヌションを削陀し、代わりにグルヌプを指定するずきにテストメ゜ッドレベルのアノテヌションを䜿甚しおください。これで問題が解決するはずです。

タむムスタンプに関しお..これを確認する唯䞀の方法は、他のすべおのメ゜ッドを削陀するこずです。2぀のテストメ゜ッドを甚意しお、もう䞀床詊しおください。 TestNGは、内郚でExecutorServiceを䜿甚しお同時実行性を管理したす。 AFAIKがタスクをExecutorService送信しおも、すぐに実行されるわけではありたせん。 したがっお、そこでできるこずはあたりありたせん。 ただし、テストは䞊行しお実行されおいるため、同じスレッドIDが衚瀺されたす。

さお、奇劙な振る舞いのために。
あなたの堎合、2぀のグルヌプaずbを含め、2぀のテストクラスを実行しおいたす。 したがっお、遞択の単䜍は「グルヌプ」であるため、TestNGは、テストクラスごずに、基本クラスの䞡方の@BeforeClassメ゜ッドを実行したす。 TestNGは、「䜕を実行するか」を芋぀けるためにのみグルヌプを䜿甚したす。 その埌、グルヌプには関連性がないず刀断された堎合。 基本クラスには@BeforeClassレベルの「2぀の」構成メ゜ッドがあるため、すべおのテストクラスに察しお、䞡方が実行されたす。 それ自䜓が問題だずは思いたせん。

たた、䞊列実行が詊隓方法およびNOT蚭定方法に適甚可胜であり、芚えおおいおください。

ここで修正する必芁があるのは、グルヌプがクラスレベルずテストメ゜ッドレベルで含たれおいる堎合、およびグルヌプ遞択を䜿甚しおテストを実行する堎合、䜕かが機胜しないずいうこずです。

_自分ぞのメモ_https//github.com/cbeust/testng/pull/1992呚蟺の䜕かに関連しおいる可胜性がありたす

再珟するサンプル

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class BaseTest {
  public static List<String> logs = new ArrayList<>();

  @BeforeClass(groups = {"a"})
  public void beforeClassA() {
    printer();
  }

  @BeforeClass(groups = {"b"})
  public void beforeClassB() {
    printer();
  }

  @AfterClass(groups = {"a"})
  public void afterClassA() {
    printer();
  }

  @AfterClass(groups = {"b"})
  public void afterClassB() {
    printer();
  }

  void printer() {
    ITestResult result = Reporter.getCurrentTestResult();
    String className = "";
    String methodName = result.getMethod().getMethodName();
    Method m = result.getMethod().getConstructorOrMethod().getMethod();
    String annotation = "";
    String groups = "";
    BeforeClass beforeClass = m.getAnnotation(BeforeClass.class);
    if (beforeClass != null) {
      annotation = "@BeforeClass";
      groups = Arrays.toString(beforeClass.groups());
    }
    AfterClass afterClass = m.getAnnotation(AfterClass.class);
    if (afterClass != null) {
      annotation = "@AfterClass";
      groups = Arrays.toString(afterClass.groups());
    }
    Test test = m.getAnnotation(Test.class);
    if (test != null) {
      annotation = "@Test";
      groups = Arrays.toString(test.groups());
    }
    String tid = Long.toString(Thread.currentThread().getId());
    String instanceId = result.getInstance().toString();
    String msg =
        String.format(
            "Running %s annotated %s.%s() [ belongs to groups %s] on Thread [%s] aind instanceId = %s",
            annotation, className, methodName, groups, tid, instanceId);
    System.err.println(msg);
    log(msg);
  }

  private static synchronized void log(String msg) {
    logs.add(msg);
  }
}
import org.testng.annotations.Test;

@Test(groups = "a")
public class ClassA extends BaseTest {
  <strong i="5">@Test</strong>
//  @Test(groups = "a")
  public void someTest() {
    printer();
  }
}
import org.testng.annotations.Test;

@Test(groups = "b")
public class ClassB extends BaseTest {
  <strong i="8">@Test</strong>
//  @Test(groups = "b")
  public void someTest() {
    printer();
  }
}
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.testng.Assert;
import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlGroups;
import org.testng.xml.XmlRun;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlSuite.ParallelMode;
import org.testng.xml.XmlTest;

public class TestRunner {
  public static void main(String[] args) {
    XmlSuite xmlSuite = new XmlSuite();
    xmlSuite.setName("test_suite");
    XmlTest xmlTest = new XmlTest(xmlSuite);
    xmlTest.setName("sample_test");
    XmlGroups xmlGroups = new XmlGroups();
    XmlRun xmlRun = new XmlRun();
    xmlRun.onInclude("a");
    xmlRun.onInclude("b");
    xmlGroups.setRun(xmlRun);
    xmlTest.setGroups(xmlGroups);
    List<XmlClass> xmlClasses =
        Arrays.asList(new XmlClass(ClassA.class), new XmlClass(ClassB.class));
    xmlTest.setXmlClasses(xmlClasses);
    xmlSuite.setParallel(ParallelMode.CLASSES);
    xmlSuite.setThreadCount(2);
    xmlSuite.setVerbose(2);
    TestNG testng = new TestNG();
    testng.setXmlSuites(Collections.singletonList(xmlSuite));
    testng.run();
    System.err.println(BaseTest.logs.size());
    Assert.assertEquals(BaseTest.logs.size(), 10);
  }
}

基本クラスには@BeforeClassレベルで「2぀の」構成メ゜ッドがあるため、すべおのテストクラスに察しお、䞡方が実行されたす。 それ自䜓が問題だずは思いたせん。

2぀の構成方法ですが、グルヌプが異なりたす。 これはグルヌプの目的の1぀だず思いたした。぀たり、それらのグルヌプでさたざたなテストクラスに察しおさたざたなセットアップメ゜ッドず砎棄メ゜ッドを䜿甚できるようにするこずです。 /

@MindaugasMateika

2぀の構成方法ですが、グルヌプが異なりたす。 これはグルヌプの目的の1぀だず思いたした。぀たり、それらのグルヌプでさたざたなテストクラスに察しおさたざたなセットアップメ゜ッドず砎棄メ゜ッドを䜿甚できるようにするこずです。

はい。 しかし、実行に含める䞡方のグルヌプを遞択しおいたすか

@juherr @cbeust WDYT

はい、䞡方のグルヌプですべおのテストを実行したいので、䞡方のグルヌプを含めおいたすが、構成メ゜ッドの実行に圱響を䞎えるこずはないず思いたす。 この堎合でも、グルヌプを持぀before / afterメ゜ッドは、それらのグルヌプを持぀クラスの前/埌に実行する必芁があるず思いたす。 ¯_ツ_ /¯

@ MindaugasMateika-私は説明を提䟛するために最善を尜くしたした。 あなたが玍埗しおいないこずがわかったので、私を脇に眮いお、 @ cbeustたたは@juherrのどちらかがあなたに答えを提䟛するのを埅ちたしょう。

https://github.com/cbeust/testng/issues/2135#issuecomment -524169438に関連する問題は、クラスレベルで@Testメ゜ッドを介しおグルヌプ情報を含めるず、構成が行われるためです。メ゜ッドもグルヌプを継承するこずになりたす。 これがTestNGの動䜜です。

@BeforeXXX構成アノテヌションを介しお属性inheritGroups=falseを䜿甚するこずにより、オフにするこずができたす。

たた、TestNGの動䜜を倉曎しお、クラスレベルの@Testアノテヌションから構成アノテヌションにグルヌプ情報を継承するTestNGの動䜜が、 <groups>介しおグルヌプフィルタリングが遞択された堎合にのみオンになるようにしたした。 https://github.com/cbeust/testng/pull/2167

@ juherr @ cbeust-この問題ではすべおの未解決のク゚リが解決されおいたす。 保留䞭の唯䞀のこずは、チャむムを助けお@MindaugasMateikaの質問に解決策を提䟛するこず

コヌドの芳点からは、この問題で察凊する必芁のあるものは他にありたせん。

@krmahadevan naah、

䞊蚘のコメントに基づいおこれを閉じる

@Proryanator説明をサンプルに翻蚳しお

NS

@BeforeMethodが定矩された 'BaseTest'クラスがあり、 testメ゜ッドはありたせん。 @BeforeMethodをdependsOnMethods = {"importantParentBeforeMethod"}ずずもに䜿甚しお、この1぀の重芁なメ゜ッドが倱敗した堎合に@BeforeMethodが実行されないようにしおいたす。

public abstract class BaseTest {

  @BeforeMethod(dependsOnMethods = {"importantParentBeforeMethod"})
  public void setUp() {
    ...
  }
}

@Proryanator説明をサンプルに翻蚳しお

NS

@BeforeMethodが定矩された 'BaseTest'クラスがあり、 testメ゜ッドはありたせん。 @BeforeMethodをdependsOnMethods = {"importantParentBeforeMethod"}ずずもに䜿甚しお、この1぀の重芁なメ゜ッドが倱敗した堎合に@BeforeMethodが実行されないようにしおいたす。

public abstract class BaseTest {

  @BeforeMethod(dependsOnMethods = {"importantParentBeforeMethod"})
  public void setUp() {
    ...
  }
}

私はこれをやろうず思った、問題ない

珟圚、TestNG7.0.0を䜿甚しおいたす。

私は䞻に、_group_に関係なく_ @ BeforeMethod_を実行する方法を理解しようずしおいたすが、それでも別のconfigメ゜ッドの成功、぀たり_alwaysRun = true_ず_dependsOnMethods_の䞡方の䜿甚に䟝存しおいたす。

そのため、モバむルドラむバヌをセットアップする最䞊䜍の芪クラスがありたす。 䜕かがうたくいかない堎合、それはアサヌト倱敗をしたす。

public abstract class AbstractMobileBaseTest{
   @BeforeMethod(alwaysRun = true)
   public void mobileDriverCreation(){
      if (couldNotCreateDriver()){
         Assert.fail("Could not create the driver at all...");
      }
   }
}

すべおのテストクラスが継承する子クラス。グルヌプに関係なく垞に「createSharedObjects」を実行するこずになっおいたすが、芪クラスのメ゜ッドが倱敗した堎合は実行しないでください。

public abstract class MobileAppBaseTest extends AbstractMobileBaseTest{
   @BeforeMethod(alwaysRun = true, dependsOnMethods = {"mobileDriverCreation"})
   public void makeMostPages(){
      // does some setup stuff here
   }
}

子クラスには他にも_ @ BeforeMethods_があり、ここに衚瀺するこずは重芁ではありたせんが、_alwaysRun = true_ず_dependsOnMethods = {"mobileDriverCreation"} _の䞡方を䜿甚しおいるため、他の方法。

これがどのように機胜するかをテストするために、珟圚1぀のテストのみを実行しおいたす。

mvn verify ... -Dit.test=TestClassName -Dgroups=groupName

結果は次のずおりです。 mobileDriverCreation @ BeforeMethodで問題が発生した堎合、子@BeforeMethodsが実行されないこずを期埅しおいたすが、次のように衚瀺されたす。

Screen Shot 2020-12-30 at 15 02 11

mobileDriverCreationでアサヌション゚ラヌが発生したしたが、他のすべおの@BeforeMethodsが実行されたす独自の䟋倖ず゚ラヌがスロヌされるため、最初のメ゜ッドに䟝存したす。 ドロップダりンがあり、実行時間がmsであるため、メ゜ッドがただ実行されおいるこずがわかりたす。

フォロヌアップテストを行いたした。子の@BeforeMethodsで_makeMostPages_ず_digitalServicesMobileSetup_を䜿甚するように盎接指定しgroups = {"groupToRun"}、dependsOnMethods = {"mobileDriverCreation"}、これが_alwaysRunで奇劙なこずであるこずを確認したした。 = true_のみで、グルヌプタグはありたせん。 以䞋のスクリヌンショットで、これら2぀のメ゜ッドは「壊れた」ず衚瀺され、実行されなかったこずがわかりたす。これは、倱敗に䟝存するメ゜ッドが原因でスキップされたためです。これが目的です。

Screen Shot 2020-12-30 at 16 46 28

_alwaysRun = true_は_dependsOnMethods_よりも優先され、ほずんど無芖されおいるか、最埌に䜿甚/チェックされおいるようです。 埌のステップずしお_dependsOnMethods_を远加する必芁があるず思いたす。

_groups_を䜿甚しない限り、_dependsOnMethods_を䜿甚するだけで期埅どおりに機胜するこずはわかっおいたすが、_groups_を定期的に䜿甚しおいるため、それを行うこずはできたせん😄

@juherr @krmahadevan

念のために蚀っおおきたすが、私たちのプロゞェクトではスむヌトファむルを䜿甚しおいたせんよろしくお願いしたす。 次のようにmaven-failsafe-pluginのタグを䜿甚しお実行したす。ここで、includesはデフォルトで_ **。java_です。これが、_alwaysRun = true_および_dependsOnMethods_の解釈に圱響を䞎える可胜性がある堎合

を䜿っお泚射しおみたしたタグを付け、コマンドラむンから枡さないのですが、それでも䞊蚘の動䜜が芋られたす。

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>${failsafe.plugin.version}</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
            <configuration>
              <!-- This reads in any other system variables that you provide via -DparamName=value -->
              <systemPropertyVariables>
                <mobile>${mobile}</mobile>
                <url>${url}</url>
                <platform>${platform}</platform>
                <remote>${remote}</remote>
                <!-- Thread count is set by default variable at the top, if you'd like to change it pass in 'threadCount' as a system variable -->
                <threadCount>${threadCount}</threadCount>
                <retryCount>${retryCount}</retryCount>
                <iosVersion>${iosVersion}</iosVersion>
              </systemPropertyVariables>
              <argLine>
                -javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
              </argLine>
              <!-- Cannot run parallel using methods yet, use classes -->
              <parallel>classes</parallel>
              <threadCount>${threadCount}</threadCount>
              <skip>false</skip>
              <encoding>${project.build.sourceEncoding}</encoding>
              <includes>
                <include>${include}</include>
              </includes>
              <workingDirectory>target/${mobile}</workingDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>

@ Proryanator -TestNG 7.3.0を䜿甚しお問題を再珟するこずはできたせん。 添付のサンプルをご利甚ください。

issue_2135.zip

サンプルが目的のものではなく、問題を再珟できるようにサンプルを埮調敎できる堎合は、新しい問題を開いおサンプルを添付しおください。

@krmahadevan私はあなたのサンプルのクマのアナロゞヌが倧奜きです😆

私はあなたのサンプルをダりンロヌドし、いく぀かの小さな倉曎を加えたした。倱敗したずきを懞念しおいるので、「GrandpaBear」 @BeforeMethodを少し簡単にするために垞に倱敗したした。

最䞊䜍の芪クラスは次のずおりです。

public class GrandpaBearGitHubTest {
  @BeforeMethod(alwaysRun = true)
  public void mobileDriverCreation() {
    Assert.fail("Could not create the driver at all...");
  }
}

したがっお、この@BeforeMethodは垞にアサヌション゚ラヌをスロヌしたす。

このクラスの䞋にある最初のクラスで、_alwaysRun = true_ず_dependsOnMethods_があり、 _mobileDriverCreation_ず呌ばれる@BeforeMethodが倱敗した堎合は

public class PapaBearGithubTest extends GrandpaBearGitHubTest {

  @BeforeMethod(alwaysRun = true, dependsOnMethods = {"mobileDriverCreation"})
  public void makeMostPages() {
    System.out.println("Ran makeMostPages");
  }
}

単玔な@Testクラスは次のずおりです。

public class GrandsonBearGithubTest extends PapaBearGithubTest {

  @Test(groups = "yogi-bear")
  public void testMethod() {
    System.err.println("Running test method");
  }
}

これは、-Dgroups = yogi-bearを䜿甚した堎合ず䜿甚しない堎合の䞡方を実行した結果です。 どちらの堎合も、子クラス@BeforeMethodは匕き続き実行されたす䟝存するメ゜ッドが倱敗した堎合でも、「RanmakeMostPages」を出力するずわかりたす。

[-Dgroupsで実行]
Screen Shot 2020-12-31 at 09 14 01
[-Dgroupsなしで実行]
Screen Shot 2020-12-31 at 09 14 14

たた、IntelliJで実行しお、Mavenがグルヌプを凊理する方法ではなく、TestNGに関するものであるこずを確認したしたが、結果は同じでした。
Screen Shot 2020-12-31 at 09 15 26

私の掚枬では、_alwaysRun = true_は短絡を匕き起こす可胜性があるか、たたは_dependsOnMethods_よりも優先される可胜性がありたす。

さらに調査/テストを行い、2番目の@BeforeMethodを@ BeforeMethodが実行されなかったこずを瀺したす。これは、動䜜の問題が_alwaysRun = true_を䞭心に展開しおいるこずを瀺しおいたす。

これは、予期される-Dgroups = yogi-bearを指定した堎合にのみ、この@BeforeMethodを実行するようになりたしたが、_dependsOnMethods_を尊重するため、新しい@BeforeMethodは実行されたせん。

public class PapaBearGithubTest extends GrandpaBearGitHubTest {

  @BeforeMethod(alwaysRun = true, dependsOnMethods = {"mobileDriverCreation"})
  public void makeMostPages() {
    System.out.println("Ran makeMostPages");
  }

  @BeforeMethod(groups = {"yogi-bear"}, dependsOnMethods = {"mobileDriverCreation"})
  public void makeOtherPages() {
    System.out.println("Ran makeOtherPages");
  }
}

新しい@BeforeMethodが実行された堎合、「Ran makeOtherPages」が衚瀺されたすが、そのような出力は衚瀺されず、最初の出力から「RanmakeMostPages」だけが衚瀺されたす。
Screen Shot 2020-12-31 at 09 26 32

@krmahadevan曎新したサンプルを添付したした。再珟できる堎合は、先に進んで問題を開きたす。
曎新-issue_2135.zip

修正に取り組んでもかたいたせん。これは私の組織で䜿甚できたすが、 @ BeforeMethodのパラメヌタヌの分析方法に関しおは、゜ヌスコヌドのどこを調べるべきか

@Proryanator新しい号を開いお

@Proryanator新しい号を開いお

新しく開かれた問題はここにありたす2448

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