【问题标题】:Is it possible to give @AfterXXX TestNG annotations in a Java class which doesn't follow inheritance chain?是否可以在不遵循继承链的 Java 类中提供 @AfterXXX TestNG 注释?
【发布时间】:2018-07-12 10:00:37
【问题描述】:

我在示例项目中有 3 个 Java 类,但在不同的包中:A 类、B 类和 C 类。

B 类扩展了 A 类。B 类是我的主类,我在其中对几个方法进行了 @Test 注释,如下所示:

Class B extends A {

  @Test
  public void Method1(){
      ...
  }

  @Test
  public void Method2(){
      ...
  }

}

现在在 Class A 中,它是 Class B 的父类,包含各种 @BeforeXXX 和 @AfterXXX 注解的方法以及其他方法,如下所示:

Class A {

  @BeforeTest
  public void Method3(){
      ...
  }

  @BeforeMethod
  public void Method2(){
      ...
  }

  @AfterMethod
  public void Method2(){
      ...
  }

}

现在,我有一个与主类 B 无关的类 C。但我想在该类 C 中添加一个带有 @AfterSuite 注释的方法。在调试过程中,我发现执行没有到C类中@AfterSuite注解的方法。

那么,任何人都可以提出一些我可以实现我想要的东西吗?

【问题讨论】:

  • 如果您已经声明您的测试与该方法所在的类之间没有任何联系,您如何看待实现这一目标?
  • 实际上它们在同一个项目中,但在不同的包中。这就是为什么,我想知道是否有任何技术可以实现我想要的。
  • 他们是否在同一个项目中,无关紧要。如果测试和您的 afterTest 之间没有链接,您希望它如何运行?

标签: java annotations automated-tests testng


【解决方案1】:

我认为您的问题的解决方案非常简单。您需要做的就是将@AfterSuite 注解放在A 类或B 类中。

仅在一个中使用@BeforeSuite + @AfterSuite 是一种很好的做法 地方(所以你知道套件前后加载了什么,而不是 必须去所有课程并连接结果。另外,如果你想 将来改变一些东西会更容易。

但你的问题的答案是放在A类中:

Class A {

  @BeforeTest
  public void Method3(){
      ...
  }

  @BeforeMethod
  public void Method2(){
      ...
  }

  @AfterMethod
  public void Method2(){
      ...
  }

  @AfterSuite
  public void afterSuite(){
      ...
  }

}

如果您有任何问题,请随时在下面发表评论;但是是的,@AfterSuite 注释将在套件的所有测试完成后执行。所以假设这是你启动 TestNG 的 XML 文件:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="AfterSuite">


  <test name="test1">
    <classes> 
     <class name="tests.A"/>        
     </classes>
  </test>

    <test name="test2">
    <classes> 
     <class name="tests.B"/>        
     </classes>
  </test>

   <test name="test3">
    <classes> 
     <class name="tests.C"/>        
     </classes>
  </test>


</suite>

只要套件中的所有类都是实际测试,@AfterSuite 注释的位置并不重要。您提到了您的调试表明未达到 C 类的内容;因此,如果您仅为 @AfterSuite 注释创建 C,您可能根本不需要它。事实上,即使您将 @AfterSuite 注释放在 B 类中,它也会起作用。但据我了解,您的 TestBase 是 A 类(只要所有其他类都扩展它),所以它可能是放置它的更好地方.

祝你好运! :)

PS。如果您想要另一个没有继承的解决方案(即仍然保留 C 类),您需要做的就是将 A 类的 obj 创建到 C 类中。例如:

Class C {
A objectOfClassA = new A();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多