我已经和JUnit合作了好几年了,我找到了很多例子,其中测试中的隔离并不是完整的。
我开发的大多数测试遵循相同的结构
class ClassToTestTest {
// Attributes
private ClassToTest objectToTest;
// Methods
@Before
public void setup() {
objectToTest = new ClassToTest();
}
@Test
public void test1() {
//do something
Assert...
}
@Test
public void test2() {
//do something
Assert...
}
}
测试对象的内部状态(不是ClassToTest对象,而是执行测试的对象)属于其属性。如果setup()或teardown()方法存在任何缺陷,objectToTest的某些内部状态可能会潜入其他测试。
只是想知道,没有共享状态会更好吗?你没有属性
class ClassToTestTest {
// Attributes
// No attributes, no internal state
// Methods
@Before
public void setup() {
objectToTest = new ClassToTest();
}
@Test
public void test1() {
localObjectToTest = createObjectToTest();
//do something
Assert...
}
@Test
public void test2() {
localObjectToTest = createObjectToTest();
//do something
Assert...
}
}
我知道第一个代码与第二个代码完全相同,但在第一个代码中,你很想做类似的事情
// Methods
@Before
public void setup() {
objectToTest = objectToTest.reset();
}
或更糟糕的是,依赖于之前的测试,以便在之前的测试中使用objectToTest的状态来“节省”时间,最后得到一个空的setup()方法
在第二个代码之后很难达到这一点,因为没有共享状态,每个对象都是本地的。
你有什么想法?合理?值得吗?
答案 0 :(得分:3)
JUnit为每个测试方法创建一个新的ClassToTestTest
对象。因此没有字段可以潜入另一个测试。有关详细信息:http://martinfowler.com/bliki/JunitNewInstance.html
答案 1 :(得分:-1)
在我看来,我认为在每个测试中创建一个ClassToTestTest
对象是值得的,因为可以修改内部状态,每个测试应独立于其他的。
一个比较繁琐的开发人员可以告诉你你还在每个测试中测试对象的构造函数。然后,您还可以在方法中使用@Before和@After注释来创建和销毁ClassToTestTest
对象。
但无论如何,我宁愿去每个测试中创建对象。
编辑:添加粗体字以使文本更具可读性