ฐานข้อมูลและการทดสอบหน่วย / บูรณาการ


25

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

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

ดูเหมือนว่าวิธีที่ดีที่สุดในการทดสอบการทำงานของฐานข้อมูลจะมีการตั้งค่าต่อไปนี้:

  1. ในขั้นตอน "การตั้งค่า" ก่อนที่การทดสอบจะทำงานจริงคุณจะตัดทอนตารางทั้งหมดในฐานข้อมูลก่อน
  2. จากนั้นคุณแทรกข้อมูลทั้งหมดที่จำเป็นสำหรับกรณีทดสอบที่คุณกำลังจะเรียกใช้
  3. จากนั้นคุณเรียกใช้และตรวจสอบกรณีทดสอบ
  4. จากนั้นในช่วง "teardown" คุณจะตัดทอนตารางทั้งหมดในฐานข้อมูลอีกครั้ง

ฉันไม่เห็นวิธีที่ดีกว่าอื่น ๆ ในการตรวจสอบให้แน่ใจว่าข้อมูลที่คุณกำลังทดสอบมีการทดสอบที่ดี

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


คำตอบ:


21

สำหรับฉันการทดสอบหน่วยไม่ควรจัดการกับฐานข้อมูลการทดสอบการรวมเข้ากับฐานข้อมูล

