在单元测试中共享成员变量是一种好习惯

时间:2018-02-09 12:36:35

标签: java unit-testing

我有一个单元测试类,如下所示,

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class MyTest {

    private static final int MY_CONSTANT = 7;
    private String expectedValue = "expected value";

    @Test
    public void test1() {
        int value = 50; // get by processing
        int ans = value / MY_CONSTANT ; 
        String actual = "actual string"; // get by processing
        Assert.assertEquals(expectedValue, actual);
    }

    @Test
    public void test2() {
        int value = 40; // get by processing
        int ans = value / MY_CONSTANT ; 
        String actual = "actual string 2"; // get by processing
        Assert.assertEquals(expectedValue, actual);
    }

}

有人会像下面那样写,

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class MyTest { 

    @Test
    public void test1() {
        int value = 50; // get by processing
        int ans = value / 7 ; 
        String actual = "actual string"; // get by processing
        Assert.assertEquals("expected value", actual);
    }

    @Test
    public void test2() {
        int value = 40; // get by processing
        int ans = value / 7 ; 
        String actual = "actual string 2"; // get by processing
        Assert.assertEquals("expected value", actual);
    }

}

两者都可以正常工作,但是在这样的单元测试方法中共享成员变量是一个好习惯吗?

从上述两个方面做到这一点的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

当然,如果共享值是不可变的。无论语言/测试框架如何,在测试之间共享可变值通常不是一个好主意。这可能会限制您按特定顺序运行测试,或者要求您在运行相关测试之前运行某些修改该值的测试。

另一个考虑因素是,在测试之间共享常量值可能会使代码更改时更脆弱或更难维护。它介绍了测试之间可能不必要的耦合。

要问自己一个好问题是我正在做什么权衡?如果它只是为断言定义一个常量,那么我可能不会这样做,除非这个值很麻烦在每个测试中定义。