@BeforeMethod和继承 - 执行顺序 (TestNG)

2022-09-03 07:48:52

我的问题基本上与这个SOF问题相同,但处理的不是TestNG。@BeforeMethod@BeforeClass

测试类继承在确定带批注方法的执行顺序时是否起着重要作用?如果我有类A和类B扩展A并且都有一个方法,那么父级的(A)将在子级(B)之前运行,还是子类在父级之前运行,或者顺序是否取决于其他一些因素,例如方法名称的字母顺序。我试图看看是否有我可以依赖的继承顺序,而不必使用注释的参数,例如依赖OnMethods。@BeforeMethod@BeforeMethod


答案 1

如果我有A类并且B类扩展A并且都有一个@BeforeMethod方法,那么父母的(A)会在孩子的(B)之前运行[...]

是的,他们会的。

@BeforeMethod方法将按继承顺序运行 - 首先是最高的超类,然后沿着继承链向下移动。 方法以相反的顺序运行(沿继承链向上)。@AfterMethod

但是,请注意,不能保证一个类中多个带注释的方法进行排序(因此最好避免这种情况)。


阅读代码,似乎在所有版本的TestNG中都是如此,但是它仅在2016年10月才被记录下来:

当将上述注释放在TestNG类的超类上时,也会被尊重(继承)。例如,这对于集中一个公共超类中多个测试类的测试设置非常有用。

在这种情况下,TestNG保证“@Before”方法按继承顺序执行(首先是最高的超类,然后沿着继承链向下),“@After”方法以相反的顺序执行(沿着继承链向上)。

请参阅 GitHub 上的文档-main.html联机文档

免责声明:是我编写并提交了此添加到文档中。


答案 2

如其他答案所述,TestNG将考虑执行顺序的继承。

如果您希望显式设置“Before”方法的顺序,也可以让子级直接调用父级设置。

public class ChildTest extends ParentTest {

    @BeforeMethod
    public void setup() {
       super.setup();
       // Child setup code follows here.
    }
}

public class ParentTest {
    @BeforeMethod // Only need if test will ever be invoked directly
    public void setup() {
      // Parent setup goes here.
    }
}

推荐