我对 TestNG 中的
BeforeSuite
注释有问题。
我想初始化 beforeSuite()
中的一些变量,以便所有类都可以直接使用它们。只有A类才能获取该值。 B类不能;它变为空。
Base.java:
public class Base {
public String name;
@BeforeSuite
public void beforeSuite(){
name = "stackoverflow";
}
}
A.java:
public class A extends Base{
@Test
public void test(){
System.out.println("A name:" + name);
}
}
B.java
public class B extends Base{
@Test
public void test(){
System.out.println("B name:" + name);
}
}
textng.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="suite1" parallel="classes" thread-count="1" preserve-order="true">
<test name="testValue">
<classes>
<class name="A"/>
<class name="B"/>
</classes>
</test>
</suite>
测试结果:
mvn clean test
.
.
.
[INFO] Running TestSuite
B name:null
A name:stackoverflow
我的TestNG版本是6.8.8。
问题出在测试代码上。您有一个由多个子类扩展的公共基类,并且在基类中您有一个
@BeforeSuite
方法。
通过行为进行 TestNG,保证每个
@BeforeSuite
标记仅执行一次 <suite>
方法。
在您的情况下,它已经被
A
类调用,因此它将被 B
类跳过,这解释了 NullPointerException
。
要解决此问题,您需要将初始化移动到
@BeforeMethod
或 @BeforeClass
带注释的方法。
如果用例是在基类中的套件设置时设置一个变量,该变量应可用于所有子类,则可以在基类中将该变量设置为静态。