ทฤษฎี TDD เท่านั้น


29

น้อยกว่าหนึ่งปีที่ผ่านมาฉันโชคดีที่สามารถหยุดงานได้ 9 เดือน ฉันตัดสินใจว่าในเวลานั้นฉันจะฝึกฝนทักษะ C # ของฉัน ฉันเริ่มทำงานหลายโครงการและบังคับให้ตัวเองต้องติดตาม TDD

มันเป็นกระบวนการที่ค่อนข้างกระจ่างแจ้ง

มันยากในตอนแรก แต่เมื่อเวลาผ่านไปฉันเรียนรู้วิธีเขียนโค้ดที่ทดสอบได้มากขึ้น (ซึ่งกลายเป็นว่ามีแนวโน้มที่จะเป็นรหัสที่มั่นคงมากขึ้น) และในกระบวนการฉันก็เพิ่มทักษะการออกแบบ OO ของฉัน

ตอนนี้ฉันกลับมาทำงานแล้วและฉันสังเกตเห็นบางสิ่งแปลก ๆ

ฉันไม่ต้องการติดตาม TDD

ฉันพบว่า TDD ทำให้ฉันช้าลงและทำให้ยากต่อการออกแบบแอปพลิเคชั่นที่สะอาด

ฉันได้ใช้แนวทางที่แตกต่างเล็กน้อย (หนาแน่น) แทน

  1. เลือกชิ้นงานตามแนวตั้ง
  2. พัฒนาต้นแบบการทำงาน
  3. Refactor จนกว่าทุกอย่างจะดีและเป็นระเบียบ
  4. เอนหลังชื่นชมความสวยงามและรหัสที่ทดสอบได้ที่ฉันเขียน

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

ตอนนี้ฉันต้องการทำให้ชัดเจนว่าจริง ๆ แล้วฉันไม่ได้ทำการทดสอบใด ๆ รหัสที่ฉันกำลังเขียนนั้นใช้งานได้ มันทำงานได้เพราะฉันกำลังทดสอบด้วยตนเอง

ฉันต้องการทำให้ชัดเจนว่าฉันไม่ได้ทำการทดสอบอัตโนมัติทั้งหมดเช่นกัน นี่คือที่กระบวนการของฉันแตกต่าง และนี่คือเหตุผลที่ฉันถามคำถามนี้

ทฤษฎี TDD ไม่ได้อยู่ในทางปฏิบัติ

กระบวนการของฉันพัฒนาไปเล็กน้อยและฉันมีความสมดุลระหว่าง TDD และไม่มีการทดสอบที่ฉันพบว่ามีประสิทธิผลมากและปลอดภัยพอสมควร มันจะเป็นดังนี้:

  1. ใช้ชิ้นงานตามแนวตั้งที่ทำงานด้วยการทดสอบในใจ แต่ไม่ต้องเขียนการทดสอบใด ๆ
  2. หากลงที่ถนน (เช่นเดือนต่อมา) ชิ้นที่ต้องการแก้ไข
    1. เขียนการทดสอบหน่วยการทดสอบการรวมการทดสอบพฤติกรรมและอื่น ๆ ที่รับประกันว่าชิ้นงานนั้นถูกต้อง
    2. แก้ไขรหัส
  3. หากชิ้นส่วนนั้นไม่ต้องการการแก้ไข
    1. ไม่ทำอะไร

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

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

ดังนั้นฉันจะไปที่ [BT] DD นรกหรือนี่คือรูปแบบทั่วไปของการเข้ารหัสและการทดสอบในทางปฏิบัติ?

ฉันต้องการทำงานต่อไปอย่างนี้ ฉันจะทำอย่างไรเพื่อให้กระบวนการนี้ทำงานในระยะยาว

บันทึก:

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


2
ดูเหมือนว่ามีหนามแหลมและมีเสถียรภาพโดยไม่ต้องทำเสถียรภาพIf that slice doesn't need modificationเสมอ lizkeogh.com/2012/06/24/beyond-test-driven-development
RubberChickenLeader

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

5
ใช่และการทดสอบการเขียนก่อนอื่นต้องเพิ่มงานต้นแบบของคุณเป็นสองเท่า
Robert Harvey

3
มันหมายความว่าฉันโกหกว่ามันเป็น "เล็กน้อย"
MetaFight

