Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 为什么测试一个单独的junit测试是有效的,而将它们一起测试是无效的';T_Unit Testing_Maven 2_Netbeans_Junit_Eclipselink - Fatal编程技术网

Unit testing 为什么测试一个单独的junit测试是有效的,而将它们一起测试是无效的';T

Unit testing 为什么测试一个单独的junit测试是有效的,而将它们一起测试是无效的';T,unit-testing,maven-2,netbeans,junit,eclipselink,Unit Testing,Maven 2,Netbeans,Junit,Eclipselink,当与mvn测试(或通过ide)一起测试时失败的测试称为EmpiricalTest 如果我单独测试该文件,它会通过,但不会通过其他测试。为什么会这样 您可以从中签出Maven源代码(要测试) 这就是我在每次测试前确保数据库为“空白”的方法: abstract public class PersistenceTest { @Before public void setUp() { db.destroy(); assertIsEmpty(MUser.class); asser

当与mvn测试(或通过ide)一起测试时失败的测试称为EmpiricalTest

如果我单独测试该文件,它会通过,但不会通过其他测试。为什么会这样

您可以从中签出Maven源代码(要测试)

这就是我在每次测试前确保数据库为“空白”的方法:

abstract public class PersistenceTest {

@Before
public void setUp() {
    db.destroy();
    assertIsEmpty(MUser.class);
    assertIsEmpty(Meaning.class);
    assertIsEmpty(Expression.class);
}

private <Entity> void assertIsEmpty(final Class<Entity> entityClass){
    final List<Entity> all = db.getAll(entityClass);
    Assert.assertTrue(all.isEmpty());
}

这听起来好像测试之间存在依赖关系。据我从您的测试中了解,您正在访问测试中的数据存储。是否有可能其中一个测试没有正确清理他的痕迹,从而导致其他测试失败


针对DB的测试通常不被视为单元测试,尽管它非常有用。然而,这些类型的测试(您可以称之为集成测试)编码起来更加困难和耗时,因为您必须注意,您的测试会使环境保持它以前发现的状态。

这与自动分配的id有关。PU创建了一个序列表,尽管我从实体中清空了数据库,但实际上并没有删除该表。因此,当我单独测试ExperiicalTest时,序列按预期从1开始,而当一起测试时,测试将在稍后执行,并以一个更高、意外的数字开始


这就引出了一个问题。

你的问题很常见。在理想的TDD环境中,每个测试都应该在与其他测试完全隔离的情况下执行。你违反了隔离,这就是问题所在

然而,对于测试隔离问题没有简单的解决方案。主要原因是SQL DLL不支持创建/删除数据库,而自动删除表由于可能存在复杂的外键约束而变得复杂

根据我的经验,最好的办法是在事务中执行测试,并在测试结束时回滚数据(就像Pascal建议的那样)。为这一点提供了巨大的支持

如果您不能在事务边界内执行测试(如您的),您必须确保您的每个测试都没有在数据库中留下任何内容(包括外键、约束、序列等),并且测试设计为相互独立(例如,不要依赖于自动生成的id值,因为序列生成可以在以前的测试中执行)


您必须通过会话顺序检查断言的错误(我猜您无法从Surefire日志中分辨出来)。然后修复测试(失败的测试和在DB中留下垃圾的测试)相互隔离。

为什么不在事务内部运行测试,并在每次测试后回滚tx?因为,正如我们在另一个问题中所讨论的,我从“外部”进行测试。也就是说,事务是从数据库代码内部提交的,我作为客户机进行测试。我插入数据(这里是db代码提交)然后检查我检索到的关于持久化内容的数据是否符合预期。
public class EmpiricalTest extends PersistenceTest {