我正在考虑如何为基于 java 的存储库设计单元测试并遇到设计问题: 假设我有一个 Consumer 表,其中包含与我的消费者相关的数据: { 身份证件、姓名、电话 } 我的 ConsumerRepository 扩展了 BaseRepository,它扩展了 JPA 存储库并支持 findByPhone、findByName、findAll 查询和保存选项。
我正在使用 H2 in-memo DB 和 DBUnit 进行这些测试,所有这些都已配置并正在运行,并且正在考虑这一点:
将数据启动到内存数据库时,我是否应该使用 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/