คุณทำให้การทดสอบหน่วยสนุกขึ้นได้อย่างไร [ปิด]


18

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

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


1
ฉันรักการเขียนการทดสอบหน่วยและการทดสอบอื่น ๆ ส่วนหนึ่งเป็นเพราะเกือบทุกคนประเภทอื่น ๆ ที่มัน (บางครั้งพวกเขาก็ดูดที่ทำเครื่องมือที่ฉันกำลังทดสอบ) ไม่ฉันไม่ดูดในฐานะนักพัฒนา ฉันชอบการใช้งาน, อาหารตาและระบบอัตโนมัติ MbUnitห้องสมุดมีการเปลี่ยนแปลงชีวิตของฉัน การทดสอบอัตโนมัติเป็นสิ่งสำคัญ การทดสอบอัตโนมัติช่วยประหยัดเวลา การทดสอบอัตโนมัติช่วยประหยัดเงิน การทดสอบอัตโนมัติสามารถช่วยชีวิต การทดสอบอัตโนมัติเป็นวิธีเดียว การทดสอบอัตโนมัติเป็นอีกหนึ่งเครือข่ายความปลอดภัย เมื่อฉันเป็นหนึ่งใน 50 คนที่ทำงานเกี่ยวกับสถาปัตยกรรมขนาดใหญ่ฉันรู้สึกเหมือนเป็นอิฐอีกก้อนในกำแพง ด้วยการทดสอบหน่วยฉันอยู่ในการควบคุม
งาน

ความเกียจคร้านและความยุ่งยากในการทดสอบหน่วยเป็นปฏิกิริยาปกติในการทำงานที่สมองของเรามองว่าไร้ประโยชน์ ฉันเกลียดที่จะเขียนและดูแลการทดสอบหน่วยที่มี ROI น้อยหรือติดลบ อย่างไรก็ตามการเขียนแบบทดสอบที่มีประโยชน์นั้นเป็นงานที่น่าพอใจ แต่มันก็มีความสามารถของตัวเองในการจดจำสิ่งที่มีประโยชน์และสิ่งที่เป็นขยะ มีผู้ชายคนหนึ่งที่กำลังเขียนหนังสือในหัวข้อนี้ตามบล็อกของเขาคุณสามารถติดดาวอ่านได้ที่นี่: enterprisecraftsmanship.com/2016/06/01/…
KolA

คำตอบ:


22

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

ฉันพบว่ามีสองวิธีในการทดสอบหน่วยสำหรับฉันที่ทำให้สนุกจริงๆ:

  1. โดยการใช้การทดสอบการขับเคลื่อนการพัฒนา (TDD) - การเขียนการทดสอบก่อนช่วยให้ฉันคิดเกี่ยวกับการทำงานหรือพฤติกรรมที่ฉันต้องการในรหัสของฉัน ฉันพบว่าการขับเคลื่อนไปสู่เป้าหมายสุดท้ายของฉันในขั้นตอนเล็ก ๆ และเห็นความก้าวหน้าที่จับต้องได้สู่เป้าหมายนั้นทุกสองสามนาทีให้รางวัลและความเพลิดเพลินอย่างมาก
  2. เมื่อมีข้อบกพร่องแทนที่จะตรงไปที่ตัวดีบั๊กมันเป็นความท้าทายที่สนุกที่จะหาวิธีในการเขียนการทดสอบหน่วยที่ล้มเหลวซึ่งจะทำซ้ำข้อบกพร่อง ในที่สุดก็เป็นที่น่าพอใจอย่างมากในการหาสถานการณ์ที่ทำให้รหัสของคุณล้มเหลวจากนั้นแก้ไขและดูแถบเปลี่ยนเป็นสีเขียวสำหรับการทดสอบความล้มเหลวใหม่

12

Smug superiority

ฉันแค่ล้อเล่นครึ่งเดียว "มองมาที่ฉันปลูกฝังนิสัยการเขียนโปรแกรมที่ดี! สิ่ง 'การทดสอบหน่วย' นี้เป็นสิ่งที่ฉันจากสิบปีที่ผ่านมาไม่เคยทำ - เป็นคนโง่! และแค่คิดถึงข้อผิดพลาดทั้งหมดที่ฉันจะได้รับจากการ งานที่น่าเบื่อและน่าเบื่อนี้ฉันกำลังทำอยู่ตอนนี้ - รหัสของฉันจะยอดเยี่ยม! ฉันจะได้รับการเพิ่มแน่นอน! * "

