java - 使用 DBUnit/Junit 测试我的存储库层,我应该手动构建方案还是自动化它?有什么优点?

标签 java spring unit-testing junit dbunit

我正在考虑如何为基于 java 的存储库设计单元测试并遇到设计问题: 假设我有一个 Consumer 表,其中包含与我的消费者相关的数据: { 身份证件、姓名、电话 } 我的 ConsumerRepository 扩展了 BaseRepository,它扩展了 JPA 存储库并支持 findByPhone、findByName、findAll 查询和保存选项。

我正在使用 H2 in-memo DB 和 DBUnit 进行这些测试,所有这些都已配置并正在运行,并且正在考虑这一点:

  1. 将数据启动到内存数据库时,我是否应该使用 ConsumerTestData.xml (DBUnit) 配置数据并为每个测试手动添加消费者数据,例如:

    <dataset>
    <CONSUMER CONSUMER_ID="1" FIRST_NAME="Elvis" LAST_NAME="Presley" PHONE="+972123456789" EMAIL="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b9dcd5cfd0caf9d0cadcc997dad6d4" rel="noreferrer noopener nofollow">[email protected]</a>" CREATION_DATE="2017-08-29"/>
    <CONSUMER CONSUMER_ID="2" FIRST_NAME="Bob" LAST_NAME="Dylan" PHONE="+972123456780" EMAIL="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9bf9f4f9dbf2e8feebb5f8f4f6" rel="noreferrer noopener nofollow">[email protected]</a>" CREATION_DATE="2017-08-29"/>
    <CONSUMER CONSUMER_ID="3" FIRST_NAME="Lady" LAST_NAME="Gaga" PHONE="+972123456781" EMAIL="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ea8d8b8d8baa83998f9ac4898587" rel="noreferrer noopener nofollow">[email protected]</a>" CREATION_DATE="2017-08-29"/>
    </dataset>
    

或者我应该自动化它吗?例如:

@Test
public void findByPhone(){
    ConsumerEntity consumerEntity = ConsumerUtil.createRandomConsumer();
    ConsumerEntity savedConsumerEntity = consumerRepository.save(consumerEntity);
    assertThat(consumerRepository.findByPhone(savedConsumerEntity.getPhone()).isEqualTo(savedConsumerEntity.getPhone());
}

当我的 createRandomConsumer 生成随机数据时。

优点: 我认为自动化会更加通用和方便,就像 ConsumerEntity 可能会更改或接下来的任何代码更改一样 - 我不必更改我的 .xml 文件,而只需能够将内容添加到 TestEntity 函数中。 缺点: 如果数据库方案中包含任何约束,创建新对象并将其保存到备忘录中数据库可能会更加困难。

  • 我应该使用 DBUnit 吗?如果自动化 - 为什么我应该使用 DBUnit?使用 JUnit 是否更好(每次测试后回滚数据并自动添加测试所需的数据,如上面的示例所示?)

  • 如果选择使用 DBUnit 来实现此目的 - 并手动添加 - 这样的优点是什么?为什么它比使用简单的 JUnit 和 Spring 更好?

  • 谢谢!

    最佳答案

    您似乎在问两个问题:是否使用 DBUnit 以及是否使用随机化。

    对于DBUnit

    • 它增加了额外的步骤和额外的维护成本。如果您已经有保存实体的代码(通过 XxxRepository),那么就没有理由引入额外的工具。
    • 这不仅适用于 DBUnit,也适用于任何复制现有持久性逻辑的工具。
    • 相反,您可以只创建一个对象实例,填充所有字段并使用存储库保存。这使得重构变得更加容易。

    至于测试随机化

    • 我认为你的测试看起来非常好。通过随机化,您可以用更少的测试覆盖更多的案例,找到您自己无法想到的棘手案例,轻松隔离您的测试(例如,生成唯一的用户名,而不是在某处跟踪它们),等等。
    • 缺点:良好的随机化(以及一般的良好测试)需要良好的 OOP 掌握,因此当项目变大时,并不是每个人都能轻松使用它。此外,测试有时会失败,因为它们是匆忙编写的,并且没有考虑到所有可能性。要捕获此类情况,您应该在本地多次运行测试(有时人们会忘记)。好消息:IntelliJ 可以对 JUnit 重复测试 N 次(对于 TestNG 有一个注释)。

    一般来说,在编写随机测试时您应该多思考。但如果编写得当,它们可以提供更好的覆盖范围和更低的维护开销。如果您对不同的随机化技术感兴趣,check this out .

    关于java - 使用 DBUnit/Junit 测试我的存储库层,我应该手动构建方案还是自动化它?有什么优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267691/

    相关文章:

    java - 自定义操作栏停止我的应用程序

    java - Java中如何获取字符串中的字符?

    Spring集成http在获取请求中禁用多部分

    java - Spring MVC - 如何将商品添加到购物车?

    swift - 无法调用非函数类型的值,swift + cuckoo 模拟框架

    java - 如果找到字符,则忽略字符后的字符串

    java - 在 Java 应用程序中获取构建 ID

    java - 在 Spring Integration 中处理 http 响应

    unit-testing - Jasmine - 何时使用 toContain() 或 toMatch()?

    java - 使用 Mockito/PowerMockito 伪造方法参数