原文: https://howtodoinjava.com/testng/testng-before-and-after-annotations/

TestNG 的前后注解主要用于在执行测试方法之前和之后执行一组特定的代码。 这些用于基本上在测试执行开始之前设置一些变量或配置,然后在测试执行结束之后清除所有这些内容。

1. TestNG 的前后注解

TestNG 提供了五种不同的BeforeAfter注解选项,可以根据测试要求使用每种注解选项。 以下是 TestNG 提供的不同之前和之后选项。

注解 描述
@BeforeSuite 带注解的方法将在该套件中的所有测试运行之前运行。
@BeforeTest 带注解的方法将在运行属于test标记内的类的任何测试方法之前运行。
@BeforeGroups 此配置方法将在其之前运行的组的列表。 保证此方法可以在调用属于任何一个组的第一个测试方法之前不久运行。
@BeforeClass 带注解的方法将在调用当前类中的第一个测试方法之前运行。
@BeforeMethod 带注解的方法将在当前类中的所有测试方法运行之前运行。
@AfterSuite 带注解的方法将在该套件中的所有测试运行之后运行。
@AfterTest 带注解的方法将在所有属于test标记内的类的测试方法运行后运行。
@AfterGroups 此配置方法将在其后运行的组的列表。 保证在调用属于这些组中任何一个的最后一个测试方法后不久便可以运行该方法。
@AfterClass 带注解的方法将在当前类中的所有测试方法运行之后运行。
@AfterMethod 带注解的方法将在每种测试方法之后运行。

让我们尝试一个包含所有前面带注解的方法的示例,并了解它们何时执行。

2. TestNG 前后注解的示例

创建一个具有所有前后注解的新 TestNG 测试。 您可以根据此 TestNG 教程“)中给出的说明来创建此测试。 让我们看看如何选择所有之前和之后的注解。

TestNG 的前后注解 - 图1

单击确定后,您将获得带有所有注解的测试。 在所有方法中添加一些打印语句,以便可以按执行顺序对其进行跟踪。

  1. package com.howtodoinjava.test;
  2. import org.testng.annotations.AfterClass;
  3. import org.testng.annotations.AfterMethod;
  4. import org.testng.annotations.AfterSuite;
  5. import org.testng.annotations.AfterTest;
  6. import org.testng.annotations.BeforeClass;
  7. import org.testng.annotations.BeforeMethod;
  8. import org.testng.annotations.BeforeSuite;
  9. import org.testng.annotations.BeforeTest;
  10. import org.testng.annotations.Test;
  11. public class MyFirstTest
  12. {
  13. @Test
  14. public void testCase() {
  15. }
  16. @BeforeSuite
  17. public void beforeSuite() {
  18. System.out.println("Before Suite method");
  19. }
  20. @AfterSuite
  21. public void afterSuite() {
  22. System.out.println("After Suite method");
  23. }
  24. @BeforeTest
  25. public void beforeTest() {
  26. System.out.println("Before Test method");
  27. }
  28. @AfterTest
  29. public void afterTest() {
  30. System.out.println("After Test method");
  31. }
  32. @BeforeClass
  33. public void beforeClass() {
  34. System.out.println("Before Class method");
  35. }
  36. @AfterClass
  37. public void afterClass() {
  38. System.out.println("After Class method");
  39. }
  40. @BeforeMethod
  41. public void beforeMethod() {
  42. System.out.println("Before Method");
  43. }
  44. @AfterMethod
  45. public void afterMethod() {
  46. System.out.println("After Method");
  47. }
  48. }

