如何在 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 单元测试类中分配类级别数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用注释在 testng + maven 中分离单元测试和集成测试?

防止在 iOS 中分配类

如何在 C++ 中分配类内数组的可修改大小

在 Python 中分配类布尔值

C ++从不同的函数中分配类成员的值

如何在 Eclipse 上运行 Maven 单元测试(testng)?