Unit testing 为什么测试一个单独的junit测试是有效的,而将它们一起测试是无效的';T
当与mvn测试(或通过ide)一起测试时失败的测试称为EmpiricalTest 如果我单独测试该文件,它会通过,但不会通过其他测试。为什么会这样 您可以从中签出Maven源代码(要测试) 这就是我在每次测试前确保数据库为“空白”的方法: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
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 {