序列没有为mock HSQL数据库重置,并导致JBehave测试之间的约束冲突



我在用API(Spring+Hibernate)编写BDD测试时遇到了排序问题。我们使用JBehave作为BDD运行程序和HSQLdb。

基本上,我创建了以下案例来解释我遇到的问题。

我有两个故事。这两个故事都插入到一个名为DUMMYPRODUCT的表中。我们指定,在每个场景之前,我们使用以下清除所有数据并重置模式

"截断架构公共重新启动标识并提交无检查">

然后,我们使用预定义的sql脚本重新初始化表数据,该脚本包括对DUMMYPRODUCT、的2个插入

并使用重置序列(假定)

丢弃序列DUMMYPRODUCT_SEQ;创建序列DUMMYPRODUCT_SEQ,从3开始,增量为10;

但我遇到了极其奇怪的行为,因为故事和场景之间的顺序都没有重置。相反,它们似乎继续到下一个故事/场景,然后在其中重置,即不进入下一个序列块,从而导致违反约束。

exception=java.sql.SQLIntegrityConstraintViolationException:完整性约束冲突:唯一约束或索引冲突;SYS_PK_10216表:DUMMYPRODUCT

经历的行为插入到用于DUMMYPRODUCTID 的DUMMYPRODUCT中

(DUMMYPRODUCTID)
第一个故事
场景
3
4

下一个故事
场景
5
6
7
8
9
10
11
12
3
4
5异常
7异常
9异常
11
12
3
4
5
6
7
8
9
10
11例外
13
14
15
16
17
18
19
20
21
22
23
24
25
26
场景
27
28
29
30
31
32
3
4
5
6
7
8
9
10
>11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27异常
29异常

您在过去的HSQL实现中遇到过这样的问题吗?

语句重新启动表中声明的IDENTITY序列:

TRUNCATE TABLE T RESTART IDENTITY AND COMMIT NO CHECK

该语句对模式中的所有表执行上述操作,并重置表外的序列:

TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK

删除序列的语句会永久删除它。当你再次创建它时,它已经没有任何痕迹了。

以上所有内容都可以用最新的HSQLDB 2.3.X进行测试。可能是您使用的是旧版本,也可能是您的某个语句没有实际执行。请注意,您应该用一条语句删除序列,然后用另一条语句重新创建它。

在将数据库作为一个单独的实例运行并更改为H2db后,我们发现了问题的根源。数据库不喜欢在每个场景运行时删除、重新创建甚至更改序列。我们将脚本分为数据插入脚本和序列更改脚本。使用dbunit清除数据,然后在每次运行时执行插入脚本。序列仅在启动时更改,bdd故事按预期顺序递增。

最新更新