如何在 TestNG 单元测试类中分配类级别数据
Posted
技术标签:
【中文标题】如何在 TestNG 单元测试类中分配类级别数据【英文标题】:How to assign class level data in a TestNG unit test class 【发布时间】:2017-11-17 19:01:05 【问题描述】:我使用 TestNG 作为我的 Java 测试框架,我需要一个给定的测试类来维护一些状态,这些状态将被几种测试方法使用。具体来说,我希望在运行任何测试之前将这个状态初始化一次,然后让它可用于类中的任何后续测试。
根据我的阅读,@BeforeClass
注释可以添加到方法中,该方法将在运行任何测试之前运行。但是,我一直注意到非常奇怪的行为。考虑以下示例代码,它是我实际设置的精炼版本:
public class MyTestClass
private static String[][] array;
@BeforeClass
public void setup()
array = new String[][] "A", "B", "C","D", "E", "F","G", "H", "I";
@Test
public void someTest()
// use 'array'
// but the data might be corrupted
以上是一个简化,但我注意到我在@BeforeClass
方法中初始化的static
变量似乎稍后会更改它们的值。
为 TestNG 单元测试设置一些共享/静态状态的正确方法是什么?
【问题讨论】:
您的设置看起来不错 - 您能否提供一个重现错误结果的示例? (您不会在测试中修改数组,对吧?) @assylias 我没有发布完整的代码,因为它太长了。我要告诉你的是,以前我有 getter 辅助方法,每个方法都返回一个二维数组,这些数组通常被多个测试使用。我认为重用东西是个好主意,因此我尝试使用@BeforeTest
方法。
我观察到的是数组的值似乎只是变成了随机值。这当然会导致测试中断。现在,我正在恢复使用更安全的代码。
单元测试方法不应以任何方式相互依赖,因此不应共享任何状态!
@TimothyTruckle 这听起来像是对我的回答。
【参考方案1】:
单元测试方法不应以任何方式相互依赖,因此不应共享任何状态!
【讨论】:
我将其标记为暂定正确答案,因为理想情况下单元测试应该是无状态且独立的。【参考方案2】:根据您的设置,静态变量可能会被初始化多次。您可以改用静态初始化器进行初始化,或者删除 static 关键字并使用现有配置将其用作类的实例变量:
例子:
public class MyTestClass
private static String[][] array;
static
array = new String[][] "A", "B", "C","D", "E", "F","G", "H", "I";
@Test
public void someTest()
// use 'array'
// but the data might be corrupted
或者,
public class MyTestClass
private String[][] array;
@BeforeClass
public void setup()
array = new String[][] "A", "B", "C","D", "E", "F","G", "H", "I";
@Test
public void someTest()
// use 'array'
// but the data might be corrupted
【讨论】:
谢谢,但很遗憾我不能使用静态块,因为代码在 try 块中。【参考方案3】:您可以在声明中使用 final 关键字。
你也可以使用 ITestContext 这是一个例子http://www.ontestautomation.com/using-the-testng-itestcontext-to-create-smarter-rest-assured-tests/
public class MyTestClass
private static final String[][] array;
@BeforeClass
public void setup()
array = new String[][] "A", "B", "C","D", "E", "F","G", "H", "I";
@Test
public void someTest()
// use 'array'
// but the data might be corrupted
【讨论】:
你会得到一个编译错误,使这个变量最终。以上是关于如何在 TestNG 单元测试类中分配类级别数据的主要内容,如果未能解决你的问题,请参考以下文章