gpt4 book ai didi

java - JUnit 4 测试套件问题

转载 作者:行者123 更新时间:2023-11-30 07:37:01 25 4
gpt4 key购买 nike

我在使用测试套件运行的一些 JUnit 4 测试时遇到问题。

如果我单独运行测试,它们可以正常工作,但在套件中运行时,90% 的测试方法都会因错误而失败。我注意到的是,第一个测试总是工作正常,但其余的都失败了。另一件事是一些测试方法没有按正确的顺序执行(反射没有按预期工作,或者它确实是因为方法的检索不一定按创建的顺序)。如果存在多个具有相同名称的方法的测试,通常会发生这种情况。我尝试调试一些测试,似乎从一行到下一行,某些属性的值变为 null

有谁知道问题出在哪里,或者行为是否“正常”?

提前致谢。

附言:好的,测试不相互依赖,它们都不依赖,它们都有 @BeforeClass@Before@After@AfterClass 所以在测试之间一切都被清除了。这些测试与数据库一起工作,但数据库在 @BeforeClass 中的每个测试之前被清除,所以这应该不是问题。

简单的例子:

测试套件:

import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
importy testclasses...;

@RunWith(Suite.class)
@Suite.SuiteClasses({ Test1.class, Test2.class })
public class TestSuiteX {
@BeforeClass
public static void setupSuite() { System.out.println("Tests started"); }
@AfterClass
public static void setupSuite() { System.out.println("Tests started"); }
}

测试:这些测试正在 Glassfish 上运行的服务器应用程序上测试功能。

现在,测试扩展了一个基类,该基类具有 @BeforeClass - 清除数据库和登录的方法以及仅进行注销的 @AfterClass。这不是问题的根源,因为在引入此类之前发生了同样的事情。

该类有一些在其他测试中未使用的公共(public)静态属性,并实现了 2 个控制方法。

其余的类,对于本​​示例,这两个类扩展了基类并且不重载继承的控制方法。

测试类示例:

    imports....

public class Test1 extends AbstractTestClass {
protected static Log log = LogFactory.getLog( Test1.class.getName() );

@Test
public void test1_A() throws CustomException1, CustomException2 {

System.out.println("text");

creates some entities with the server api.
deletes a couple of entities with the server api.

//tests if the extities exists in the database
Assert.assertNull( serverapi.isEntity(..) );

}

}

第二个:

public class Test1 extends AbstractTestClass {

protected static Log log = LogFactory.getLog( Test1.class.getName() );

private static String keyEntity;
private static EntityDO entity;

@Test
public void test1_B() throws CustomException1, CustomException2 {

System.out.println("text");

creates some entities with the server api, adds one entities key to the static attribute and one entity DO to the static attribute for the use in the next method.
deletes a couple of entities with the server api.

//tests if the extities exists in the database
Assert.assertNull( serverapi.isEntity(..) );

}

@Test
public void test2_B() throws CustomException1, CustomException2 {

System.out.println("text");

deletes the 2 entities, the one retrieved by the key and the one associated with the static DO attribute

//tests if the deelted entities exists in the database
Assert.assertNull( serverapi.isEntity(..) );

}

这是一个基本示例,实际测试更复杂,但我尝试了简化测试,但仍然无法正常工作。谢谢。

最佳答案

您描述的情况听起来像是一个副作用问题。您提到测试独立运行良好,但依赖于操作顺序:这通常是一个严重的症状。

设置一整套测试用例的部分挑战在于确保每个测试都从干净状态开始,执行测试,然后自行清理,将所有内容恢复到干净状态。

请记住,在某些情况下,标准清理例程(例如,@Before@After)是不够的。我前段时间遇到的一个问题是在一组数据库测试中:我将记录添加到数据库作为测试的一部分,需要专门删除我刚刚添加的记录。

因此,有时您需要添加特定的清理代码才能恢复到原始状态。

关于java - JUnit 4 测试套件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3022002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com