ฉันจะเสนอราคางานด้วย PHPUnit ได้อย่างไร


9

ฉันทำโปรแกรมเว็บไซต์เป็นเวลา 15 ปีและ PHP ในช่วง 5 ปีที่ผ่านมา ฉันเขียนโค้ดที่มั่นคงเสมอ อย่างไรก็ตามฉันมีไคลเอนต์ที่ยืนยันใน 80% ของรหัสการทดสอบหน่วย เนื่องจากไคลเอนต์นั้นถูกต้องฉันจึงวางแผนที่จะใช้ PHP_CodeSniffer เพื่อให้แน่ใจว่าโค้ดของฉันถูกต้องและ PHPUnit ทำการทดสอบหน่วยของฉัน ฉันหวังว่าจะได้เรียนรู้บางสิ่งผ่านประสบการณ์นี้

นี่เป็นเครื่องมือที่เหมาะสมที่จะใช้หรือไม่? มีเวลาเท่าไรในการตั้งค่า PHPUnit และเขียนรหัสเพิ่มเติม? ฉันควรใช้เวลาประมาณ 8 สัปดาห์ในการเขียนเว็บเพจและทดสอบตัวเองเหมือนที่เคยทำในอดีต ถ้าฉันเพิ่มอีก 4 วัน (10%) สำหรับการทดสอบหน่วย (PHPUnit) นั่นเพียงพอหรือไม่ คิด? ข้อเสนอแนะ? ขอบคุณ


2
การทดสอบหน่วยสามารถเพิ่มเวลาการพัฒนาเป็นสองเท่า

คุณทำงานกับ PHP 2.0 หรือไม่ ดี! การป้อนข้อมูลของฉันไม่ได้มีสิทธิ์ได้รับคำตอบสั้น ๆ : สำหรับตัวเลือกเครื่องมือที่คุณใช้กับ imho เห็นฉันใช้เวลาในกรอบการทดสอบ phpและ phpcs ฉันไม่รู้จักทางเลือกใด ๆ สำหรับเวลาที่จะเพิ่ม: หลังจากทำ TDD บางครั้งฉันมักจะช้าลงโดยไม่มีมัน แต่เมื่อฉันเริ่มต้นบางสิ่งก็จะนานขึ้น (+ 50%) หากคุณใช้เฟรมเวิร์กที่ทำให้การทดสอบยาก (สิ่งคงที่จำนวนมาก) เพิ่มมากขึ้น
edorian

1
มันจะเพิ่มการพัฒนาครั้งแรก แต่ในโครงการ 8 สัปดาห์คุณจะพบว่ามันสร้างความแตกต่างน้อยลงเนื่องจากการทดสอบหน่วยจะช่วยให้คุณค้นพบข้อบกพร่องได้เร็วขึ้นและง่ายขึ้น
เฟนตัน