1
"และเมื่อฉันเข้าใกล้การเขียนการทดสอบฉันเขียนได้น้อยกว่า แต่ครอบคลุมเกือบมาก (ROI ที่สูงขึ้น)" เมื่อคุณบอกว่าเขียนน้อยกว่ามากคุณหมายความว่าเพราะคุณทดสอบโค้ดเท่านั้น กำลังจะเปลี่ยนหรือคุณกำลังบอกว่าคุณกำลังครอบคลุมส่วนของรหัส (ทดสอบ) เดียวกันกับการทดสอบน้อยกว่าถ้าคุณใช้ TDD?
Ben Aaronson

คำตอบ:


6

เพื่อให้กระบวนการทำงานในระยะยาวฉันจะเขียนการทดสอบเมื่อมีการเขียนโค้ด

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

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

การออกจากสิ่งนี้ไปจนถึงภายหลังหมายความว่าความรู้ (ตามธรรมชาติ) จะลดน้อยลงเมื่อเวลาผ่านไป

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

ที่สำคัญที่สุด "บางวัน" อาจไม่มา คุณอาจถูกรถบัสชนหรือคุณอาจขึ้นรถบัสเพื่อการผจญภัยครั้งใหม่

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


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

แม้ว่าปัญหาคือพรุ่งนี้ไม่เคยมามีคุณสมบัติต่อไปเสมอ และคุณจะเลือกทำอะไร เขียนคุณสมบัติถัดไปหรือเขียนการทดสอบสำหรับสิ่งที่คุณเพิ่งจะ "เสร็จสิ้น"
Andy

9

แม้ว่า TDD นั้นยากที่จะใช้งาน 100% แต่มีข้อบกพร่องในแนวทางของคุณ

  1. ใช้งานชิ้นงานตามแนวตั้ง

    1.1 1 ปีผ่านไป ....

    1.2 ผู้พัฒนารายใหม่จะเริ่มทำงานในโครงการ

  2. ถ้าชิ้นนั้นต้องการการปรับเปลี่ยน

    2.3 การแยกวิเคราะห์ 'Clean Coding' ชื่อวิธีการและพารามิเตอร์ 'GetUnicorn (colourOfUnicorn)'

    2.4 อ่านความคิดเห็น xml 'รับยูนิคอร์นทองคำ (สำหรับการขี่) (obvs)'

    2.5 ตามล่าผู้พัฒนาดั้งเดิม

    2.6 หวังว่าพวกเขาจะจำรหัสที่ควรทำ

    2.7 ให้พวกเขาอธิบายทุกอย่าง

  3. เขียนการทดสอบหน่วยการทดสอบการรวมการทดสอบพฤติกรรมและอื่น ๆ ที่ หวังว่าจะรับรองว่าชิ้นงานนั้นถูกต้อง

  4. แก้ไขรหัส

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


2
เฮ้ฉันเขียนรหัสเอกสารเอง! ชั้นเรียนของฉันมีความรับผิดชอบเพียงอย่างเดียวและเข้าใจง่าย ไม่มีใครจะต้องตามล่าฉัน :)
MetaFight

7
@MetaFight และถ้าพวกเขาทำคุณจะง่ายต่อการมองเห็นด้านบนของยูนิคอร์นทองที่เป็นของแข็ง!
jonrsharpe

3
ฉันเรียกเขาว่า Goldicorn
MetaFight

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

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

4

ฉันเห็นด้วยกับทั้ง Daniel Hollinrake และ Ewan ว่าประเด็นสำคัญข้อแรกที่ว่าทำไมการทดสอบเพียงอย่างเดียวถ้าคุณปรับเปลี่ยนใช้งานได้ดีคือ:

I am the sole developer on my projects and I am responsible for everything

และนั่นคือจุดสำคัญที่สองที่เป็นไปได้:

you're producing nice clean code

ฉันไม่คิดว่า TDD จะเพิ่มประสิทธิภาพการทำงานอย่างมากสำหรับโปรแกรมเมอร์ แต่เพียงผู้เดียวและอาจไม่ปรับปรุงคุณภาพของรหัสของคุณอย่างมหาศาลหากคุณเขียนโค้ดที่ดีอยู่แล้ว

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

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


1
ฉันคิดว่าส่วนหนึ่งของปัญหาคืออาจมีเพียง 1 โปรแกรมเมอร์ แต่ฐานรหัสมักจะเติบโตเมื่อเวลาผ่านไปและสิ่งที่ใช้งานได้ (สำหรับการทดสอบ) เมื่อมันมีขนาดเล็กไม่ทำงานต่อไปเมื่อมันใหญ่ขึ้น
Michael Durrant

