บางคนยืนยันว่าการทดสอบการรวมเป็นสิ่งเลวและผิดทุกอย่างต้องผ่านการทดสอบหน่วยซึ่งหมายความว่าคุณต้องจำลองการอ้างอิง ตัวเลือกที่ด้วยเหตุผลต่าง ๆ ฉันไม่ชอบเสมอ
ฉันพบว่าในบางกรณีการทดสอบหน่วยก็ไม่ได้พิสูจน์อะไรเลย
ลองมาปรับใช้การใช้พื้นที่เก็บข้อมูล (เล็กน้อย, ไร้เดียงสา) ต่อไปนี้ (ใน PHP) เป็นตัวอย่าง:
class ProductRepository
{
private $db;
public function __construct(ConnectionInterface $db) {
$this->db = $db;
}
public function findByKeyword($keyword) {
// this might have a query builder, keyword processing, etc. - this is
// a totally naive example just to illustrate the DB dependency, mkay?
return $this->db->fetch("SELECT * FROM products p"
. " WHERE p.name LIKE :keyword", ['keyword' => $keyword]);
}
}
สมมติว่าฉันต้องการพิสูจน์ในการทดสอบว่าที่เก็บนี้สามารถค้นหาผลิตภัณฑ์ที่ตรงกับคำหลักที่ให้มาหลากหลาย
ขาดการทดสอบการรวมกับวัตถุการเชื่อมต่อจริงฉันจะรู้ได้อย่างไรว่านี่เป็นการสร้างคำค้นหาจริงและคำถามเหล่านั้นทำในสิ่งที่ฉันคิดว่าทำจริง ๆ
ถ้าฉันต้องจำลองวัตถุการเชื่อมต่อในการทดสอบหน่วยฉันสามารถพิสูจน์ได้ว่า "มันสร้างแบบสอบถามที่คาดหวัง" - แต่นั่นไม่ได้หมายความว่ามันจะใช้งานได้จริง... นั่นคือบางทีมันอาจสร้างแบบสอบถาม ฉันคาดหวัง แต่บางทีแบบสอบถามนั้นอาจไม่ได้ทำอย่างที่คิด
ในคำอื่น ๆ ฉันรู้สึกเหมือนการทดสอบที่ทำให้ยืนยันเกี่ยวกับแบบสอบถามที่สร้างขึ้นเป็นหลักโดยไม่คุ้มค่าเพราะการทดสอบวิธีการfindByKeyword()
วิธีการได้รับการดำเนินการแต่ที่ไม่ได้พิสูจน์ว่าจริง ๆ แล้วมันทำงาน
ปัญหานี้ไม่ได้ จำกัด อยู่แค่ที่เก็บหรือการรวมฐานข้อมูล แต่ดูเหมือนว่าจะมีการใช้งานในหลายกรณีซึ่งเป็นการยืนยันเกี่ยวกับการใช้งานจำลอง (ทดสอบสองครั้ง) เป็นการพิสูจน์ว่ามีการนำสิ่งต่าง ๆ มาใช้อย่างไร ใช้งานได้จริง
คุณรับมือกับสถานการณ์เช่นนี้ได้อย่างไร
การทดสอบการรวมกันนั้น "เลวร้าย" ในกรณีเช่นนี้หรือไม่?
ฉันได้รับจุดที่ดีกว่าที่จะทดสอบสิ่งหนึ่งและฉันยังเข้าใจว่าเหตุใดการทดสอบการรวมจึงนำไปสู่เส้นทางรหัสจำนวนมหาศาลซึ่งทั้งหมดไม่สามารถทดสอบได้ - แต่ในกรณีของบริการ (เช่นที่เก็บ) ซึ่งมีวัตถุประสงค์เพียงอย่างเดียวคือ ในการโต้ตอบกับองค์ประกอบอื่นคุณจะทดสอบอะไรได้โดยไม่ต้องทดสอบการรวมระบบ