เป็นความคิดที่ดีหรือไม่ที่จะทำ TDD ในส่วนประกอบระดับต่ำ?


10

ฉันกำลังพิจารณาที่จะเขียนไดรเวอร์ระดับต่ำหรือส่วนประกอบ / เมล็ดระบบปฏิบัติการ

ผู้คนosdev.orgดูเหมือนจะคิดว่าบิตที่สำคัญนั้นไม่ได้มีความหมายที่พิสูจน์ได้ด้วยวิธีนี้ แต่ฉันได้อ่านการสนทนาบางอย่างที่ผู้คนคิดแตกต่างกัน ฉันได้ดูไปรอบ ๆ แล้ว แต่ไม่พบตัวอย่างชีวิตจริงของ TDD ในองค์ประกอบระดับต่ำ

นี่เป็นสิ่งที่ผู้คนทำจริง ๆ หรือเพียงแค่สิ่งที่ผู้คนพูดถึงในทางทฤษฎีเพราะไม่มีวิธีที่ดีในการฝึกฝน


ถ้าเพียงแค่ MS ให้ผู้พัฒนาเคอร์เนลด้วย "เคอร์เนล mocks" ที่เหมาะสม (หรืออะไรก็ตามที่เป็นไปได้) การฝึกฝนที่เป็นปัญหาจะไม่ใช่ "จินตนาการ" ฉันคิดว่า
mlvljr

สวัสดี @Bill - ฉันได้ขอคำถามของคุณใหม่อีกครั้งและได้รับการโหวตให้เปิดใหม่อีกครั้ง ถ้าฉันได้เปลี่ยนมันมากเกินไปจากความตั้งใจเดิมของคุณโปรดอย่าลังเลที่จะแก้ไขเพิ่มเติมหรือย้อนกลับคำถาม :)
ราเชล

พูดสิ่งเดียวกันจากมุมมองของฉัน - ไม่ต้องกังวล
Bill

คำตอบ:


3

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


1
และทำไมไม่ทดสอบอีมูเลเตอร์ล่ะ? ;)
mlvljr

@mlvljr: เพราะอีมูเลเตอร์ไม่ใช่ของจริง ไม่มีสิ่งใดทดแทนฮาร์ดแวร์จริงได้
พอลนาธาน

@mlvljr คุณต้องทดสอบโปรแกรมจำลองกับฮาร์ดแวร์จริงโดยใช้ชุดทดสอบที่สร้างขึ้นเพื่อทดสอบการทดสอบดั้งเดิมสำหรับ ... รอฉันอยู่ที่ไหนอีกครั้ง
หมายเหตุถึงตนเอง - คิดชื่อ

ดังนั้น, vmware และ alikes ไม่สามารถทำการทดสอบได้?
mlvljr

1
@mlvljr: มันเป็นจุดที่ถูกต้อง แต่ฉันคิดว่ามันอยู่นอกขอบเขตของ "TDD" มีนักพัฒนาไม่กี่คนที่สามารถเข้าถึงอีมูเลเตอร์ระดับระบบที่สามารถสคริปต์ได้ ฉันรู้สึกโชคดีที่มีขอบเขตสี่แชนเนล!
TMN

3

โดยส่วนตัวฉันเชื่อว่าจะได้รับประโยชน์มากมายจาก TDD (โดยไม่ต้องปฏิบัติตาม TDD) โดย:

  • เขียนทั้งผู้โทรและรหัสcalleeในเวลาเดียวกัน (ไม่เกิน 24 ชั่วโมงอย่างแน่นอน)
    • และใช้สิ่งนั้นเพื่อส่งผลต่อการออกแบบส่วนต่อประสาน (วัตถุการเรียกใช้เมธอดและพารามิเตอร์)
  • สำหรับส่วนประกอบที่ต้องการอัลกอริธึม / รหัสที่ซับซ้อนให้พิจารณาการใช้งานในอัลกอริทึมที่เรียบง่าย แต่ถูกต้องก่อนแม้ว่าจะมีประสิทธิภาพน้อยกว่า (หรือโง่หรือทำงานได้เฉพาะในสถานการณ์ที่แคบกว่า)
    • วิธีการทดสอบที่ง่ายมากจะใช้ทั้งอัลกอริธึมและเปรียบเทียบผลลัพธ์
  • เมื่อพบข้อผิดพลาด (โดยวิธีใด ๆ ) ในส่วนหนึ่งของรหัสส่วนหนึ่งของรหัสนั้นสมควรที่จะได้รับการทดสอบมากยิ่งขึ้น นี่หมายถึงการทำการทดสอบที่ซับซ้อนกว่า TDD จะเรียกร้อง (ขึ้นอยู่กับเหตุผลที่ข้อบกพร่องเกิดขึ้นในกลุ่ม )

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

แก้ไข:

หลังจากอ่านหน้านี้อย่างถี่ถ้วน

ในขณะที่มันเป็นไปได้ที่จะทดสอบฟังก์ชั่นเคอร์เนลส่วนใหญ่ในไดรเวอร์ทดสอบ "testbed" สิ่งที่ "ฉ่ำ" จริงๆเช่นการจัดการขัดจังหวะการส่งกระบวนการหรือการจัดการหน่วยความจำอาจไม่สามารถทดสอบได้ --- จากhttp://wiki.osdev.org/Unit_Testing

พวกเขาจะบอกว่าอย่างชัดเจนมากที่สุดส่วนที่ทดสอบและบางส่วนต้องใช้ชนิดที่แตกต่างของการทดสอบ: ทดสอบความเครียด


มันก็หมายความว่าส่วนที่สำคัญคือชิ้นส่วนที่ต้องมีการทดสอบที่แตกต่างกัน
Bill

ช่างเป็นคำตอบที่ยอดเยี่ยมมาก! ในหลาย ๆ ระดับไชโย!
manuelBetancurt

1

ฉันไม่. ในรหัสฝังตัวของอาจารย์ฉันเพิ่งเขียนรหัสและใช้เวลาของฉันให้เหตุผลเกี่ยวกับสิ่งที่มันทำ (และไม่ได้) ฉันไม่แน่ใจว่ามันสามารถทำได้ในกรณีของฉันอย่างไรก็ตามฉันถูกรบกวนใกล้กับขีด จำกัด ทางกายภาพของหน่วยความจำโดยไม่ต้องฉีดรหัสทดสอบ

ฉันคิดว่าสำหรับระบบที่มีขนาดใหญ่พอ (เช่นมีหน่วยความจำ MB ไม่ใช่ KB) ก็สามารถทำได้สำหรับองค์ประกอบบางอย่างถ้าคุณมีเวลาและความพยายามเพียงพอ การทดสอบรหัสการอ่านพินโดยการจำลองหมุดขึ้นคือ ... เอ่อ ... ไม่ค่อยมีความหมาย หากคุณแยกตรรกะออกจากกันมากพอคุณสามารถทดสอบตรรกะอื่น ๆ ได้

FWIW ฉันไม่ได้ซื้อ TDD ในกรณีทั่วไป - มันใช้งานได้ดีสำหรับสแต็คระบบที่มีขนาดใหญ่พอที่มีทรัพยากรมากพอที่มีพฤติกรรมที่กำหนดไว้มากพอนอกเหนือจากที่มันดูเหมือนจะไม่สมเหตุสมผล

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