ฉันจะเริ่มต้นโครงการจริงของฉันในRuby on Railsและฉันบังคับให้ฉันต้องเขียนการทดสอบTDD ฉันไม่เห็นข้อได้เปรียบที่แท้จริงในการเขียนการทดสอบ แต่เนื่องจากดูเหมือนว่าสำคัญมากฉันจะลอง
จำเป็นต้องทดสอบทุกส่วนของแอปพลิเคชันของฉันรวมถึงหน้าสแตติกหรือไม่
ฉันจะเริ่มต้นโครงการจริงของฉันในRuby on Railsและฉันบังคับให้ฉันต้องเขียนการทดสอบTDD ฉันไม่เห็นข้อได้เปรียบที่แท้จริงในการเขียนการทดสอบ แต่เนื่องจากดูเหมือนว่าสำคัญมากฉันจะลอง
จำเป็นต้องทดสอบทุกส่วนของแอปพลิเคชันของฉันรวมถึงหน้าสแตติกหรือไม่
คำตอบ:
TDD ไม่ได้เกี่ยวกับการทดสอบ แต่เป็นการออกแบบ การเขียนแบบทดสอบจะบังคับให้คุณคิดว่าคลาสควรทำงานอย่างไรและอินเทอร์เฟซแบบไหนที่คุณต้องการ การทดสอบเป็นผลข้างเคียงที่มีความสุขซึ่งทำให้ง่ายต่อการปรับโครงสร้างในภายหลัง
ดังนั้นเมื่อทราบแล้วพฤติกรรมของหน้าสแตติกคืออะไรและอินเทอร์เฟซคืออะไร
คำตอบแรกของฉันคือ "none" และ "none"
เป็นการวิเคราะห์ต้นทุนและผลกำไรเสมอ ค่าใช้จ่ายของคุณลักษณะทำลายคุณคืออะไร? หากค่าใช้จ่ายสูงให้ทดสอบอย่างละเอียดและทั่วถึง หากราคาต่ำทดสอบเบา ๆ หรือไม่เลย
นอกจากนี้ยังมีค่าใช้จ่ายในการพิจารณาตลาดอีกด้วย อาจเป็นการดีกว่าสำหรับคุณที่จะส่งมอบฟีเจอร์ที่ใช้งานได้เป็นส่วนใหญ่แทนที่จะเป็นการส่งมอบฟีเจอร์การทำงานที่สมบูรณ์
แทบเป็นไปไม่ได้เลยที่จะตอบคำถามเหล่านี้ใน IMO ทั่วไป
ฉันคิดว่ามันสำคัญกว่าที่จะรักษาความสามารถในการทดสอบในกรณีที่คุณลักษณะบางอย่างกลายเป็นสิ่งที่สำคัญกว่าที่คุณรับรู้
ฉันจะพูดว่า "ใช่" หากคุณมีการทดสอบที่ครอบคลุมถึงฟีเจอร์และโค้ดที่ง่ายที่สุดคุณสามารถมั่นใจได้ว่าการเพิ่มโค้ดใหม่ไม่ได้ทำให้โค้ดแบบแทนที่ไม่ทำงาน ในทำนองเดียวกันการทดสอบข้อผิดพลาดทุกครั้งที่คุณพบจะทำให้การถอยหลังไม่ถอยกลับ
ใช่คุณควรทดสอบทุกอย่าง ...
คุณไม่จำเป็นต้องเขียนแบบทดสอบอัตโนมัติสำหรับทุกสิ่ง สำหรับหน้าเว็บสแตติกของคุณให้ดูที่การใช้ Selenium http://seleniumhq.org/เพื่อให้แน่ใจว่าสิ่งต่าง ๆ นั้นถูกต้อง
จากประสบการณ์ของฉันบางสิ่งที่อยู่ข้างหน้าเป็นไปไม่ได้ที่จะเขียนกรณีทดสอบสำหรับ แต่นั่นคือเหตุผลที่คุณต้องการทดสอบโดยใช้ดวงตาลูกมาร์ค 1
การทดสอบมีความสำคัญเท่าการเข้ารหัส คุณต้องได้ยินคำพูดที่ว่า "ถ้ามีอะไรผิดพลาดมันจะ" INMO จากเทคนิคมากมายของวิศวกรรมซอฟต์แวร์ที่ใช้เพื่อเพิ่มคุณภาพการทดสอบเป็นหนึ่งในวิธีที่มีค่าที่สุดในการช่วยคุณค้นหาปัญหาก่อน
ในขณะที่การทดสอบทุกอย่างเป็นไปไม่ได้ (โดยเฉพาะกับทีมขนาดเล็กและระบบขนาดใหญ่) แต่ก็ไม่ได้หมายความว่าคุณจะข้ามการทดสอบทั้งหมด การทดสอบคุ้มค่าหรือไม่ ดูส่วน "ค้นหาความผิดพลาดในช่วงต้น" ในโปรดดูที่วิกิพีเดียการทดสอบซอฟต์แวร์
การทดสอบ TDD อาจเป็นข้อกำหนดเฉพาะหากมีการเขียนเช่นนั้น ชื่อของวิธีการทดสอบควรสมเหตุสมผลกับผู้ใช้ทางธุรกิจ
ดังที่คนอื่น ๆ พูดถึงในการทดสอบ Ruby on Rails มันมีความสำคัญมากกว่าภาษาอื่น ๆ นี่คือสาเหตุที่ขาดคอมไพเลอร์
ภาษาเช่นDelphi , C ++, VB.NET , ฯลฯ ... เป็นภาษาที่คอมไพล์และคอมไพเลอร์ของคุณจะรับความผิดพลาดจำนวนมากเช่นความผิดพลาดในการโทรไปยังเมธอด ใน Ruby on Rails คุณจะรู้ว่ามีการพิมพ์ผิดหรือผิดพลาดในรหัสของคุณหากมีการเรียกใช้บรรทัดของรหัสนั้นหรือคุณใช้ IDE ที่แสดงคำเตือนแบบภาพ
เนื่องจากโค้ดแต่ละบรรทัดมีความสำคัญ (ไม่อย่างนั้นจะไม่มี) คุณควรทดสอบทุกวิธีที่คุณเขียน นี่ง่ายกว่าฟังก์ชั่นพื้นฐานถ้าคุณทำตามเครื่องมือ TBDD พื้นฐาน
ฉันพบว่าไรอันเบตส์Rails Castบนฉันทดสอบเป็นที่ทรงคุณค่าให้ฉันและมันไฮไลต์ความเรียบง่ายของ TBDD ถ้าทำอย่างถูกต้อง
หากคุณใช้วิธีการของ TDD อย่างแท้จริงคุณจะไม่ต้องเขียนรหัสโดยไม่ต้องทำการทดสอบหน่วยก่อนที่คุณจะพยายามผ่าน
ฉันจะบอกว่าจะไม่เริ่มต้นด้วย TDD ตัดสินใจอย่างมีข้อมูลเมื่อคุณใช้เวลาในการเรียนรู้กลยุทธ์สถาปัตยกรรมโดยทั่วไปมากขึ้น TDD จะไม่ยอมให้คุณข้ามการบ้านนั้นไปแม้ว่าคุณจะเริ่มเชื่อว่ามันเป็นเช่นนั้น
นี่คือปัญหาของฉันกับมัน เมื่อคุณบอกว่าดูเหมือนว่าจะเสียเวลาไปกับสิ่งต่าง ๆ มากมายที่จะไม่ทำลาย TDDers บอกว่าคุณจะประทับใจเมื่อสิ่งหนึ่งที่คุณไม่ได้คาดหวังจากการพึ่งพาของโซ่ขนาดใหญ่ก็ถูกจับ เมื่อคุณชี้ให้เห็นว่าเป็นไปไม่ได้ที่จะคาดเดาสิ่งต่าง ๆ ก่อนที่คุณจะเขียนแอปของคุณซึ่งเป็นเอ่อ ... ทำไมเราทดสอบพวกเขาบอกคุณว่ามันเป็นเรื่องของการออกแบบมากกว่าและไม่ทดสอบแม้ว่าการทดสอบจะมีประโยชน์
แต่โซ่ยักษ์ใหญ่ของการพึ่งพาการเชื่อมโยงที่คาดเดาไม่ได้เป็นผลิตภัณฑ์ของการออกแบบเส็งเคร็ง?
แล้วมันคืออะไร?
นี่คือความคิด อย่าให้มีการพึ่งพากันอย่างซับซ้อนในตอนแรกโดยพิจารณาจากหลักการสองประการของการออกแบบเชิงวัตถุจากรูปแบบการออกแบบ:
"โปรแกรมไปยังส่วนต่อประสานไม่ใช่การใช้งาน"
กล่าวคือวัตถุของคุณไม่ควรสนใจว่าใครกำลังโทรหรือทำอย่างไร เฉพาะส่วนที่ถูกป้อนเข้ามาและวิธีการที่พวกเขาเรียกจากวัตถุอื่น ๆ ที่พวกเขาถูกสั่งให้ทำงานตามที่คาดไว้ ห่วงโซ่การพึ่งพาของคุณในกรณีส่วนใหญ่ควรอยู่ที่จุดเชื่อมโยงจุดหนึ่งการเรียกใช้เมธอดในส่วนของผู้โทรและจุดที่ args เข้าสู่เมธอดของคุณ นั่นคือสิ่งที่คุณเข้าสู่ระบบและตรวจสอบและส่งข้อความที่มีประโยชน์สำหรับการแก้ปัญหาเมื่อสิ่งที่อึออก
และ:
"ชอบองค์ประกอบของวัตถุเหนือการสืบทอดคลาส"
ใครบ้า ๆ บอ ๆ ? ผู้ชายที่ทำบางสิ่งบางอย่างกับชั้นเรียนในรูปแบบการสืบทอดแบบสลับซับซ้อนที่เกี่ยวข้องกับชั้นเรียน 30 ชั้นทำให้เกิดการแตกของคดีหรือผู้ที่มากับสถาปัตยกรรมในตอนแรก? TDD อาจช่วยให้คุณไปถึงจุดต่ำสุดของปัญหาภายในหอเอนของปิซาได้เร็วกว่าที่คุณจะทำได้โดยไม่ต้องทำ แต่มันทำให้เจ็บปวดน้อยกว่าที่จะพยายามแก้ไขจุดปลายของหายนะรหัสในครั้งต่อไปหรือไม่?
และนั่นคือสิ่งที่ฉันได้รับในสิ่งที่ทำให้ฉันเป็นโรคจิต TDD ช่วยออกแบบหรือใช้สถาปัตยกรรมที่ไม่ดีจริง ๆ หรือไม่? ดูเหมือนว่าฉันจะมีศักยภาพที่จะเป็นกลยุทธ์การตอบสนองด้วยตนเอง ยิ่งทีมของคุณไม่ต้องรับผิดชอบต่อสถาปัตยกรรมที่ไม่ดีเท่าไหร่ส่วนประกอบการทดสอบที่ละเอียดยิ่งขึ้นก็ดูเหมือนว่าจะมีประโยชน์ แต่ท้ายที่สุดแอปของคุณจะกลายเป็น PITA ที่ใหญ่ขึ้นเรื่อย ๆ ในการทำงาน (สมมติว่าพวกเขาไม่เคยคิดมาก สถานที่). และความล้มเหลวในการรับทราบผลที่ตามมาคือความผิดพลาดที่แพงที่สุดที่คุณสามารถทำได้เมื่อทำงานกับแอปพลิเคชันที่ต้องการอัพเกรดและแก้ไขเมื่อเวลาผ่านไป
หากต้องการตอบคำถามให้คิดเกี่ยวกับ "สิ่งที่อาจผิดพลาดได้ที่นี่" โดยเฉพาะอย่างยิ่งหากคุณเปลี่ยน "รหัส" (มาร์กอัป / อะไรก็ตาม) คุณจะมั่นใจได้อย่างไรว่าคุณไม่ได้หักหน้า สำหรับหน้าสแตติก:
ส่วนตัวผมขอแนะนำ:
การไปที่นี่คือคุณต้องการบางสิ่งที่สามารถทำซ้ำได้ใช้งานง่ายและจะทำงานโดยอัตโนมัติในนักทดสอบของคุณ
เพียงเพิ่มคำตอบที่ยอดเยี่ยมทั้งหมดแล้วนี่คือความคิดของฉันเกี่ยวกับสิ่งที่จะทดสอบและสิ่งที่ไม่ทดสอบ:
ทำแบบทดสอบ:
อย่าทดสอบ:
ดังนั้นจึงไม่มีประเด็นที่จะมีการทดสอบที่บอกว่า:
assert wibble = 3
และรหัสบางอย่างที่บอกว่า
wibble = 3
และยังไม่มีประเด็นในการทดสอบสิ่งที่นำเสนอเช่นว่าไอคอนเป็นสีน้ำเงิน perywinkle ตัวอักษรที่คุณใช้สำหรับส่วนหัวและอื่น ๆ ...
ดังนั้นคุณถามว่า "ฉันควรทดสอบหน้าคงที่" และคำตอบคือ: คุณทดสอบพวกเขาตราบเท่าที่พวกเขาเป็นส่วนหนึ่งของการทำงานของเว็บไซต์ตรรกะทางธุรกิจหรือพฤติกรรมของคุณ
ดังนั้นในแอปของเราเรามีการทดสอบที่ตรวจสอบว่าข้อกำหนดและเงื่อนไขพร้อมใช้งานจากทุกส่วนของเว็บไซต์ - สำหรับผู้ใช้ที่ไม่ระบุชื่อสำหรับผู้ใช้ที่เข้าสู่ระบบจากแผงควบคุมภายในหน้าจอแอป ฯลฯ เพียงตรวจสอบว่ามี ลิงก์ที่เรียกว่า "ข้อกำหนดและเงื่อนไข" ในแต่ละหน้าว่าลิงก์ใช้งานได้และจากนั้นการทดสอบก็บอกว่าเมื่อมันมาถึงหน้าเว็บมัน "ดูเหมือนว่า" Ts & Cs - เพียงพอที่จะทำให้คุณมั่นใจว่ามันเป็นหน้าที่ถูกต้อง โดยไม่ต้อง "ทดสอบค่าคงที่" หรือ "ทดสอบงานนำเสนอ" ... ดังนั้นคุณสามารถตรวจสอบว่าข้อความนั้นถูกต้องตัวอย่างเช่นโดยไม่ตรวจสอบขนาดตัวอักษรหรือรูปแบบข้อความโดยเฉพาะ ...