我们可以跳过testngxml中的java@AfterClass方法吗

我们可以跳过testngxml中的java@AfterClass方法吗,java,testng,skip,Java,Testng,Skip,我有一个testngjava类,其中一些测试有@BeforeClass和@AfterClass。我使用xml来运行这个testng类。有时我可能需要跳过@AfterClass,因为它通常会清理测试台 我们如何做到这一点,只跳过@AfterClass 在我的情况下,我想跳过下课 所以把“一些场景”放在一个条件 @AfterClass public void after() { if (something) { //do stuff } } @BeforeC

我有一个testngjava类,其中一些测试有@BeforeClass和@AfterClass。我使用xml来运行这个testng类。有时我可能需要跳过@AfterClass,因为它通常会清理测试台

我们如何做到这一点,只跳过@AfterClass


在我的情况下,我想跳过下课

所以把“一些场景”放在一个条件

@AfterClass
public void after()
{
    if (something)
    {
        //do stuff
    }
}

@BeforeClass在所有测试开始之前调用一次,类似地,在所有测试执行之后只调用一次@AfterClass。因此,在@AfterClass方法中添加场景检查毫无意义,因为它是将在junit类和程序出口中执行的最后一个方法。
如果您想在每次@Test执行之前/之后检查某些条件,请使用@before/@after

您可以尝试使用TestNG侦听器。例如,我们可以有以下测试类
com.example.SampleTest

public class SampleTest {

  @BeforeClass
  public void setUp() {
    System.out.println("Executing before class method.");
  }

  @Test
  public void test() {
    Assert.assertEquals(1, 1);
  }

  @AfterClass
  public void tearDown() {
    System.out.println("Executing after class method.");
  }
}
要禁用执行
@AfterClass
方法,您可以创建一个侦听器
com.example.AfterClassListener
,如下所示:

public class AfterClassListener implements IAnnotationTransformer2 {

  @Override
  public void transform(IConfigurationAnnotation annotation, Class testClass,
      Constructor testConstructor, Method testMethod) {
    if (annotation.getAfterTestClass()){
      annotation.setEnabled(false);
    }
  }
}
之后,将此侦听器添加到您的
testng.xml
文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="test-suite" verbose="1" thread-count="3" parallel="none">
  <listeners>
    <listener class-name="com.example.AfterClassListener"/>
  </listeners>
  <test name="Login Test">
    <classes>
      <class name="com.example.SampleTest"/>
    </classes>
  </test>
</suite>


每当您想重新启用它时,只需从
testng.xml

中删除此侦听器。如果它是预先决定的,即在套件开始运行之前,您知道是否要清除,则可以使用参数/系统属性对其进行控制。 将参数放入xml文件中,并根据需要执行的操作将其设置为true和false。您甚至可以从系统变量中读取它

您的@AfterClass可以检查

if (toDeleteDb) -> clear -> else return (do nothing)

如果是在运行时,则设置属性并用该属性替换If条件

为什么您有一个@AfterClass块,当您实际上不希望它存在时,它应该在单元测试完成后调用?如果你不想要它,你就不能把它拿走吗?请详细解释应该调用哪些测试和准备/清理代码,哪些不应该调用(以及为什么)。在我的例子中,有些场景我想跳过清除测试台上数据的afterclass。因此,我不想让一个单独的类没有AfterClass,而是想通过跳过它来重用它。这些测试不是在一个没有
@AfterClass
的类中,这样就不会清理测试床了吗?当
@AfterClass
(应该在类的测试完成后调用)实际上没有被调用时,维护测试听起来会很困难。非常感谢,可以这样做,但是我们不能在testng xml文件中进行吗?很好,让我来尝试一下