ลำดับที่ไม่ได้รีเซ็ตสำหรับการจำลอง HSQL db และทำให้เกิดการละเมิดข้อ จำกัด ระหว่างการทดสอบ JBehave

ฉันประสบปัญหาในการเรียงลำดับเมื่อเขียนการทดสอบ BDD ด้วย API ของเรา (Spring+Hibernate) เราใช้ JBehave เป็น BDD runner และ HSQL db

โดยพื้นฐานแล้ว ฉันได้สร้างกรณีต่อไปนี้เพื่ออธิบายปัญหาที่ฉันพบ

ฉันมีสองเรื่อง ทั้งสองเรื่องแทรกลงในตารางที่เรียกว่า DUMMYPRODUCT เราระบุว่าก่อนแต่ละสถานการณ์ เราจะล้างข้อมูลทั้งหมดและรีเซ็ตสคีมาโดยใช้สิ่งต่อไปนี้

"ตัดข้อมูลประจำตัวสาธารณะของ SCHEMA ให้สั้นลงและไม่ต้องตรวจสอบ"

จากนั้นเราจะเริ่มต้นข้อมูลตารางใหม่โดยใช้สคริปต์ sql ที่กำหนดไว้ล่วงหน้าซึ่งรวมถึงส่วนแทรก 2 รายการใน DUMMYPRODUCT

และรีเซ็ตลำดับ (สมมุติ) โดยใช้

วางลำดับ DUMMYPRODUCT_SEQ; สร้างลำดับ DUMMYPRODUCT_SEQ เริ่มต้นด้วย 3 เพิ่มขึ้น 10;

แต่ฉันกำลังเผชิญกับพฤติกรรมที่แปลกประหลาดอย่างยิ่ง เนื่องจากลำดับเหตุการณ์ไม่ได้ถูกรีเซ็ตระหว่างทั้งเรื่องราวและสถานการณ์ แต่ดูเหมือนว่าพวกเขาจะดำเนินต่อไปในเรื่องราว/สถานการณ์ถัดไป จากนั้นจึงรีเซ็ตภายใน กล่าวคือ ไม่เข้าไปในบล็อกลำดับถัดไป ทำให้เกิดการละเมิดข้อจำกัดเกิดขึ้น

ข้อยกเว้น=java.sql.SQLIntegrityConstraintViolationException: การละเมิดข้อจำกัดด้านความสมบูรณ์: ข้อจำกัดเฉพาะหรือการละเมิดดัชนี; SYS_PK_10216 ตาราง: DUMMYPRODUCT

การแทรกพฤติกรรมที่มีประสบการณ์ใน DUMMYPRODUCT สำหรับ DUMMYPRODUCTID

(DUMMYPRODUCTID)
เรื่องแรก
สถานการณ์
3
4

เรื่องถัดไป
สถานการณ์
5
6< br/> 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 ข้อยกเว้น< br/> 29 ข้อยกเว้น

คุณเคยประสบปัญหาดังกล่าวกับการใช้งาน HSQL ของคุณในอดีตหรือไม่


person TheMayne    schedule 17.02.2014    source แหล่งที่มา
comment
ฉันพบลิงก์นี้ซึ่งเป็นปัญหาก่อนหน้าและได้รับการแก้ไขแล้ว แต่ดูเหมือนว่าจะเป็นสิ่งที่ฉันกำลังเผชิญอยู่ marc.info/?l=hsqldb-user&m=130856349508646   -  person TheMayne    schedule 17.02.2014
comment
groups.google.com/forum/#!topic/h2-database/ z7HmvPmvjV8 การตัดทอนไม่ได้รีเซ็ตลำดับ   -  person TheMayne    schedule 17.02.2014


คำตอบ (2)


คำสั่งรีสตาร์ทลำดับ IDENTITY ที่ประกาศภายในตาราง:

TRUNCATE TABLE T RESTART IDENTITY AND COMMIT NO CHECK

คำสั่งนี้ดำเนินการข้างต้นกับตารางทั้งหมดในสคีมา รวมถึงการรีเซ็ตลำดับที่อยู่นอกตาราง:

TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK

คำสั่งที่จะทิ้งลำดับจะดรอปอย่างถาวร ไม่มีร่องรอยเหลืออยู่เมื่อคุณสร้างมันขึ้นมาอีกครั้ง

ทั้งหมดข้างต้นสามารถทดสอบได้ด้วย HSQLDB 2.3.X ล่าสุด อาจเป็นไปได้ว่าคุณใช้เวอร์ชันเก่ากว่า หรือบางทีคำสั่งใดคำสั่งหนึ่งของคุณไม่ได้ถูกดำเนินการจริง โปรดทราบว่าคุณควรละทิ้งลำดับด้วยคำสั่งเดียว และสร้างใหม่อีกครั้งด้วยคำสั่งอื่น

person fredt    schedule 17.02.2014
comment
เพื่อยืนยันว่าฉันใช้ 2.3.2 - person TheMayne; 17.02.2014
comment
หากฉันทิ้งสคีมา ให้เริ่มต้นบริบทสปริงอีกครั้ง (ซึ่งโหลดเอนทิตีไฮเบอร์เนตทั้งหมดและตั้งค่า hsqldb) ลำดับจะรีเซ็ต แต่นี่ไม่ใช่วิธีแก้ปัญหาที่ดี - person TheMayne; 17.02.2014
comment
ฉันทดสอบข้างต้นด้วยลำดับของคุณในตัวจัดการฐานข้อมูลก่อนที่จะตอบกลับ ดูเหมือนว่าคุณกำลังใช้ฐานข้อมูลที่แตกต่างกัน 2 ฐานข้อมูล หรือคำสั่งดังกล่าวไม่ได้ถูกดำเนินการ - person fredt; 17.02.2014
comment
ปัญหาอยู่ที่การเธรดและการรื้อถอนด้วยการตั้งค่า JBehave ของเราเท่าที่ฉันเห็น ลำดับไม่หลุดและสร้างขึ้นใหม่เมื่อเธรดถัดไปเริ่มดำเนินการ - person TheMayne; 17.02.2014
comment
mail-archive.com/[email protected]/ msg00837.html นี่ใกล้เคียงกับความต้องการของฉันมากขึ้น - person TheMayne; 18.02.2014

หลังจากเรียกใช้ db เป็นอินสแตนซ์แยกต่างหากและเปลี่ยนเป็น H2db เราพบสาเหตุของปัญหาของเรา db ไม่ชอบลำดับที่ถูกตัดทิ้งและสร้างขึ้นใหม่ หรือแม้แต่การเปลี่ยนแปลงในการรันแต่ละสถานการณ์ เราแยกสคริปต์ของเราออกเป็นสคริปต์แทรกข้อมูลและสคริปต์แก้ไขลำดับ ข้อมูลถูกล้างโดยใช้ dbunit และตามด้วยสคริปต์แทรกในการรันแต่ละครั้ง ลำดับจะมีการเปลี่ยนแปลงเมื่อเริ่มต้นเท่านั้น และเรื่องราว bdd จะเพิ่มขึ้นตามลำดับตามที่คาดไว้

person TheMayne    schedule 01.03.2014