FakeIt เฟรมเวิร์กสำหรับการทำ mocking ใน C++ ที่ออกแบบมาเพื่อลดความซับซ้อนในการทดสอบหน่วย ได้ก่อให้เกิดการถกเถียงในชุมชนนักพัฒนาเกี่ยวกับข้อจำกัดทางเทคนิคและประโยชน์ในทางปฏิบัติ แม้ว่าเฟรมเวิร์กนี้จะสัญญาว่าสามารถผสานรวมกับเครื่องมือทดสอบยอดนิยมอย่าง Google Test และ Boost Test ได้อย่างง่ายดายผ่านวิธีการไฟล์ header เดียว แต่ก็มีประเด็นที่น่ากังวลหลายประการที่เกิดขึ้นจากการอภิปรายในชุมชน
เฟรมเวิร์กการทดสอบที่รองรับ
เฟรมเวิร์ก | ชื่อการกำหนดค่า |
---|---|
Google Test | gtest |
MSTest | mstest |
Boost Test | boost |
Catch 2 | catch |
Qt Test | qtest |
doctest | doctest |
Standalone | standalone |
ความเข้ากันได้กับการปรับแต่งประสิทธิภาพเป็นสัญญาณเตือนภัย
ความกังวลที่สำคัญที่สุดเกี่ยวข้องกับความไม่สามารถของ FakeIt ในการทำงานร่วมกับการปรับแต่งประสิทธิภาพมาตรฐานของคอมไพเลอร์ เฟรมเวิร์กนี้กำหนดให้ผู้ใช้ GCC ต้องคอมไพล์ด้วยแฟล็ก -O1 หรือ -O0 อย่างชัดเจน โดยหลีกเลี่ยงระดับการปรับแต่งประสิทธิภาพ -O2 และ -O3 ที่ใช้กันทั่วไป ข้อจำกัดนี้บ่งชี้ว่าเฟรมเวิร์กอาจจัดการออบเจ็กต์ในหน่วยความจำในลักษณะที่ทำลายการทำงานภายใต้การปรับแต่งประสิทธิภาพปกติของคอมไพเลอร์
การเสียหายจากการปรับแต่งประสิทธิภาพหมายถึงการเสียหายสำหรับฉัน อย่าไปยุ่งเกี่ยวกับพฤติกรรมที่ไม่ได้กำหนดไว้ คุณต้องหลีกเลี่ยงมัน หรือการหลีกเลี่ยงคอมไพเลอร์ของคุณต้องแน่นหนาจนยังคงทำงานได้แม้มีการปรับแต่งประสิทธิภาพ
ข้อจำกัดนี้สร้างปัญหาในทางปฏิบัติสำหรับทีมพัฒนาที่ต้องการรันชุดทดสอบในโหมด release หรือดีบักปัญหาเฉพาะการปรับแต่งประสิทธิภาพ ข้อจำกัดนี้ป้องกันนักพัฒนาจากการทดสอบโค้ดของตนภายใต้เงื่อนไขเดียวกับที่จะรันในการใช้งานจริง
ข้อจำกัดหลัก
- การรองรับคอมไพเลอร์: รองรับเฉพาะ GCC , Clang และ MSC++ เท่านั้น
- แฟล็กการปรับแต่งประสิทธิภาพ: GCC O2 และ O3 ไม่ได้รับการรองรับ (ต้องใช้ -O1 หรือ -O0)
- การสืบทอด: ไม่สามารถสร้าง mock ของคลาสที่มีการสืบทอดแบบหลายชั้นหรือเสมือน
- ความปลอดภัยของเธรด: Mock ไม่ปลอดภัยสำหรับการใช้งานแบบหลายเธรด
- ข้อกำหนดของ MSC++: ต้องเปิดใช้งานโหมดดีบัก Edit And Continue
การตั้งคำถามเกี่ยวกับข้อเสนอคุณค่า
สมาชิกในชุมชนยังได้ตั้งคำถามว่า FakeIt ให้คุณค่าเพียงพอเมื่อเทียบกับทางเลือกที่ง่ายกว่าหรือไม่ นักพัฒนาบางคนโต้แย้งว่าการเขียนโค้ดการใช้งานจริงจะต้องใช้ความพยายามน้อยกว่าการตั้งค่า mock โดยใช้เฟรมเวิร์ก การวิพากษ์วิจารณ์นี้เน้นให้เห็นการถกเถียงที่กว้างขึ้นเกี่ยวกับเวลาที่เฟรมเวิร์ก mocking กลายเป็นอุปสรรคมากกว่าความช่วยเหลือ
การอภิปรายเผยให้เห็นความชอบของนักพัฒนาบางคนต่อ fake ที่เขียนด้วยมือซึ่งจำลองพฤติกรรมจริงโดยไม่มีผลข้างเคียงที่ไม่ต้องการ โซลูชันที่กำหนดเองเหล่านี้แม้ว่าจะต้องใช้ความพยายามเริ่มต้นมากกว่า แต่มักให้การควบคุมและความเข้าใจสภาพแวดล้อมการทดสอบที่ดีกว่า
ปัญหาการชนกันของชื่อและความกังวลเรื่องการผสานรวม
นอกจากความท้าทายของเฟรมเวิร์กแล้ว ยังมีความขัดแย้งในการตั้งชื่อกับเฟรมเวิร์กการทดสอบที่มีอยู่ของ Microsoft ซึ่งอาจสร้างความสับสนสำหรับนักพัฒนาที่ทำงานในสภาพแวดล้อมผสม การทับซ้อนนี้อาจทำให้การนำไปใช้ในองค์กรที่ใช้เครื่องมือทดสอบของ Microsoft อยู่แล้วซับซ้อนขึ้น
แม้จะมีการวิพากษ์วิจารณ์เหล่านี้ FakeIt ก็ยังมีฟีเจอร์ที่น่าสนใจบางอย่าง รวมถึงการสนับสนุนคอมไพเลอร์หลัก ( GCC , Clang และ Visual Studio ) การผสานรวมกับเฟรมเวิร์กการทดสอบหลายตัว และ API ที่ค่อนข้างง่ายซึ่งอิงตามฟีเจอร์ C++11 เฟรมเวิร์กยังสนับสนุน dynamic casting และไม่มีข้อจำกัดเกี่ยวกับจำนวนอาร์กิวเมนต์ของเมธอด
การอภิปรายในชุมชนเกี่ยวกับ FakeIt สะท้อนความตึงเครียดที่กว้างขึ้นในแนวปฏิบัติการทดสอบ C++ ที่นักพัฒนาต้องสร้างสมดุลระหว่างความสะดวกสบายกับความน่าเชื่อถือและประสิทธิภาพ แม้ว่าเฟรมเวิร์ก mocking สามารถลดโค้ด boilerplate ได้ แต่ก็ยังนำเข้าการพึ่งพาและจุดล้มเหลวที่อาจเกิดขึ้นซึ่งอาจไม่สมเหตุสมผลกับความซับซ้อนในทุกสถานการณ์
อ้างอิง: Fakelt