3

สำหรับฉันแล้วสิ่งสำคัญคือ:

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

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

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

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


ฉันจะบอกว่าชุดทดสอบจะมาในอันดับที่ 4 สำหรับการส่งต่อไปยัง devs อื่น ๆ - เอกสารความต้องการ, แผนภาพสถาปัตยกรรมและเอกสารการออกแบบจะมีความสำคัญมากกว่าในการสื่อสารเรื่องต่าง ๆ มากกว่าการทดสอบหน่วย
gbjbaanb

มันเป็นประเด็นที่ยุติธรรม แต่น่าเศร้าในประสบการณ์ของฉันในเกือบทุกโครงการที่ฉันทำงานเกี่ยวกับเอกสารเมื่อมันมีอยู่มันล้าสมัยหรือไม่สมบูรณ์
Daniel Hollinrake

1
เหมือนกันที่นี่ซึ่งเป็นเหตุผลที่ devs ควรตระหนักถึงความสำคัญของการจัดทำเอกสารและไม่เขียนโค้ดเพิ่มเติมในรูปแบบของการทดสอบ! บางทีเราอาจต้องใช้เครื่องมือเพื่ออนุญาตการสร้างเอกสารที่ดีกว่า (นั่นไม่ใช่เพียงการจัดรูปแบบของลายเซ็นวิธี) จากความคิดเห็นของโค้ดและตั๋วความต้องการ
gbjbaanb

ฉันได้แก้ไขคำตอบของคุณเล็กน้อยเพื่อตอบความคิดเห็นของคุณ ขอขอบคุณ.
Daniel Hollinrake

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

3

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

ปัญหาที่ฉันเห็นด้วยแบบฝึกการเขียนก่อนที่คุณจะเปลี่ยนแปลง:

ฉันมักจะต้องทำการเปลี่ยนแปลงอย่างเร่งด่วน

ในขณะที่คุณอาจประหยัดเวลาโดยรวมด้วยการเขียนการทดสอบเมื่อคุณต้องการ แต่ไม่เท่ากับเวลาทั้งหมด ใช้เวลา 2 ชั่วโมงในการเขียนการทดสอบเพื่อประหยัด 1 ชั่วโมงเมื่อฉันอยู่ในโหมดวิกฤติ - คุ้มค่าโดยสิ้นเชิง

ง่ายต่อการเขียนการทดสอบในเวลาเดียวกันกับที่ฉันเขียนรหัส

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


นิยามของ Michael Feathers ของรหัสดั้งเดิมคือรหัสโดยไม่มีการทดสอบ ไม่ว่าคุณจะเห็นด้วยกับคำจำกัดความของเขาหรือไม่ชัดเจนว่าค่าใช้จ่ายส่วนใหญ่ในการแก้ไขโค้ดที่มีอยู่นั้นทำให้แน่ใจว่ามันยังทำงานได้ตามที่คาดไว้บ่อยครั้งที่มันไม่ชัดเจนแม้แต่พฤติกรรมที่คาดหวังไว้

การเขียนหน่วยทดสอบชดเชยค่าใช้จ่ายโดยการเข้ารหัสความเข้าใจในสิ่งที่พฤติกรรมที่ถูกต้องเช่นเดียวกับการให้วิธีที่ง่ายสำหรับ "อนาคตพวกเรา" เพื่อตรวจสอบพฤติกรรมที่ยังคงถูกต้อง


2

นี่เป็นคำถามที่ดีและ FWIW ฉันจะโยนสองเซ็นต์ของฉัน

ประมาณหนึ่งปีที่ผ่านมาฉันเขียนโค้ดใน Salesforce ซึ่งเป็นแพลตฟอร์มที่มีกลไกฝังแน่นซึ่งบังคับให้คุณไม่จำเป็นต้องเขียนการทดสอบก่อนที่จะเขียนโค้ดแต่ค่อนข้างบังคับให้คุณเขียนการทดสอบโดยทั่วไป

วิธีการทำงานคือระบบจะบังคับให้คุณเขียนการทดสอบและจะทำการคำนวณจำนวนบรรทัดของโค้ดที่ทดสอบเป็นเปอร์เซ็นต์ หากรหัสทั้งหมดในอินสแตนซ์การผลิตของคุณต่ำกว่า 75% ทดสอบ .. Salesforce ไม่ทำงานอีกต่อไป

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

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

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

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

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

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


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