การทดสอบการรวมที่จัดการกับฐานข้อมูลควรในทางปฏิบัติควรมีฐานข้อมูลว่างเปล่าที่มีวิธีการฉีกขาดและฉีกขาดการใช้วิธีการทำธุรกรรมตามวิธีค่อนข้างเป็นวิธีที่ดีไป (เช่นสร้างการทำธุรกรรมในการติดตั้งและย้อนกลับ

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

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


ฉันเพิ่งทราบว่าความแตกต่างระหว่างการทดสอบหน่วยและการทดสอบการรวมนอกจากนี้ฉันได้ยินหน่วยควรใช้ข้อมูลที่เย้ยหยันและการรวมควรใช้ฐานข้อมูล (เริ่มหัวข้อเธรดโปรแกรมเมอร์คนอื่น. ) นอกจากนั้นทุกสิ่งที่คุณพูดดูเหมือนจะสอดคล้องกับสิ่งที่ฉันคิด
ryanzec

ไม่มีปัญหาผมได้เพิ่มข้อมูลเพิ่มเติมเพื่อคำตอบอื่น ๆ ของคุณ
นิโคลัสเมย์นี

1
ทำไมคุณไม่ทดสอบหน่วย DB หากคุณใส่ SQL ของคุณลงในโพรซีเดอร์ที่เก็บไว้คุณสามารถทดสอบหน่วยเหล่านั้นด้วยข้อมูลที่กำหนดโดยการทดสอบและทันใดนั้นทุกอย่างก็ง่าย นี่เป็นวิธีปฏิบัติที่ดีที่สุดที่ผู้คนควรทำตามดูว่าMS พูดอย่างไร
gbjbaanb

1
integration tests- คุณหมายถึงอะไร ดังที่ฉันกล่าวถึงโมดูลที่ใช้ฐานข้อมูลสามารถและควรทดสอบด้วยการทดสอบหน่วย ฐานข้อมูลฉันสามารถล้อเลียนด้วยตนเองหรือแทนที่ด้วยการใช้งานในหน่วยความจำ
hellboy

6

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

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

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


2

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

คุณมีสิทธิ์ในการเขียนแบบทดสอบยกเว้นว่าฉันจะไม่ตัดทอนสิ่งใด:

  • ขั้นตอนการตั้งค่า: รับการเชื่อมต่อกับฐานข้อมูลและแทรกข้อมูล
  • วิ่งเฟส
  • ขั้นตอนการฉีกขาด: ลบข้อมูลที่แทรก (ตัดปลาย)

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


ฉันจะไม่สร้างส่วนต่าง ๆ ของฐานข้อมูลที่จำเป็นสำหรับแต่ละการทดสอบมากกว่าที่จะมีใครบางคนแก้ไขข้อมูลโดยบังเอิญในลักษณะที่ทำให้เกิดความล้มเหลวหรือไม่? ต้องทำให้แน่ใจว่าข้อมูลนั้นถูกต้องเมื่อการทดสอบล้มเหลวดูเหมือนว่าเป็นสิ่งที่สามารถป้องกันได้
ryanzec

1
ขั้นตอนการตั้งค่าขนาดใหญ่ที่แทรกข้อมูลที่เป็นประโยชน์ต่อกรณีทดสอบที่แตกต่างกันอาจมีประโยชน์สำหรับการทดสอบการรวมที่คุณต้องตรวจสอบส่วนต่าง ๆ ของแอปพลิเคชันที่ทำงานร่วมกัน มันอาจจะคุ้มค่าที่จะมี "ส่วนแทรก" ชุดใหญ่นี้เนื่องจากคุณจะต้องใช้ชุดทดสอบเหล่านี้สำหรับการทดสอบบูรณาการอื่น ๆ มิฉะนั้นถ้าเรากำลังพูดถึงการทดสอบหน่วยที่บริสุทธิ์ฉันก็มีข้อมูลหนึ่งชุดที่จะแทรกสำหรับการทดสอบแต่ละกรณี
Jalayn

1

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

ตัวอย่าง: การตรวจสอบตารางธุรกรรมทางบัญชี

  1. คุณไม่ต้องการทดสอบการดูตารางนี้สำหรับผู้ใช้ / บัญชีที่ไม่มีธุรกรรมหรือไม่?
  2. ทดสอบการเพิ่มระเบียนแรกและดูว่าคุณสามารถสร้างยอดเงินได้หรือไม่
  3. สร้างเรคคอร์ดเมื่อมีเรคคอร์ดที่มีอยู่แล้วและตรวจสอบยอดคงเหลือในการดำเนินงานและกฎเกณฑ์ทางธุรกิจอื่น ๆ
  4. ดูตารางที่มีระเบียนที่มีอยู่และ CRUD อื่น ๆ ทั้งหมด

ไม่ว่าคุณจะทำสิ่งนี้ได้ด้วยการทำตามขั้นตอนที่ 1 & 2 หรือเริ่มจากฐานข้อมูลที่มีอยู่แล้วในสถานะนี้ (กู้คืนข้อมูลสำรองหรือไม่) ฉันไม่แน่ใจว่ามันสำคัญ ความคิดของคุณเกี่ยวกับการเขียนสคริปต์ให้ฉันทำให้ง่ายต่อการจัดการการเปลี่ยนแปลงใด ๆ ที่คุณต้องการ (เช่นถ้าคุณลืมที่จะสร้างบัญชีผู้ดูแลระบบและต้องการมันสำหรับผู้ใช้ใหม่) ไฟล์สคริปต์ง่ายต่อการใส่ลงในการควบคุมซอร์สกว่าไฟล์สำรองบางไฟล์ สิ่งนี้จะได้รับผลกระทบไม่ว่าคุณจะเผยแพร่แอพนี้หรือไม่ก็ตาม


0

หากต้องการวาดแง่มุมของคำตอบสองสามข้อด้วยกันและเพิ่ม 2p ของฉัน ...

หมายเหตุ: ความคิดเห็นของฉันเกี่ยวข้องกับการทดสอบฐานข้อมูลโดยเฉพาะและไม่ใช่การทดสอบ UI (แม้ว่าจะคล้ายกันอย่างชัดเจน)

ฐานข้อมูลต้องการการทดสอบมากพอ ๆ กับแอพพลิเคชั่นส่วนหน้า แต่มีแนวโน้มที่จะทำการทดสอบบนพื้นฐานของ หรือ 'รายงานสร้างผลลัพธ์ที่ถูกต้องหรือไม่' ซึ่งในความเห็นของฉันคือการทดสอบช้าในกระบวนการพัฒนาฐานข้อมูลและไม่แข็งแกร่งมาก

เรามีลูกค้าจำนวนหนึ่งที่ใช้การทดสอบหน่วย / การรวม / ระบบสำหรับฐานข้อมูลคลังข้อมูลของพวกเขานอกเหนือจาก UAT / performance / et al ตามปกติ การทดสอบ พวกเขาพบว่าด้วยการบูรณาการอย่างต่อเนื่องและการทดสอบอัตโนมัติพวกเขาพบปัญหามากมายก่อนที่จะเข้าสู่ UAT แบบดั้งเดิมซึ่งช่วยประหยัดเวลาใน UAT และเพิ่มโอกาสในการประสบความสำเร็จของ UAT

ฉันแน่ใจว่าส่วนใหญ่จะยอมรับว่าควรใช้ความแม่นยำที่คล้ายกันกับการทดสอบฐานข้อมูลเพื่อการทดสอบส่วนหน้าหรือการรายงาน

สิ่งสำคัญในการทดสอบคือการทดสอบเอนทิตีแบบง่าย ๆ เพื่อให้แน่ใจว่าถูกต้องก่อนที่จะดำเนินการต่อไปในการรวมกันของเอนทิตีที่ซับซ้อน

ดังนั้นให้บริบทกับคำตอบของฉัน ...

การทดสอบหน่วย

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

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

  • ตรวจสอบสคีมาบางคนอาจเรียกสิ่งนี้ว่าการทดสอบ 'สัญญาข้อมูล'
  • ค่าคอลัมน์ผ่าน
  • การออกกำลังกายของเส้นทางตรรกะที่มีค่าข้อมูลที่แตกต่างกันสำหรับฟังก์ชั่นขั้นตอนการดูคอลัมน์จากการคำนวณ
  • การทดสอบเคสขอบ - ค่า NULL, ข้อมูลไม่ดี, จำนวนลบ, ค่าที่มากเกินไป

(หน่วย) การทดสอบบูรณาการ

ฉันพบว่าบทความ SE นี้มีประโยชน์ในการพูดคุยเกี่ยวกับการทดสอบประเภทต่างๆ

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

ในการย้ายจากการทดสอบหน่วยไปยังการทดสอบการรวมเหล่านี้มักจะมีข้อมูลเพิ่มเติมเล็กน้อยเพื่อทดสอบกรณีทดสอบที่หลากหลาย เห็นได้ชัดว่าการทดสอบเหล่านี้ไม่สามารถทำงานบนฐานข้อมูลการผลิตได้

นี้จากนั้นจะดำเนินการเข้าสู่ระบบการทดสอบ , บูรณาการการทดสอบระบบ (aka การทดสอบแบบ end-2-End) โดยมีการเพิ่มปริมาณข้อมูลและเพิ่มขอบเขต การทดสอบทั้งหมดเหล่านี้ควรเป็นส่วนหนึ่งของกรอบการทดสอบการถดถอย การทดสอบเหล่านี้บางอย่างอาจถูกเลือกโดยผู้ใช้เพื่อดำเนินการเป็นส่วนหนึ่งของ UAT แต่ UAT คือการทดสอบที่กำหนดโดยผู้ใช้ไม่ใช่ตามที่ IT กำหนด - เป็นปัญหาทั่วไป!

ดังนั้นตอนนี้ที่ฉันได้ให้บริบทเพื่อตอบคำถามจริงของคุณ

  • การเตรียมข้อมูลล่วงหน้าสำหรับการทดสอบหน่วยและการรวมเข้าด้วยกันอาจทำให้เกิดข้อผิดพลาดในการทดสอบปลอมและควรหลีกเลี่ยง
  • วิธีเดียวที่จะตรวจสอบให้แน่ใจว่ามีการทดสอบที่สอดคล้องกันคือไม่มีข้อสมมติฐานเกี่ยวกับข้อมูลต้นฉบับและควบคุมอย่างเข้มงวด
  • บริบทการดำเนินการทดสอบแยกต่างหากเป็นสิ่งสำคัญเพื่อให้แน่ใจว่าผู้ทดสอบรายหนึ่งไม่ขัดแย้งกับผู้ทดสอบรายอื่นที่ทำการทดสอบเดียวกันในรหัสฐานข้อมูลที่ควบคุมโดยสาขาอื่น

-3

ตรงไปตรงมาฉันคิดว่าถ้าคุณทำการทดสอบหน่วยโดยไม่มีฐานข้อมูลขนาดใกล้เคียงกับฐานข้อมูลการผลิตที่มีอยู่คุณจะมีหลายสิ่งที่ผ่านการทดสอบและล้มเหลวในการผลิตเพื่อประสิทธิภาพ แน่นอนว่าฉันต่อต้านคนที่พัฒนาฐานข้อมูลท้องถิ่นเล็ก ๆ ด้วยเหตุผลนี้เช่นกัน

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


ฉันไม่แนะนำให้ทำงานกับฐานข้อมูลเปล่าหากคุณเห็นขั้นตอนที่ 2 ฉันมี "จากนั้นคุณแทรกข้อมูลทั้งหมดที่จำเป็นสำหรับกรณีทดสอบที่คุณกำลังจะใช้งาน" เกี่ยวกับปัญหาด้านประสิทธิภาพฉันไม่คิดว่าเป็นสิ่งที่ใช้ทดสอบหน่วยนั่นคือการทดสอบโหลดเพิ่มเติม หน่วยการทดสอบให้ฉันมันเพื่อทดสอบเพื่อให้แน่ใจว่าตรรกะในรหัสของคุณทำงาน หากการทำงานแบบลอจิคัลมันจะทำงานสำหรับ 1 ระเบียนหรือ 100,000,000,000 ระเบียนของข้อมูลพื้นฐานเดียวกัน (คิดว่ามันจะช้ากว่ามาก)
ryanzec

แบบสอบถามฐานข้อมูลไม่เพียง แต่เกี่ยวกับตรรกะและยิ่งคุณรู้เร็วเท่านี้มันก็จะทำงานได้ไม่ดีเท่าที่ควร สิ่งใดที่ใช้ได้ผลกับ 1 เรคคอร์ดจะหมดเวลาในการทดสอบและการทดสอบหน่วยแสดงให้เห็นว่าเร็วที่สุด
HLGEM

การทดสอบหน่วยและการรวมสำหรับการทำงานและไม่ได้ประสิทธิภาพดังนั้นคุณสามารถทดสอบด้วยข้อมูลจำนวนเล็กน้อย
151019

การทดสอบหน่วยไม่ควรใช้ฐานข้อมูลการทดสอบการรวมใช้ฐานข้อมูล
Nicholas Mayne

1
สิ่งที่คุณกำลังพูดถึงคือการทดสอบโหลด หากคุณมีชุดการทดสอบการยอมรับและเชื่อมต่อเข้ากับเครื่องมือทดสอบการโหลดคุณจะสามารถบรรลุผลตามที่ต้องการ
Nicholas Mayne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.