TestNG的执行顺序是什么?

what is execution order of TestNG?

Parent class 有@BeforeClass。 Child class 有@BeforeClass 和@Test。什么是执行令? 如果两个class中的@BeforeClass方法名称相同,执行顺序是什么?

首先执行父 class 中的 @BeforeClass,然后执行子 class 中的 @BeforeClass。 如果 @BeforeClass 名称在父项和子项 class 中相同,那么您只是重写该方法,因此仅执行子项 class @BeforeClass

关于注释的顺序,我引用TestNG documentation:
"TestNG 保证“@Before”方法按继承顺序执行(最高的 superclass 先执行,然后沿继承链向下执行),“@After”方法按相反顺序执行(执行在继承链上)"

这是一个例子。
在这个例子中, 运行 之前的顺序是:A_BeforeClass -> B_BeforeClass 运行 之后的顺序是:B_AfterClass -> A_AfterClass

   public class A {
     @BeforeClass
      A_BeforeClass(){...}
       
     @AfterClass
       A_AfterClass(){...}       
    }
    
    public class B extends A {    
     @BeforeClass
       public void B_BeforeClass(){...}

     @AfterClass
       public void B_AfterClass(){...}
    }

现在,如果我们把B_BeforeClass()的名字改成A_Beforeclass(),这个方法就被重写了,因此,A_BeforeClass只在classB中实现了将被执行。

但是,从非抽象 class 继承并覆盖父测试夹具 并不是一个好的代码实践。它使测试更难理解并增加了代码维护工作量。

我建议尝试避免从非抽象测试用例继承。如果两个测试用例共享许多测试方法,更好的解决方案是创建一个测试实用程序 class 或将通用测试方法重构为单独的测试用例。