3
@ Calphool เราได้รวมสิ่งที่ทดสอบได้ง่าย ๆ เข้ากับภาษา! เราเรียกมันว่าการพิมพ์แบบคงที่ สนิมนำไปใช้เพิ่มเติมด้วยการตรวจสอบการยืมเพื่อทดสอบข้อบกพร่องมากยิ่งขึ้น แต่การทดสอบส่วนใหญ่มีความเฉพาะเจาะจงกับคลาสที่แน่นอนนั้น ("ถ้าฉันคลิกปุ่มวิดเจ็ตจะเปลี่ยนเป็นสีแดง") - คอมไพเลอร์ / IDE จะรู้ได้อย่างไรว่าคุณกำลังจะทดสอบมัน?
253751

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

1
Salesforce มีการทดสอบที่ผิดทั้งหมด: ทำให้ต้องมีการทดสอบ แต่ทำให้ยากต่อการเขียนการทดสอบคุณภาพ มันฟังดูดีในทางทฤษฎี แต่ในทางปฏิบัติมันทำให้นักพัฒนาต้องการที่จะขุดตาด้วยช้อน

1

ฉันไม่สามารถแนะนำวิธีการของคุณ

ถ้าฉันใช้วิธีการของคุณมันจะเป็นตัวอย่างเช่นต่อไปนี้ (บ้านเป็นแอปพลิเคชัน):

  1. ฉันเริ่มสร้างบ้านสำหรับครอบครัวของฉันในฐานะช่างก่ออิฐที่มีความรู้บางอย่างหรือเป็นผู้เริ่มต้น
  2. ฉันรู้ถึงข้อกำหนดเช่นห้องเด็กห้องพักและเริ่มสร้างบ้าน "ต้นแบบ" ของฉัน
  3. กว่าสองสามครั้งต่อมาบ้าน "ต้นแบบ" ของคุณก็เสร็จสิ้น
  4. ฉันเริ่มมองหาว่าโครงสร้างมีความเสถียรเพียงพอด้วยตนเอง ดังนั้นฉันจึงรับน้ำหนักมากและนำไปไว้ในห้องต่าง ๆ ในชั้นแรก เพื่อให้แน่ใจว่าเมื่อฉันนั่งในห้องกับครอบครัวเพดานไม่แตก แต่มันก็แตกและฉันก็เริ่มสร้างใหม่ ก่อนอื่นทำความสะอาดมวลให้หมด กว่าสร้างใหม่และทดสอบด้วยตนเองอีกครั้งจนกว่าจะเสถียรเพียงพอ
  5. มากกว่าที่ฉันจะย้ายเข้ามาอยู่กับครอบครัวของฉัน ทั้งหมดเป็นเรื่องปกติ
  6. มอดในเวลาต่อมาลูกพี่ลูกน้องและพ่อแม่ของฉันกำลังจะมาเยี่ยมพวกเรา แต่ก่อนที่พวกเขาจะสามารถเข้าไปในบ้านของเราพวกเขาต้องจ่ายสถาปนิกและวิศวกรโยธาเพื่อให้แน่ใจว่าเพดานจะไม่แตกเมื่อเรานั่งในห้องใดห้องหนึ่งในชั้นแรก
  7. สถาปนิกและวิศวกรโยธามีงานเยอะเพราะไม่มีอะไรต้องเริ่มต้น ดังนั้นพวกเขาต้องเข้าไปในบ้านของฉันและดูว่าฉันสร้างมันอย่างไร
  8. และอีกครั้งมันไม่เสถียรพอ ดังนั้นพวกเขาจึงต้องปรับสภาพพื้นของชั้นแรก
  9. แต่หลังจากนั้นทุกอย่างเรียบร้อยและทุกคนสามารถเข้าบ้านของฉันได้อย่างปลอดภัย

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

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

  1. สร้างไดอะแกรม UseCase คุณสามารถใช้draw.ioเพื่อเริ่มต้นด้วย
  2. กว่าสร้างแผนภาพ EPK ตาม UseCases ของคุณเพื่อกำหนดพฤติกรรม (พฤติกรรมของแอปพลิเคชันของคุณ) เร็วกว่า refactor กว่า refactor ต้นแบบที่มีรหัส โดยเฉพาะเมื่อคุณเป็นมือใหม่
  3. สร้างคลาสไดอะแกรม (โครงสร้างของใบสมัครของคุณ)
  4. กำหนดที่ที่คุณอาจได้รับปัญหาในการใช้งานของพฤติกรรม
  5. เขียนเพื่อให้ต้นแบบง่าย ๆ ที่มีรหัส 10 หรือ 20 บรรทัดเพื่อกำหนดวิธีที่คุณสามารถใช้พฤติกรรมนี้ เหมาะสำหรับผู้เริ่มต้น หรือดูบทช่วยสอนดูที่ซอร์สโค้ดของแอปพลิเคชันตัวอย่างอื่น ๆ พวกเขาแก้ไขมันอย่างไร
  6. กว่าเริ่มเขียนโค้ด กำปั้นการทดสอบที่สำเร็จของ UseCase ของคุณ สามารถทำได้หลายวิธี ขั้นแรกให้สร้างโครงสร้างทั้งหมดที่จำเป็นสำหรับการทดสอบและ UseCase นั้น เมื่อใช้Enterprise Architektคุณสามารถสร้างโครงสร้างให้คุณได้ ขึ้นอยู่กับไดอะแกรมของคุณ หรือสร้างโครงสร้างในขณะที่เดินสายทดสอบ ดังนั้นจึงไม่มีข้อผิดพลาดในการรวบรวมปรากฏขึ้น พูดถึงนี่คือคุณจะต้องทดสอบพฤติกรรมของใบสมัครของคุณเท่านั้น UseCases ที่คุณมี
  7. กว่าใช้งานพฤติกรรมของ UseCase ของคุณ
  8. หลังจาก UseCases ที่ประสบความสำเร็จเริ่มเขียนการทดสอบสำหรับข้อยกเว้น และรู้สึกดีเสมอเมื่อคุณเห็นสีเขียวเมื่อการทดสอบของคุณถูกต้อง;)
  9. และคุณทำเสร็จแล้ว

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

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