1
@ Dragon, kinda, แต่การทดสอบหน่วยยังเพิ่มความเร็วในการพัฒนา [มีการปรับใช้ / ทดสอบ / ค้นหา \ fix cycles น้อยกว่ามาก
พระภิกษุสงฆ์

คำตอบ:


7

ในหนึ่งบรรทัด: มันขึ้นอยู่กับว่าคุณทำงานอย่างไร ฉันคิดว่า 10% น้อยเกินไป ควรมีอย่างน้อย 25% หากไม่ใช่ 40% หากไม่ใช่ 60% หากไม่มากขึ้น

ก่อนอื่นฉันเห็นด้วยอย่างยิ่งกับลูกค้าของคุณที่นั่น การทดสอบหน่วยเป็นส่วนสำคัญของผลิตภัณฑ์ที่มีความทนทานบำรุงรักษาง่ายแก้ปัญหาได้ง่าย

ฉันจะพูดจากสิ่งที่ฉันรู้ ฉันใช้ TDD (การทดสอบพัฒนาขับเคลื่อน) สำหรับโครงการส่วนใหญ่ โดยทั่วไปแล้ว TDD จะทำให้คุณเขียนการทดสอบก่อนรหัสจริง พวกเขาสร้างชุดของเกณฑ์การยอมรับที่ผลิตภัณฑ์สุดท้ายต้องพบ โดยปกติคุณจะใช้เวลา 50% ถึง 70% ของการทดสอบการเขียนเวลาของคุณและส่วนที่เหลือเพื่อใช้รหัสเพื่อให้ผ่านการทดสอบ

แม้ว่ามันอาจฟังดูไร้สาระและ / หรือมีขนาดใหญ่ แต่ฉันก็สามารถรับรองได้ว่ามันไม่ใช่ นี่คือเหตุผล:

  • คุณจะสามารถคิดได้ว่ารูปแบบสถาปัตยกรรมที่ดีที่สุดที่ใช้ในขณะที่เขียนการทดสอบคืออะไร ด้วยวิธีนี้เมื่อคุณเริ่มเขียนโค้ดสถาปัตยกรรมแอปพลิเคชันจะเปลี่ยนเพียงเล็กน้อย (เพราะเราทุกคนรู้ว่ามันแพงแค่ไหนในการทำซ้ำสถาปัตยกรรมแอปพลิเคชัน)
  • คุณรหัสเท่านั้นที่จะทำให้การทดสอบผ่าน (จึงทำให้ผลิตภัณฑ์สุดท้ายที่ยอมรับได้) คุณจะไม่ใช้เวลาเขียนโปรแกรมคุณสมบัติไร้ประโยชน์ / ไม่อยู่ในขอบเขต
  • โดยมีรหัสน้อย (เช่น: รหัสเท่านั้นที่คุณต้องการจริง ๆ ) มันมีข้อผิดพลาดน้อยลง (รหัสน้อย = ข้อผิดพลาดน้อยลง)
  • หากคุณทำผิดและคุณจะต้องใช้เวลาน้อยกว่ามากในการค้นหาสาเหตุที่มีปัญหาและปัญหาอยู่ที่ใด หากการทดสอบถูกเขียนอย่างถูกต้องแสดงว่าข้อผิดพลาดเพียงครั้งเดียวจะทำให้เกิดความล้มเหลวเดียวไม่ใช่ปฏิกิริยาลูกโซ่ วิธีนี้คุณสามารถระบุแหล่งที่มาของปัญหาได้อย่างง่ายดายในเวลาไม่กี่นาทีหากไม่ใช่วินาที
  • จะใช้เวลาน้อยลงในการติดตั้งโค้ดจริงด้วยการทดสอบหน่วย ทันทีที่การทดสอบล้มเหลวคุณจะรู้ว่ามีบางอย่างผิดปกติ คุณไม่ต้องทำไปมากับลูกค้าเพื่อแก้ไขข้อบกพร่อง
  • ในที่สุดคุณจะต้องทำไปมากับลูกค้าเพื่อแก้ไขข้อบกพร่องเพราะไม่มีอะไรสามารถจับข้อผิดพลาด 100% อย่างไรก็ตามคุณสามารถจับ 95% ถ้าไม่มากขึ้น

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


5

อุปกรณ์ประกอบฉากสำหรับคุณที่มีทัศนคติว่าคุณจะได้เรียนรู้บางสิ่งจากประสบการณ์นี้ ฉันแน่ใจว่าคุณจะ

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

Bill Venners:คุณพูดใน Refactoring หนังสือของคุณ: "ถ้าคุณต้องการ refactor เงื่อนไขที่สำคัญคือการทดสอบที่หนักแน่น" หมายความว่าถ้าคุณไม่มีการทดสอบคุณไม่ควรปรับโครงสร้างอีกครั้ง

Martin Fowler:คุณควรคิดว่ามันเป็นการเดินไต่เชือกโดยไม่ต้องมีตาข่าย หากคุณเก่งในการเดินไต่เชือกและมันไม่สูงมากนักคุณอาจลอง แต่ถ้าคุณไม่เคยเดินไต่เชือกมาก่อนและมันอยู่เหนือน้ำตกไนแองการ่าคุณอาจต้องการตาข่ายที่ดี

จากhttp://www.artima.com/intv/refactorP.html

ฉันเคยเขียน PHP โดยไม่มีการทดสอบหน่วย หลังจากนั้นหลายปีที่ฝึกการทดสอบหน่วยใน Java ฉันพบว่าฉันไม่สามารถทำงานอะไรที่ซับซ้อนกว่า PHP ในหน้าเดียวโดยไม่ต้องทำการทดสอบหน่วย เหตุผล? ผลผลิต หากไม่มีการทดสอบหน่วยฉันไม่สามารถ refactor ด้วยความมั่นใจ - นั่นหมายความว่าA)ฉันจะต้องทรุดตัวลงและทำงานทุกอย่างตั้งแต่ต้นอีกครั้งหรือB)ฉันต้องจัดการกับรหัสที่น่าเกลียด

