มีค่าใดในการเขียนการทดสอบหน่วยสำหรับรหัสที่ใช้งานได้แล้วเมื่อรับแอปพลิเคชันหรือไม่


27

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

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

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

มีคุณค่าในการทำเช่นนี้หรือไม่?

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


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

คำตอบ:


15

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

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

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

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

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

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


13

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


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

8
 > Is there any value in writing unit tests for code that 
 > already works when inheriting applications?

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

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

ใช่จากคุณภาพและมุมมองของนักพัฒนามันมีค่าที่จะมีการทดสอบ

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


+1 สำหรับการทดสอบการรวมมากกว่าการทดสอบหน่วยสำหรับกรณีนี้ คำแนะนำเชิงปฏิบัติมาก
gbjbaanb

5

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

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


ทำไมต้องลงคะแนนเพื่อระบุความจริง?
Wayne Molina

4

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

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

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

แนวคิดของการทดสอบหน่วยการทดสอบลักษณะและตะเข็บเป็นประเด็นสำคัญในการทำงานอย่างมีประสิทธิภาพด้วยรหัสมรดกโดย Michael Feathers หนังสือที่ฉันขอแนะนำ


2

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

คุณทำดี:

ฉันควรจะรำคาญเพียงแค่ทดสอบหน่วยถ้าฉันพูดอีกครั้งหรือว่าฉันควรจะเขียนการทดสอบหน่วยสำหรับพวกเขาเมื่อใดก็ตามที่ฉันมีเวลา?

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

เมื่อไหร่ที่ฉันมีเวลา

คุณมีเวลาที่จะจัดลำดับความสำคัญใช่มั้ยดังนั้นมันจะไม่เกิดขึ้นเลย :)


1

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


1

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

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

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


0

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

โชคดี!

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