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 测试多次执行脚本的主要内容,如果未能解决你的问题,请参考以下文章
用 H2 测试 Spring Boot 数据库的正确方法是啥?
Spring boot、JPA、Hibernate 和 H2 DB 测试 - 序列不起作用 - 意外的代码路径”;SQL 语句:调用 seq_my_jobs [50000-193] 的下一个值