เมื่อคุณทำการประมูลคุณต้องคำนึงถึงเวลาในการทดสอบหรือไม่ ใช่แล้ว ดูเหมือนว่าใช้งานง่ายที่จะใช้เวลามากขึ้น ? ใช่อีกครั้ง คุณอาจจะเนื่องจากคำตอบอื่น ๆ ประมาณคร่าว ๆ จำเป็นต้องประมาณ50-100%สูงกว่าโดยไม่มีการทดสอบหน่วย

อย่างไรก็ตาม ...

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

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

หากไม่มีการทดสอบการประมาณการของคุณน่าจะเป็นสิ่งที่ต้องทำ บั๊กคำสั่งการเปลี่ยนแปลงและการกำหนดนิยามใหม่นั้นน่ากลัวสำหรับการประเมินอย่างแม่นยำ การทดสอบเป็นกุญแจสำคัญในการลดผลกระทบของทั้งสามให้น้อยที่สุด!


3

ไม่มีคำตอบง่ายๆว่าจะใช้เวลานานเท่าใด

แต่ตามหลักการแล้วถ้าเป็นโครงการสั้น ๆ : ฉันจะบอกว่าการพัฒนาร่วมกับการทดสอบหน่วยที่ดีจะใช้เวลา 1.75-2 เท่าในการพัฒนาโดยไม่ต้องทดสอบหน่วย สำหรับโครงการที่ยาวขึ้นอาจจะ 25-30%?

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

สำหรับ PHPUnit .... มันผ่านมานานแล้วที่ฉันใช้มันความประทับใจของฉันคือมันทรงพลัง แต่อาจจะต้องการงานเพิ่มก่อนที่มันจะขัดมันจริงๆ

หากมีสิ่งหนึ่งที่ฉันต้องการสื่อสารที่นี่: กรุณาอย่าเห็นการทดสอบหน่วยเป็นทางการเพียงท้ายโครงการของคุณ ถ้านั่นคือทั้งหมดที่ฉันคิดว่ามันไร้ค่า


3

คำตอบที่ได้ค่อนข้างละเอียดดังนั้นฉันจะเพิ่มจุดหนึ่งที่ไม่ครอบคลุม: เวลาพิเศษเนื่องจากการใช้ PHPUnit จะเป็น

  1. สูงขึ้นในตอนแรกเนื่องจากคุณกำลังเรียนรู้และ
  2. ลดเวลาในการพัฒนาที่ไม่ใช่การทดสอบเมื่อคุณได้รับความมั่นใจ

คลาสโมเดลการทดสอบหน่วยที่ไม่เกี่ยวข้องกับงานนำเสนอนั้นค่อนข้างตรงไปตรงมา คุณเขียนการทดสอบสำหรับแต่ละคลาสและในกรณีทดสอบเหล่านั้นคุณสามารถสร้างอินสแตนซ์และกำหนดค่าวัตถุสำหรับการทดสอบวิธีการ / คุณสมบัติเฉพาะได้โดยตรง เมื่อคุณติดตั้งและใช้งาน PHPUnit แล้วคุณจะสามารถทำการทดสอบเหล่านี้ได้อย่างรวดเร็ว

หน้าทดสอบหน่วยอาจมีความยุ่งยากมากขึ้น ถ้าคุณใช้ Zend Framework, Symfony, Smarty หรือเอนจิ้น MVC อื่น ๆ การรับ PHPUnit ให้เล่นอย่างสวยงามกับพวกมันอาจต้องใช้เวลามากขึ้น เราใช้ Zend Framework และฉันใช้เวลาสร้างคลาสพื้นฐานจำนวนมากสำหรับการทดสอบคอนโทรลเลอร์และดูสคริปต์แบบแยก ControllerTestCaseด้วยขนาดของโครงการนี้คุณอาจจะดีกว่าที่เริ่มต้นด้วย

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