การทดสอบช่องว่างระหว่างหน่วยและการรวม: การรวมในการทดสอบส่วนประกอบขนาดเล็กการรวมหน่วย


9

ในช่วงสองสามสัปดาห์ที่ผ่านมาฉันได้ครุ่นคิดและค้นคว้าวิธีเติมช่องว่างในวิธีการทดสอบของเรา ในการทดสอบหน่วยคำศัพท์ที่ง่ายมีขนาดเล็กเกินไปและการทดสอบการรวมแบบดั้งเดิมนั้นใหญ่เกินไป

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

เห็นได้ชัดว่าการทดสอบหน่วยที่Aมีข้อสมมติฐานล้อเลียนเกี่ยวกับCการทดสอบAแยกได้ แต่ก็ไม่ได้ทดสอบสมมติฐานเอง

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

ในการจัดวางสิ่งนี้ด้วยตัวอย่างที่ชัดเจนยิ่งขึ้น: สมมติว่านี่เป็นแอปพลิเคชั่นของโหนด AและBขึ้นอยู่กับCการอ่านไฟล์ (ในหมู่สิ่งอื่น ๆ ) Cและการจัดเก็บเนื้อหาของแฟ้มในวัตถุส่งผ่านไปยัง ในตอนแรกไฟล์ทั้งหมดที่Cจัดการมีขนาดเล็กและสามารถอ่านแบบซิงโครนัสโดยไม่มีการบล็อกที่สำคัญ อย่างไรก็ตามผู้พัฒนาBตระหนักว่าไฟล์ของเขามีขนาดใหญ่ขึ้นและจำเป็นต้องเปลี่ยนCมาอ่านแบบ async ซึ่งส่งผลให้เกิดข้อผิดพลาดในการซิงโครไนซ์เป็นระยะAซึ่งยังคงCมีการอ่านไฟล์

นี่เป็นประเภทของบั๊กที่ยากต่อการติดตามจากการทดสอบการรวมระบบแบบสมบูรณ์และอาจไม่สามารถทำการทดสอบการรวมระบบได้เลย มันไม่ได้ถูกจับโดยAการทดสอบหน่วย s เพราะAข้อสันนิษฐานนั้นถูกเยาะเย้ย แต่มันได้อย่างง่ายดายจับโดย "มินิ" บูรณาการทดสอบว่าการออกกำลังกายเพียงและAC

ฉันพบการอ้างอิงประเภทนี้ของการทดสอบเพียงเล็กน้อยเท่านั้น บูรณาการในขนาดเล็ก , การทดสอบส่วนประกอบของการรวม , หน่วยบูรณาการการทดสอบ นอกจากนี้ยังเกี่ยวข้องกับทิศทางการทดสอบ BDDค่อนข้างมากกว่าการทดสอบ TDD อย่างเป็นทางการ

ฉันจะเติมช่องว่างการทดสอบนี้ได้อย่างไร โดยเฉพาะ - ฉันจะทำการทดสอบแบบไหน? ฉันจะจำลองอินพุตAและCสำหรับการทดสอบการรวม "มินิ" ได้อย่างไร และควรแยกความกังวลเรื่องการทดสอบระหว่างการทดสอบและการทดสอบหน่วยเท่าไหร่ หรือมีวิธีที่ดีกว่าในการเติมเต็มช่องว่างในการทดสอบ?


1
คุณเคยพิจารณาเวอร์ชันของโมดูล AC และใช้รูปแบบของการจัดการการพึ่งพาบ้างไหม?
miraculixx


1
@gnat ขอบคุณสำหรับเคล็ดลับ ฉันทำคำถามที่คลุมเครือน้อยลง
mjhm

@ miraclixx ขอบคุณสำหรับคำแนะนำของคุณ คุณสามารถทำอย่างละเอียด? หากคุณหมายถึงบางสิ่งบางอย่างเช่นblog.nodejitsu.com/package-dependencies-done-right - ฉันคิดว่านี่จะแก้ปัญหาที่แตกต่างจากที่ฉันถาม คอมโพเนนต์ที่ฉันอ้างถึงโดยทั่วไปมีขนาดเล็กเกินไปที่จะเป็นเวอร์ชันอิสระในฐานะโมดูลโหนดตัวอย่างเช่นไฟล์คอมโพเนนต์ Model หรือ Controller นอกจากนี้การกำหนดเวอร์ชันยังให้คำแนะนำเกี่ยวกับความปลอดภัยและแหล่งที่มาของความล้มเหลวมากกว่าการทดสอบอย่างชัดเจนสำหรับปัญหาเฉพาะ
mjhm

คำตอบ:


6

ดูเหมือนว่าคุณมีปัญหาพื้นฐานกับส่วนประกอบของคุณ

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

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

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


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

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