การพัฒนาขับเคลื่อนทดสอบข้ามภาษา


9

คำถามสั้น ๆ : คุณติดตามการพัฒนาที่ขับเคลื่อนด้วยการทดสอบในโครงการที่ครอบคลุมหลายภาษาได้อย่างไร

โดยเฉพาะฉันเขียนเว็บแอปพลิเคชันที่ใช้ JavaScript และ PHP และฉันต้องการที่จะปฏิบัติตามหลักการ TDD แต่ฉันไม่แน่ใจว่าจะรวมพวกเขาได้อย่างไร ฉันจะรันชุดทดสอบแยกต่างหากสำหรับส่วน JS และ PHP และใช้ mocks ในชุด JS เพื่อจำลองการตอบสนองของเซิร์ฟเวอร์หรือไม่ มีเทคนิคสำหรับการทดสอบหน่วยทั้งสองส่วนประกอบในการทดสอบครั้งเดียวหรือไม่?

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

ฉันกำลังเขียนการทดสอบ PHP ของฉันใน SimpleTest และการทดสอบ JavaScript ของฉันใน JsTestDriver ฉันคุ้นเคยกับกระบวนทัศน์เชิงวัตถุดังนั้นฉันจึงมีบางคลาสใน PHP และฉันทำสิ่งที่คล้ายกันใน JavaScript โดยใช้การสืบทอดต้นแบบ ฉันก็เริ่มอ่านหนังสือเล่มนี้เกี่ยวกับ TDD ใน Pythonและหนังสือเล่มนี้เกี่ยวกับ TDD ใน JavaScriptแต่จากสิ่งที่ฉันได้เห็นสิ่งเหล่านี้ไม่ได้อธิบายการทดสอบแอปพลิเคชันแบบเต็ม (นอกการใช้บางอย่างเช่น Selenium หรือไดรเวอร์เว็บอื่น เพื่อทำการทดสอบการยอมรับแบบ Front-end TDD เป็นเพียงแค่ไม่ตัดออกสำหรับนักพัฒนาเต็มกอง?


1
เว้นแต่คุณจะถูกบังคับให้ใช้ SimpleTest ฉันขอแนะนำให้เปลี่ยนเป็น PHPUnit SimpleTest ดูเหมือนจะไม่แอคทีฟมากและล่าช้าเล็กน้อยเมื่อพูดถึงการเยาะเย้ยและการครอบคลุมโค้ด
Cerad

คำตอบ:


9

มีเทคนิคสำหรับการทดสอบหน่วยทั้งสองส่วนประกอบในการทดสอบครั้งเดียวหรือไม่?

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

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


3

สิ่งที่สำคัญคือการแยกแยะระหว่าง TDD และATDD AT นั้นหมายถึง " การทดสอบการยอมรับ " และนี่หมายถึงการพัฒนาที่คุณเริ่มต้นด้วยการทดสอบการยอมรับซึ่งมีแนวโน้มที่จะทดสอบสแต็กทั้งหมด บางครั้งเรียกว่า "การพัฒนาภายนอกทดสอบการขับเคลื่อน" เมื่อผู้คนพูดถึง TDD ตัว "T" นั้นอาจหมายถึงการทดสอบหน่วยโดยเฉพาะ

ส่วนสำคัญของการทดสอบหน่วยกำลังแยกหน่วยภายใต้การทดสอบจากการอ้างอิง สิ่งนี้ให้ประโยชน์ที่สำคัญสองประการแก่คุณ:

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

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

เนื่องจากความสำคัญของการแยกนี้คุณจะต้องการ จำกัด การทดสอบโดยอัตโนมัติในหน่วยที่เล็กกว่าขอบเขตภาษาของคุณ แม้ว่ามันจะไม่ใช่กฎที่ยากและรวดเร็ว แต่คุณมักจะคาดหวังให้ชั้นเรียนเดี่ยวเป็นหน่วยทดสอบ ดังนั้นในแง่ของ TDD ปัญหาภาษานั้นไม่เกี่ยวข้องมากหรือน้อย

หากในอีกทางหนึ่งคุณต้องการทำ ATDD ตรวจสอบให้แน่ใจว่าคุณมองหาทรัพยากรสำหรับสิ่งนี้โดยเฉพาะ (มันมักจะทำในฐานะส่วนหนึ่งของ BDD ดังนั้นให้ดูเครื่องมือที่มีเป้าหมายเช่นนั้นด้วย) นี่คือสิ่งที่ซีลีเนียมจะพอดีตามธรรมชาติโดยปกติเมื่อทำ ATDD คุณยังคงเขียนการทดสอบหน่วยและในความเป็นจริงเพื่อผ่านการทดสอบการยอมรับแต่ละครั้งคุณอาจทดสอบการใช้งานด้วยการทดสอบหน่วย ดังนั้นแม้ว่าคุณต้องการทำ ATDD การทำความเข้าใจวิธีเขียนการทดสอบหน่วยยังคงเป็นสิ่งสำคัญ


เยี่ยมมากฉันไม่เคยดู ATDD แต่ฉันคุ้นเคยกับ Behat และ Behave สำหรับ BDD ฉันขอขอบคุณข้อเสนอแนะ ยังคงพยายามที่จะตัดหัวของฉันรอบความคิดไมโครทดสอบของ TDD :)
คริสโอลเซ่น

@ChrisOlsen มีสองด้านที่จะทำให้คุณเข้าใจ: การทดสอบหน่วย (เทียบกับการรวมหรือการยอมรับ) และเมื่อคุณเขียน (ก่อนรหัสการผลิตมากกว่าหลัง) หากพวกเขาทั้งคู่ดูเหมือนจิตแปลก ๆ คุณสามารถลองจับกับคนที่หนึ่งก่อนที่สอง ผู้คนจำนวนมากไม่ได้ฝึก TDD แต่ยังคงยืนยันในการครอบคลุมการทดสอบหน่วยอย่างละเอียด
Ben Aaronson

1

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

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

ลุงบ๊อบอธิบายวิธีนี้ดีกว่าฉัน https://blog.8thlight.com/uncle-bob/2014/04/30/When-tdd-does-not-work.html

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