我的项目中有两个单独的包,一个用于集成测试,一个用于单元测试,我的 testng.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="All test cases" verbose="1" parallel="classes">
<test name="Integration Tests">
<classes>
<class name="com.sample.integration.ClassC"/>
<class name="com.sample.integration.ClassD"/>
</classes>
</test>
<test name="Unit tests">
<classes>
<class name="com.sample.unit.ClassA"/>
<class name="com.sample.unit.ClassB"/>
</classes>
</test>
</suite>
C类:
public class ClassC {
@BeforeTest
public void beforeIntegrationTests() {
System.out.println("Before Integration tests");
}
@Test
public void classCMethod() {
System.out.println("Executing class C method");
}
}
D类:
public class ClassD {
@Test
public void classDMethod() {
System.out.println("Executing class D method");
}
}
A类:
public class ClassA {
@BeforeTest
public void beforeUnitTests() {
System.out.println("Before unit tests");
}
@Test
public void classAMethod() {
System.out.println("Executing class A method");
}
}
B类:
public class ClassB {
@Test
public void classBMethod() {
System.out.println("Executing class B method");
}
}
如果我运行整个测试套件,它会按预期工作,如下所示:
Before Integration tests
Executing class C method
Executing class D method
Before unit tests
Executing class A method
Executing class B method
但是,如果我尝试运行/调试 classAMethod()
来自ClassA
,它运行 beforeUnitTests()
[预期] 和 classAMethod()
[预期],但它也运行 beforeIntegrationTests()
这是没有预料到的。根据official documentation :@BeforeTest
:带注释的方法将在属于<test>
内的类的任何测试方法之前运行。标签已运行。
如何配置 TestNG 和/或 IntelliJ 才能正确运行?
旁注:虽然我可以看到 beforeIntegrationTests()
通过在 Debug模式下添加断点或添加 Thread.sleep
来运行在运行模式下,此方法的输出不会打印在最终控制台输出中。
最佳答案
Firstly, is the expectation valid, as in I expect only beforeUnitTests() and classAMethod() to run if I run just the classAMethod().
不,所有带 @BeforeTest
注释的方法都会在执行带 @Test
注释的方法之前运行。
处理这种情况的理想方法是使用组
。
A类:
public class ClassA {
@BeforeTest(groups="unitTest")
public void beforeUnitTests() {
System.out.println("Before unit tests");
}
@Test(groups="unitTest")
public void classAMethod() {
System.out.println("Executing class A method");
}
}
B类:
public class ClassB {
@Test(groups="unitTest")
public void classBMethod() {
System.out.println("Executing class B method");
}
}
C类:
public class ClassC {
@BeforeTest(groups="integrationTest")
public void beforeIntegrationTests() {
System.out.println("Before Integration tests");
}
@Test(groups="integrationTest")
public void classCMethod() {
System.out.println("Executing class C method");
}
}
D类:
public class ClassD {
@Test(groups="integrationTest")
public void classDMethod() {
System.out.println("Executing class D method");
}
}
testNG XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="All test cases" verbose="1" parallel="classes">
<groups>
<run>
<include name="unitTest"></include>
</run>
</groups>
<test name="Test Suite">
<classes>
<class name="com.sample.integration.ClassC"/>
<class name="com.sample.integration.ClassD"/>
<class name="com.sample.unit.ClassA"/>
<class name="com.sample.unit.ClassB"/>
</classes>
</test>
</suite>
您可以根据需要对此 testNg XML 进行进一步配置。
关于java - 如何配置 TestNG 以在 IntelliJ 中仅运行单个测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61715871/