【问题标题】:How to write junit tests against JPA which can be run in parallel?如何针对可以并行运行的 JPA 编写 junit 测试?
【发布时间】:2011-08-09 18:05:38
【问题描述】:

编写所有访问数据库(通过 JPA+Hibernate)以便它们可以并行运行的单元测试我需要知道什么?我们开始使用 maven 的并行单元测试功能,并体验了在单线程中运行时不会发生的测试失败。

我将给出一个简短的示例,我们现在是如何编写测试的。我们在@Before 中设置EntityManager 和其他类,开始事务,最后插入我们在类中的所有测试需要的测试数据(测试特定数据在测试中创建)。 @After 测试运行,我们通过调用 Transaction.rollback();null 所有成员变量来回滚所有内容。 我们针对内存中的 hsqldb 运行所有单元测试。

public class TestLogEntryDAO {
    private EntityManager em;
    private LogEntryDAO dao;

    @Before
    public void before() {
        em = Persistence.createEntityManagerFactory("junit")
            .createEntityManager();
        dao = new DAOFactory<LogEntryDAO>(LogEntryDAO.class).newInstance(em,
            Mockito.mock(ILogger.class));

        em.getTransaction().begin();

        RecordDAO recordDAO = new DAOFactory<RecordDAO>(RecordDAO.class)
            .newInstance(em, Mockito.mock(ILogger.class));
        recordDAO.setLogEntryDAO(dao);
        createTestData(); // Is this ok?
    }

    @After
    public void after() {
        em.getTransaction().rollback();
        em = null;
        dao = null;
    }

    @Test
    public void testSomething() {
        // ...
    }
}

提前致谢!

【问题讨论】:

  • 尝试将每个 EntityManager 存储在 ThreadLocal 中,这样您就可以确保在不希望它们被覆盖时不会覆盖实体管理器实例。

标签: java jpa junit jpa-2.0 parallel-processing


【解决方案1】:

警告:我没有尝试过。这是我在当前测试套件中未实现的增强功能之一。


如果以下一项或多项为真,则涉及 JPA 的并行测试必然会失败:

  • 并行运行的测试使用相同的数据集。
  • 读取数据的测试可以与创建、更新或删除数据的测试同时运行。

如果您需要运行并行测试,您可以将所有读取数据的测试分组到一个单独的套件中,但这仍然需要对改变数据库状态的测试进行序列化。如果您的测试允许,您可以为每个并行运行的测试使用单独的数据集;请注意,并非所有应用程序和所有测试都如此。

测试特定的数据集可以从文件集(例如,使用 DbUnit)或内存中的数据集(使用自定义测试值工厂准备)加载,每个并行测试依赖于不同的项目集。很明显,任何公共数据不得在测试中发生变异,否则您最终会导致事务被回滚(如果有乐观锁定),或者您的测试将失败。

此外,可以跨测试变异​​的数据不得在测试之间共享。如果您将不同的值固定到每个测试中,这很容易实现。您需要确保您的测试将为这些值或特定于测试的等效不变属性断言。可以使用线程 ID 执行数据固定。

为了提供上述示例,如果您正在运行将实体 A(具有属性 A1 和 A2)保存在数据库中的测试,则测试 T1 必须保存具有值 A1=x1 和 A2=y1 的 A 实例,并且并行测试 T2 必须保持 A 的另一个实体,其值为 A1=x2 和 A2=y2。这假设并行运行的其他测试将改变 A1 和 A2 的值。如果您的测试具有不改变 A1 的特性,那么 A1 的所有此类值都可以在测试中保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 2015-06-10
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多