Spring boot - h2 DB 测试多次执行脚本

Posted

技术标签:

【中文标题】Spring boot - h2 DB 测试多次执行脚本【英文标题】:Spring boot - h2 DB tests executing script more than once 【发布时间】:2018-09-03 06:22:47 【问题描述】:

我正在做一些 JUnit 测试,我只需要执行一次 SQL 脚本,但似乎每次测试都执行一次。

我正在使用下一个注释:

-主要:

@SpringBootApplication
@EnableTransactionManagement

-测试类:

@Sql( "classpath:insertMessage.sql" )
@Transactional
public class ServiceTest 

我错过了什么?

【问题讨论】:

所有测试都应该依赖于该脚本中的更改吗? 【参考方案1】:

如果您只想使用脚本影响单个测试,只需添加方法即可。

例如

@Sql( "classpath:insertMessage.sql" )
@Test
public void myExtremlyBadTestMethodNamingConventionTest() 

如果您希望在单个测试类的所有测试之前执行指定的测试。这就是棘手的地方-

首先您可能会考虑将@SQL 添加到@BeforeClass,但是 这是不可能的,因为 @SQL 不支持 @BeforeClass (或@Before)。

接下来,您可能会发现 @Commit 注释,这意味着您可以 提交使用测试所做的所有更改。 (@Transaction 的默认值 行为是在测试后回滚所有更改)现在,您可能 考虑一下,在所有你之前执行一个@Commit 单一的虚拟测试 其他测试?

NO请不要走这条路。

JUnit 不保证执行顺序 测试。 (这是设计使然)因为您的测试不应该依赖 其他测试的结果。

它们应该相互独立。为什么?一个优点是, 然后可以并行执行测试。而且,你永远不会 想要一个新的测试来打破令人兴奋的测试,它只是一个维护 等待发生的噩梦。 (#真实故事)


另外,如果您希望在所有测试之前执行指定的脚本,您可以将 import.sql 文件添加到您的测试资源中。 Spring Boot 将在您的测试之前自动检查它并为您执行它。换句话说,它将为您的所有测试将您的数据库设置为特定状态。

【讨论】:

我刚刚更改了它,它只在每个测试中执行,但是我遇到了数据库的主键问题,它在每个测试中都会自动递增。我怎样才能阻止这个?我希望它在每个测试中都是 1。这是 id 字段的注释:@Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "id", updatable = false, nullable = false) 你应该把它硬编码到测试中。前任。插入 test_table(id, text_value) 值 (1, 'test'); 谢谢,这解决了它,但我希望它是自动分配的。只是一个完整的回滚。这不可能吗? 将@Transaction 添加到您的测试应该会在测试完成后返回一个角色。 是的,它适用于寄存器,但 id 尚未增加。当一个测试使用我的insertMessage.sql时,数据库表总是会有一个寄存器,但问题是如果我不使用某个id,每次测试它都会增加一个。我希望 id 为 1 而不必设置它。谢谢大家的回答

以上是关于Spring boot - h2 DB 测试多次执行脚本的主要内容,如果未能解决你的问题,请参考以下文章

未加载 Spring Boot 测试 H2 sql 脚本

用 H2 测试 Spring Boot 数据库的正确方法是啥?

Spring boot、JPA、Hibernate 和 H2 DB 测试 - 序列不起作用 - 意外的代码路径”;SQL 语句:调用 seq_my_jobs [50000-193] 的下一个值

Spring Boot 从类路径加载 H2 db 文件

使用 Liquibase 为 Spring Boot 应用程序中的单元测试初始化​​内存 H2

如何将 ArrayList 发布到 Spring Boot H2 DB