1

รหัสที่ฉันกำลังเขียนนั้นใช้งานได้ มันทำงานได้เพราะฉันกำลังทดสอบด้วยตนเอง

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

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

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

  • เลือกชิ้นงานตามแนวตั้ง

  • พัฒนาต้นแบบการทำงาน

  • Refactor จนกว่าทุกอย่างจะดีและเป็นระเบียบ

และอีกครั้ง: ในขณะที่การปรับโครงสร้างใหม่คุณทดสอบตรรกะทั้งหมดที่ได้รับผลกระทบจากการปรับโครงสร้างใหม่ด้วยตนเองหรือไม่ ใช้เวลานานแค่ไหนในการทดสอบการเปลี่ยนแปลงการเปลี่ยนสภาพ หากการเปลี่ยนการแบ่งรหัสใหม่ใช้เวลานานเท่าไหร่คุณจะพบเหตุผลในการหยุดพัก

  • เอนหลังชื่นชมความสวยงามและรหัสที่ทดสอบได้ที่ฉันเขียน

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

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


0

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

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

สถาปัตยกรรมที่ดีแน่นอนหลักการของ SOLID ฯลฯ ควรป้องกันสิ่งนี้ แต่นักพัฒนาส่วนใหญ่ไม่สมบูรณ์แบบและนี่คือเหตุผลที่การทดสอบข้ามระบบมีค่า


สถาปัตยกรรมที่ดีแน่นอนหลักการของ SOLID ฯลฯ ควรป้องกันสิ่งนี้เช่นนี้ ระบบที่ซับซ้อนมีชิ้นส่วนที่ส่งผลกระทบต่อส่วนอื่น ๆ นั่นเป็นเพียงวิธีการ เช่นการแก้ไขไวยากรณ์ Antlr ในRubberduckสามารถทำให้ชิ้นส่วนที่ถูกดัดแปลงนั้นทำงานได้อย่างสมบูรณ์แบบในขณะที่ยังมีคุณสมบัติอื่นอีก 45 อย่าง หากไม่มีการทดสอบอย่างละเอียดจะไม่มีทางรู้และคุณจะต้องมีความวิกลจริตที่ต้องการทดสอบทุกกรณีด้วยตนเองทุกครั้ง ถ้าฉันเปลี่ยนบางอย่างในโปรแกรมแก้ไขและตัวแบ่งการทดสอบ 987 ฉันรู้ว่าฉันทำอะไรผิดและสิ่งที่ได้รับผลกระทบ
Mathieu Guindon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.