现在在测试用例上运行 TestNG 测试,您将在控制台中获得以下输出。

  1. [TestNG] Running:
  2. C:\Users\somepath\testng-customsuite.xml
  3. Before Suite method
  4. Before Test method
  5. Before Class method
  6. Before Method
  7. After Method
  8. After Class method
  9. After Test method
  10. PASSED: testCase
  11. ===============================================
  12. Default test
  13. Tests run: 1, Failures: 0, Skips: 0
  14. ===============================================
  15. After Suite method
  16. ===============================================
  17. Default suite
  18. Total tests run: 1, Failures: 0, Skips: 0
  19. ===============================================
  20. [TestNG] Time taken by org.testng.reporters.XMLReporter@177b3cd: 19 ms
  21. [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
  22. [TestNG] Time taken by org.testng.reporters.jq.Main@b8deef: 53 ms
  23. [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@10ab323: 13 ms
  24. [TestNG] Time taken by org.testng.reporters.EmailableReporter2@5e176f: 11 ms
  25. [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@d1e89e: 184 ms

恭喜,您已经成功创建了具有各种前后注解的测试类,并执行了该类。

当前示例仅包含存在于同一类中的注解。 当包含注解的类被另一个具有前后一组注解的类扩展时,让我们学习执行流程。

3. 在超类上放置之前和之后注解

让我们创建两个新类BaseClassChildClass。 然后在两者上添加类似的前后注解。 这里主要要注意的是ChildClass extends BaseClass。 测试在ChildClass类中定义。

3.1 父类

  1. package com.howtodoinjava.test;
  2. import org.testng.annotations.AfterClass;
  3. import org.testng.annotations.AfterMethod;
  4. import org.testng.annotations.BeforeClass;
  5. import org.testng.annotations.BeforeMethod;
  6. public class BaseClass {
  7. @BeforeMethod
  8. public void beforeMethod() {
  9. System.out.println("BaseClass's Before Test method");
  10. }
  11. @AfterMethod
  12. public void afterMethod() {
  13. System.out.println("BaseClass's After Test method");
  14. }
  15. @BeforeClass
  16. public void beforeClass() {
  17. System.out.println("BaseClass's Before Class method");
  18. }
  19. @AfterClass
  20. public void afterClass() {
  21. System.out.println("BaseClass's After Class method");
  22. }
  23. }

2. 子类

  1. package com.howtodoinjava.test;
  2. import org.testng.annotations.AfterClass;
  3. import org.testng.annotations.AfterMethod;
  4. import org.testng.annotations.BeforeClass;
  5. import org.testng.annotations.BeforeMethod;
  6. import org.testng.annotations.Test;
  7. public class ChildClass extends BaseClass {
  8. @BeforeMethod
  9. public void beforeChildMethod() {
  10. System.out.println("ChildClass's Before Test method");
  11. }
  12. @AfterMethod
  13. public void afterChildMethod() {
  14. System.out.println("ChildClass's After Test method");
  15. }
  16. @BeforeClass
  17. public void beforeChildClass() {
  18. System.out.println("ChildClass's Before Class method");
  19. }
  20. @AfterClass
  21. public void afterChildClass() {
  22. System.out.println("ChildClass's After Class method");
  23. }
  24. @Test
  25. public void testCase() {
  26. System.out.println("===== Executing actual test ======");
  27. }
  28. }

执行ChildClass测试将生成以下输出。

  1. [TestNG] Running:
  2. C:\Users\somepath\testng-customsuite.xml
  3. BaseClass's Before Class method
  4. ChildClass's Before Class method
  5. BaseClass's Before Test method
  6. ChildClass's Before Test method
  7. ===== Executing actual test ======
  8. ChildClass's After Test method
  9. BaseClass's After Test method
  10. ChildClass's After Class method
  11. BaseClass's After Class method
  12. PASSED: testCase
  13. ===============================================
  14. Default test
  15. Tests run: 1, Failures: 0, Skips: 0
  16. ===============================================
  17. ===============================================
  18. Default suite
  19. Total tests run: 1, Failures: 0, Skips: 0
  20. ===============================================
  21. [TestNG] Time taken by org.testng.reporters.EmailableReporter2@1549f94: 13 ms
  22. [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
  23. [TestNG] Time taken by org.testng.reporters.XMLReporter@1bd7848: 16 ms
  24. [TestNG] Time taken by org.testng.reporters.jq.Main@1342ba4: 52 ms
  25. [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@176e552: 12 ms
  26. [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@ff057f: 190 ms

如您所见,TestNG 的报告输出在被注解的方法之前执行父类,然后在被注解的方法之前执行子类。 在带注解的方法之后,先执行子类方法,然后再执行父类。

这有助于我们在所有测试类中使用通用的注解前方法,并在需要时为每个测试类使用特定的前/后注解方法

如果您有任何问题要给我留言。

学习愉快!

参考:

TestNG 文档[HTG1]