เนื่องจากฉันไม่ได้มีประสบการณ์จริงในการทดสอบหน่วยฉันพยายามรวบรวมกฎที่ฉันจะเรียนรู้ก่อน
ระวังการเรียนรู้ "กฎ" สำหรับปัญหาที่คุณไม่เคยพบมาก่อน หากคุณเจอ "กฎ" หรือ "แนวปฏิบัติที่ดีที่สุด" ฉันขอแนะนำให้หาตัวอย่างของเล่นง่ายๆว่าควรใช้กฎนี้ที่ไหนและพยายามแก้ปัญหาด้วยตัวเองโดยไม่สนใจสิ่งที่กฎบอก
ในกรณีนี้คุณสามารถลองเรียนแบบง่าย ๆ 2 หรือ 3 คลาสและพฤติกรรมบางอย่างที่ควรนำมาใช้ ใช้ชั้นเรียนด้วยวิธีใดก็ตามที่รู้สึกเป็นธรรมชาติและเขียนบททดสอบสำหรับแต่ละพฤติกรรม ทำรายการปัญหาใด ๆ ที่คุณพบเช่นถ้าคุณเริ่มต้นกับสิ่งต่าง ๆ ที่ใช้งานได้ในทางเดียวคุณต้องกลับไปแก้ไขในภายหลัง หากคุณสับสนเกี่ยวกับว่าสิ่งต่าง ๆ ควรจะเข้ากันได้อย่างไร ถ้าคุณหงุดหงิดที่เขียนแผ่น; เป็นต้น
จากนั้นลองแก้ไขปัญหาเดียวกันโดยทำตาม "กฎ" ทำรายการปัญหาที่คุณพบอีกครั้ง เปรียบเทียบรายการและคิดว่าสถานการณ์ใดอาจดีกว่าเมื่อทำตามกฎและสถานการณ์อาจไม่ดีขึ้น
สำหรับคำถามที่แท้จริงของคุณฉันมักจะชอบวิธีการพอร์ตและอะแดปเตอร์ที่เราสร้างความแตกต่างระหว่าง "ตรรกะหลัก" และ "บริการ" (นี่คล้ายกับการแยกความแตกต่างระหว่างฟังก์ชั่นบริสุทธิ์และขั้นตอนที่มีประสิทธิภาพ)
ตรรกะหลักคือทั้งหมดที่เกี่ยวกับการคำนวณสิ่งต่าง ๆ "ภายใน" แอปพลิเคชันตามโดเมนปัญหา มันอาจจะมีการเรียนเช่นUser
, Document
, Order
, Invoice
ฯลฯ ที่ดีมันจะมีการเรียนหลักเรียกnew
สำหรับการเรียนหลักอื่น ๆ ตั้งแต่ที่พวกเขากำลัง "ภายใน" รายละเอียดการปฏิบัติ ตัวอย่างเช่นการสร้างOrder
อาจสร้างInvoice
และDocument
รายละเอียดสิ่งที่สั่งซื้อ ไม่จำเป็นต้องเยาะเย้ยสิ่งเหล่านี้ในระหว่างการทดสอบเพราะสิ่งเหล่านี้เป็นสิ่งที่เราต้องการทดสอบจริง!
พอร์ตและอะแดปเตอร์เป็นวิธีการที่ตรรกะหลักมีปฏิสัมพันธ์กับโลกภายนอก นี่คือสิ่งที่ชอบDatabase
, ConfigFile
, EmailSender
ฯลฯ มีชีวิตอยู่ สิ่งเหล่านี้คือสิ่งที่ทำให้การทดสอบนั้นยากดังนั้นจึงแนะนำให้สร้างสิ่งเหล่านี้นอกตรรกะหลักและส่งผ่านตามที่ต้องการ (ไม่ว่าจะด้วยการฉีดพึ่งพาหรือเป็นวิธีการโต้แย้ง ฯลฯ )
ด้วยวิธีนี้ตรรกะหลัก (ซึ่งเป็นส่วนเฉพาะแอปพลิเคชันที่ตรรกะทางธุรกิจที่สำคัญมีชีวิตอยู่และมีการเปลี่ยนแปลงมากที่สุด) สามารถทดสอบได้ด้วยตัวเองโดยไม่ต้องดูแลเกี่ยวกับฐานข้อมูลไฟล์อีเมล ฯลฯ เราสามารถส่งผ่านค่าตัวอย่างและตรวจสอบว่าเราได้รับค่าผลลัพธ์ที่ถูกต้อง
พอร์ตและอะแดปเตอร์สามารถทดสอบแยกกันโดยใช้ mocks สำหรับฐานข้อมูลระบบไฟล์และอื่น ๆ โดยไม่ต้องใส่ใจกับตรรกะทางธุรกิจ เราสามารถส่งผ่านค่าตัวอย่างและตรวจสอบว่าพวกเขากำลังถูกเก็บ / อ่าน / ส่ง / ฯลฯ อย่างเหมาะสม.