รหัสของคุณใดที่ไม่ผ่านการทดสอบ เป็นรหัสที่เกี่ยวข้องกับสถานการณ์ที่ซับซ้อนซึ่งคุณไม่สามารถควบคุมได้หรือไม่ เธรด รันคำสั่ง git เครือข่าย หรือ UI?
แอปของเราน่าสนใจที่สุดเมื่อมีความซับซ้อน พวกเขายังอันตรายที่สุด และนั่นเป็นเหตุผลว่าทำไมโค้ดที่ทดสอบยากจึงเป็นโค้ดประเภทหนึ่งที่ต้องผ่านการทดสอบอย่างดี นั่นไม่ได้เกิดขึ้นเสมอไป
ทุกครั้งที่คุณแตะโค้ดนั้น คุณจะแตะเบาๆ แทน คุณเหยียบอย่างระมัดระวัง บางทีคุณอาจทำการทดสอบด้วยตนเอง และเมื่อคุณส่งคำขอดึง คุณหวังว่าเพื่อนร่วมทีมของคุณจะไม่ทราบว่าการทดสอบเหล่านั้นไม่มีอยู่จริง
แต่นั่นไม่ได้ทำให้ทุกอย่างดีขึ้น คุณจะพบกับปัญหาเดิมๆ ข้อบกพร่องเดิมๆ ความเครียดเดิมๆ ในครั้งต่อไป และทุกครั้งหลังจากนั้น ในที่สุดคุณจะทำให้การทดสอบที่ท้าทายเหล่านั้นเป็นสิ่งที่เชื่อถือได้ได้อย่างไร
เปลี่ยนกรอบความคิดของคุณ
สิ่งที่น่าผิดหวังที่สุดเกี่ยวกับการทดสอบเหล่านี้? จะใช้เวลาเขียนนานเป็นสิบเท่าเท่าที่ควร หากคุณประเมินเวลาที่การทดสอบช่วยให้คุณประหยัดเวลาในการเขียนแบบทดสอบ ก็ดูเหมือนจะไม่คุ้มค่า
แต่ไม่ใช่แค่เกี่ยวกับการทดสอบนี้เท่านั้น เกี่ยวกับการทดสอบในอนาคตทั้งหมดของคุณ .
โค้ดที่ทดสอบดีที่สุดส่วนใหญ่ที่ฉันเคยเห็นได้รับการสนับสนุนมากมาย ไม่ใช่แค่โค้ดใน test/models
. โค้ดที่ได้รับการทดสอบเป็นอย่างดีมีการปลอม มีการเยาะเย้ย มีชุดอุปกรณ์ทดสอบที่ดี มีตัวเลือกการกำหนดค่าสำหรับการทดสอบโดยเฉพาะ
สิ่งที่ต้องใช้เวลาในการเขียนและรวบรวม
แต่พอได้กินแล้วรู้สึก ดีมาก คุณสามารถสร้างการทดสอบหลังการทดสอบ รู้สึกสบายใจกับโค้ดของคุณ และมั่นใจได้อย่างรวดเร็วว่าคุณจะย้ายได้หลังจากลงทุนไปแล้ว
คุณสามารถพึ่งพา ในงานที่คุณได้ทำไปแล้ว
จึงไม่เพียงแค่การป้องกันบั๊กในโค้ดที่ซับซ้อนเท่านั้น ยังเป็นการทำให้โค้ดในอนาคตง่ายต่อการทดสอบ ทีละส่วน
ทำให้เป็นการทดสอบการรวมระบบ (สำหรับตอนนี้)
แม้ว่าบางครั้ง มันไม่ได้เกี่ยวกับการเข้าใจคุณค่า – ฉันเข้าใจ แต่ฉันกลับติดขัดเพราะไม่รู้ว่าจะเขียนแบบทดสอบหน่วยกิตสั้นๆ ที่รวดเร็ว
คุณรู้ได้อย่างไรว่าคุณกำลังใช้คำสั่ง git ที่ถูกต้องในเครื่องมือการปรับใช้ของคุณ โดยไม่ต้องเรียกใช้ git
? คุณจะแน่ใจได้อย่างไรว่าคุณกำลังส่งเซิร์ฟเวอร์ระยะไกลไปยังส่วนหัวที่ถูกต้อง
ด้วยเวลาเพียงพอ คุณสามารถสร้างของปลอมที่มีคุณภาพเพื่อให้การทดสอบของคุณเชื่อถือได้
แต่เมื่อดูเหมือนว่าจะคิดมากเกินไป มีอย่างอื่นที่คุณสามารถลองได้ แยกการทดสอบออกเป็นสองขั้นตอน:“ทดสอบโค้ด” และ “เขียนแบบจำลอง”
เพียงแค่เรียกเซิร์ฟเวอร์นั้น เพียงแค่เรียกใช้คำสั่งนั้น ทำไม?
- เริ่มต้นได้ง่ายกว่ามาก คุณอาจกำลังทดสอบคำสั่งเหล่านั้นด้วยตนเองใช่ไหม เรียกใช้ในคอนโซลหรือลองใช้ในเบราว์เซอร์? เพียงคัดลอกลงในการทดสอบ
- ในที่สุดเมื่อคุณเขียนภาพล้อเลียนหรือล้อเลียน คุณสามารถใช้การทดสอบเหล่านี้เพื่อให้แน่ใจว่าภาพจำลองของคุณใช้งานได้จริง หากคุณเห็นพฤติกรรมแบบเดียวกันในโลกแห่งความเป็นจริงอย่างที่คุณเห็นจากของปลอม แสดงว่าของปลอมของคุณน่าจะดี!
คุณอาจไม่ต้องการเก็บการทดสอบเหล่านี้ไว้ตลอดไป:
- มีปัญหาทั้งหมดที่การทดสอบการผสานรวมมี พวกเขาสามารถช้า พวกเขาอาจต้องการการเชื่อมต่ออินเทอร์เน็ตแบบสด อาจเปราะบางเพราะขึ้นอยู่กับพฤติกรรมที่แอปของคุณไม่สนใจจริงๆ
- คุณอาจไม่สามารถทดสอบบางสิ่งในโลกแห่งความเป็นจริงได้ ตัวอย่างเช่น คุณจะบังคับรหัสข้อผิดพลาดเฉพาะได้อย่างไรเมื่อคุณไม่ได้ควบคุมเซิร์ฟเวอร์ในอีกด้านหนึ่ง
- คุณอาจถูกบล็อกโดยเซิร์ฟเวอร์ที่คุณพึ่งพา และอาจทำลายการทดสอบของคุณ (และแอปของคุณ!) สิ่งนี้เกิดขึ้นกับฉันจริงๆ และเป็นปัญหาใหญ่
ดังนั้น การเขียนแบบทดสอบของคุณเป็นแบบทดสอบการรวมในโลกแห่งความเป็นจริงจึงไม่ใช่วิธีแก้ปัญหาแบบถาวร หรือแม้แต่การทดสอบระยะยาว แต่ถึงแม้จะมีข้อเสียทั้งหมด แต่ก็ยังมีประโยชน์ และหลังจากที่คุณเปลี่ยนแล้ว คุณยังคงเก็บการทดสอบการรวมไว้เป็นชุดแยกต่างหากได้ ด้วยวิธีนี้ คุณจะตรวจสอบโค้ดของฉันกับความเป็นจริงได้เสมอ ไม่ใช่แค่สมมติฐานของคุณ
รหัสบางรหัสนั้นยากต่อการทดสอบ ต้องใช้เวลาสักครู่ในการสร้างโครงสร้างพื้นฐานที่คุณต้องการเพื่อเขียนการทดสอบที่เชื่อถือได้อย่างรวดเร็ว และหลายครั้งก็ดูไม่คุ้มค่า
แต่เมื่อคุณหยุดคิดถึงการทดสอบครั้งเดียวนั้น และคิดถึงคุณค่าของการทำให้การทดสอบในอนาคตทั้งหมดของคุณง่ายขึ้น การทดสอบโค้ดที่ซับซ้อนจะกลายเป็นแรงจูงใจมากขึ้น และเมื่อการทดสอบครั้งแรกสิ้นสุดลง การทดสอบที่เหลือก็ดูเหมือนจะเขียนง่ายขึ้นมากอย่างน่าอัศจรรย์
แม้ว่าบางครั้งจะไม่เพียงพอ จะเกิดอะไรขึ้นถ้าคุณรู้วิธีตรวจสอบให้แน่ใจว่าโค้ดของคุณใช้งานได้จริง แต่ไม่สามารถหาวิธีทดสอบได้
เมื่อสิ่งนั้นเกิดขึ้น ให้หยุดมองว่าการทดสอบเป็นสิ่งที่คุณต้องรักษาให้บริสุทธิ์และโดดเดี่ยว ให้มองว่าเป็นวิธีการทำสิ่งที่คุณทำเองอยู่แล้วโดยอัตโนมัติ
มันไม่สมบูรณ์แบบ และคุณควรเปลี่ยนโดยเร็วที่สุด แต่การทดสอบเหล่านั้นสามารถให้ความมั่นใจแก่คุณในการเขียนและเปลี่ยนโค้ดที่ซับซ้อนได้อย่างรวดเร็ว