วิธีการทดสอบจำนวนมากต่อวิธี?
ค่าสูงสุดของทฤษฏีและทำไม่ได้สูงคือความซับซ้อนของ N-Path (สมมติว่าการทดสอบทั้งหมดครอบคลุมวิธีที่แตกต่างกันผ่านทางรหัส;)) ขั้นต่ำคือ ONE! ตามวิธีการสาธารณะนั่นคือเขาไม่ได้ทดสอบรายละเอียดการใช้งานเฉพาะพฤติกรรมภายนอกของชั้นเรียน (คืนค่าและเรียกวัตถุอื่น ๆ )
คุณพูด:
* และความคิดในการทดสอบแต่ละวิธีของคุณด้วยวิธีการทดสอบของตัวเอง (ในความสัมพันธ์ 1-1) จะน่าหัวเราะ * * * *
แล้วถาม:
ดังนั้นหากการสร้างการทดสอบสำหรับแต่ละวิธีคือ 'น่าหัวเราะ' คุณจะเลือกสิ่งที่คุณเขียนการทดสอบได้อย่างไร / เมื่อไหร่?
แต่ฉันคิดว่าคุณเข้าใจผิดของผู้เขียนที่นี่:
แนวคิดของการมีone test method
ต่อone method in the class to test
คือสิ่งที่ผู้เขียนเรียกว่า "น่าหัวเราะ"
(สำหรับฉันอย่างน้อย) มันไม่เกี่ยวกับ 'น้อย' มันเกี่ยวกับ 'เพิ่มเติม'
ดังนั้นให้ฉันใช้ถ้อยคำใหม่เหมือนที่ฉันเข้าใจเขา:
และความคิดในการทดสอบแต่ละวิธีของคุณด้วยวิธีการเพียงวิธีเดียวเท่านั้น ( วิธีทดสอบของตัวเองในความสัมพันธ์ 1-1) จะทำให้คุณหัวเราะ
หากต้องการอ้างคำพูดของคุณอีกครั้ง:
เมื่อคุณตระหนักว่ามันคือทั้งหมดที่เกี่ยวกับการระบุพฤติกรรมและไม่เขียนแบบทดสอบมุมมองของคุณจะเปลี่ยนไป
เมื่อคุณฝึก TDD คุณจะไม่คิดว่า :
ฉันมีวิธีการcalculateX($a, $b);
และจำเป็นต้องมีการทดสอบtestCalculcateX
ที่ทดสอบทุกอย่างเกี่ยวกับวิธีการ
สิ่งที่ TDD บอกคุณคือการคิดว่าโค้ดของคุณควรเป็นอย่างไร :
ฉันต้องคำนวณค่าที่ใหญ่กว่าของสองค่า ( กรณีทดสอบครั้งแรก! ) แต่ถ้า $ a มีขนาดเล็กกว่าศูนย์แล้วมันควรจะเกิดข้อผิดพลาด ( กรณีทดสอบที่สอง! ) และถ้า $ b มีขนาดเล็กกว่าศูนย์ก็ควร .... ( กรณีทดสอบที่สาม! ) และอื่น ๆ
คุณต้องการทดสอบพฤติกรรมไม่ใช่เพียงวิธีเดียวที่ไม่มีบริบท
ด้วยวิธีนี้คุณจะได้รับชุดทดสอบที่เป็นเอกสารสำหรับรหัสของคุณและจริงๆแล้วจะอธิบายสิ่งที่คาดว่าจะทำอาจเป็นเพราะเหตุใด :)
คุณจะตัดสินใจเกี่ยวกับชิ้นส่วนของรหัสที่คุณสร้างการทดสอบหน่วยสำหรับได้อย่างไร
ทุกอย่างที่ลงท้ายด้วยที่เก็บหรือที่ใดก็ตามที่อยู่ใกล้กับการผลิตจำเป็นต้องมีการทดสอบ ฉันไม่คิดว่าผู้เขียนคำพูดของคุณจะไม่เห็นด้วยกับสิ่งที่ฉันพยายามที่จะระบุในข้างต้น
หากคุณไม่มีการทดสอบมันจะยากขึ้น (แพงกว่า) ในการเปลี่ยนรหัสโดยเฉพาะอย่างยิ่งถ้าคุณไม่ทำการเปลี่ยนแปลง
TDD เป็นวิธีที่จะทำให้แน่ใจว่าคุณมีการทดสอบทุกอย่าง แต่ตราบใดที่คุณเขียนการทดสอบมันก็โอเค มักจะเขียนพวกเขาในวันเดียวกันช่วยเพราะคุณจะไม่ทำมันในภายหลังใช่มั้ย :)
การตอบสนองต่อความคิดเห็น:
ไม่สามารถทดสอบจำนวนวิธีที่เหมาะสมภายในบริบทเฉพาะเนื่องจากขึ้นอยู่กับหรือขึ้นอยู่กับวิธีอื่น
มีสามสิ่งที่วิธีการเหล่านั้นสามารถโทรได้:
วิธีการสาธารณะของชั้นเรียนอื่น ๆ
เราสามารถเยาะเย้ยชั้นเรียนอื่น ๆ เพื่อให้เราได้กำหนดรัฐที่นั่น เราอยู่ในการควบคุมของบริบทเพื่อไม่ให้มีปัญหา
* วิธีการป้องกันหรือส่วนตัวในเดียวกัน *
สิ่งใดก็ตามที่ไม่ได้เป็นส่วนหนึ่งของ API สาธารณะของคลาสจะไม่ได้รับการทดสอบโดยตรง
คุณต้องการที่จะมีพฤติกรรมการทดสอบและการไม่ดำเนินการและถ้าชั้นไม่ทั้งหมดของมันในการทำงานในวิธีสาธารณะขนาดใหญ่หรือในหลาย ๆ วิธีการป้องกันที่มีขนาดเล็กที่ได้รับการเรียกว่าการดำเนินงาน คุณต้องการที่จะเปลี่ยนวิธีการป้องกันเหล่านั้นโดยไม่ต้องสัมผัสการทดสอบของคุณ เพราะการทดสอบของคุณจะแตกถ้ารหัสของคุณเปลี่ยนพฤติกรรมการเปลี่ยนแปลง! นั่นคือสิ่งที่การทดสอบของคุณมีเพื่อบอกคุณเมื่อคุณทำลายบางสิ่งบางอย่าง :)
วิธีสาธารณะในชั้นเรียนเดียวกัน
มันไม่ได้เกิดขึ้นบ่อยนักหรอกเหรอ? และถ้ามันไม่ชอบในตัวอย่างต่อไปนี้มีวิธีการจัดการนี้ไม่กี่:
$stuff = new Stuff();
$stuff->setBla(12);
$stuff->setFoo(14);
$stuff->execute();
ว่าตัวตั้งค่ามีอยู่และไม่ได้เป็นส่วนหนึ่งของลายเซ็นวิธีการดำเนินการเป็นอีกหัวข้อหนึ่ง;)
สิ่งที่เราสามารถทดสอบได้ที่นี่คือถ้าการกระทำเกิดขึ้นเมื่อเราตั้งค่าผิด นั่นsetBla
เป็นข้อยกเว้นเมื่อคุณผ่านสตริงสามารถทดสอบแยกกัน แต่ถ้าเราต้องการทดสอบว่าทั้งสองค่าที่อนุญาต (12 & 14) ไม่ทำงานด้วยกัน (ด้วยเหตุผลใดก็ตาม) กว่ากรณีทดสอบหนึ่งกรณี
หากคุณต้องการชุดทดสอบ "ดี" คุณสามารถเพิ่ม@covers Stuff::execute
คำอธิบายประกอบเพื่อให้แน่ใจว่าคุณสร้างรหัสครอบคลุมสำหรับวิธีนี้เท่านั้นและสิ่งอื่น ๆ ที่เป็นเพียงการตั้งค่าจะต้องทำการทดสอบแยกต่างหาก (อีกครั้งหาก คุณต้องการสิ่งนั้น).
ประเด็นก็คือ:บางทีคุณอาจต้องสร้างโลกรอบข้างก่อน แต่คุณควรจะสามารถเขียนกรณีทดสอบที่มีความหมายซึ่งโดยปกติจะมีเพียงหนึ่งหรือสองฟังก์ชันจริงเท่านั้น (ผู้ตั้งค่าไม่นับที่นี่) ส่วนที่เหลือสามารถเยาะเย้ยไปหรือทดสอบก่อนแล้วพึ่งพา (ดู@depends
)
* หมายเหตุ: คำถามถูกโยกย้ายจาก SO และเริ่มแรกเกี่ยวกับ PHP / PHPUnit นั่นเป็นสาเหตุว่าทำไมโค้ดตัวอย่างและการอ้างอิงมาจาก php world ฉันคิดว่านี่ใช้ได้กับภาษาอื่นด้วยเนื่องจาก phpunit ไม่แตกต่างจาก xUnit อื่นมากนัก กรอบการทดสอบ