* - ไม่ฉันไม่ต้องการ

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


7

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

ตัวอย่างเช่นบางคนจะเขียนฟังก์ชั่นแล้วเปิดเซสชันแบบโต้ตอบเพื่อทดสอบกับค่าสองสามค่าและตรวจสอบว่าใช้งานได้:

def fact x
  if x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact 10
=> 3628800
>> fact 7
=> 5040

แต่ตอนนี้คุณค้นพบข้อบกพร่อง:

>> fact -1
SystemStackError: stack level too deep
    from (irb):2:in `fact'
    from (irb):5:in `fact'
    from (irb):10

ดังนั้นคุณจะแก้ไข:

def fact x
  if x < 0
    raise "Can't take the factorial of a negative number"
  elsif x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact -1
RuntimeError: Can't take the factorial of a negative number
    from (irb):3:in `fact'
    from (irb):10

แต่ตอนนี้คุณควรทดสอบเพื่อให้แน่ใจว่ายังใช้งานได้:

>> fact 10
=> 3628800
>> fact 7
=> 5040

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

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

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


@Biran ฉันเห็นด้วย แต่ทั้งหมดนี้ทำให้สิ่ง "ถูกต้อง" แต่จะทำให้สนุกได้อย่างไร แม้แต่เล็กน้อย
ล่วงหน้า

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

ดังนั้นใช้เวลาในการทำสิ่งที่ไม่ดีเพื่อให้การทำมันถูกต้องรู้สึกสนุกโดยการเปรียบเทียบ? ... นั่นอาจใช้ได้จริง ....
BlairHippo

@Biran ฉันเห็นด้วยเราต้องทำมัน "ก่อน" - ไม่เพียง แต่จะกำจัดความเบื่อ แต่ฉันคิดว่ามันเป็นวิธีที่เหมาะสมที่จะทำเพื่อที่จะเก็บเกี่ยวผลประโยชน์ที่แท้จริงของการทดสอบหน่วย
ไว้

@Biran ขอขอบคุณ! ฉันเพิ่งใช้ TDD ในโครงการงานอดิเรกของฉันและมันเปลี่ยนวิธีที่ฉันคิดเกี่ยวกับการทดสอบหน่วย
ไว้

5

ฉันไม่รู้ สิ่งที่ทำให้การทดสอบหน่วยสนุกไปกับฉันมากขึ้นคือความคิดในการดีบักที่น่าผิดหวัง, ยาว, น่าเบื่อและไม่ตอบสนองฉันจะไม่ผ่านทุกครั้งที่ฉันทำการเปลี่ยนแปลงในซอฟต์แวร์ :)


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

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

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

3

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


3

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


เนื่องจากรหัสดั้งเดิมโดยทั่วไปไม่สามารถทดสอบได้ง่ายฉันพบว่าตัวเองกำลังพยายามเขียนการทดสอบหน่วยที่ดี - ดังนั้นไม่เพียง แต่เป็นกระบวนการที่เจ็บปวด แต่ผลลัพธ์ (การทดสอบหน่วย) ไม่ได้มีประโยชน์โดยเฉพาะอย่างยิ่ง: - / ฉันพบว่าน่าหงุดหงิดที่สุด .. . เกมคุ้มครองเป็นหนึ่งที่ดีแม้ว่า :)
Preets

1

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


ใช่, ทำไมคุณถึงบอกว่าการทดสอบหน่วยไม่ต้องคิดมาก? ถ้าคุณทำงานกับ TDD มันเกี่ยวข้องกับการคิดมาก นั่นไม่จริงเหรอ?
ล่วงหน้า

คุณพูดถูกฉันไม่ได้คำนึงถึง TDD
Tamás Szelei

0

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


0

โดยไม่พยายามหลอกตัวเองว่าฉันสามารถหลอกให้ฉันคิดว่าการทดสอบหน่วยสามารถสนุกได้ตลอดระยะเวลาที่ยั่งยืน

การยอมรับความจริงที่ว่าการทดสอบหน่วยไม่มีความสนุกช่วยฉันได้อย่างมากทำให้ฉันรู้ว่าฉันกำลังมองหาบางสิ่งในที่ที่ไม่ควรจะเป็น

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

คำตอบคือ "ไม่" ดังก้อง

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


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

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