การสร้างหน่วยทดสอบอัตโนมัติ


11

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

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

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


Visual Studio ล่าสุดคือทุกสิ่งที่คุณต้องการ ...
งาน

คำตอบ:


5

กลยุทธ์และโครงกระดูกของคุณขึ้นอยู่กับการทดสอบประเภทที่คุณต้องการสร้างความครอบคลุมประเภทใดที่คุณกำลังมองหาและภาษา / สภาพแวดล้อมที่คุณใช้งาน

มันค่อนข้างตรงไปตรงมาในการเขียนตัวสร้างการทดสอบซึ่งสำหรับภาษาเช่น C หรือ Java จะอ่านลายเซ็นของชั้นเรียนและสร้างการทดสอบสำหรับกรณีมุมมาตรฐานโดยอัตโนมัติ (ผ่านใน 0, 2 ค่าสุ่ม, MAX_INT, MIN_INT ไปยังอาร์กิวเมนต์จำนวนเต็ม ฯลฯ ... ) จากนั้นคุณสามารถเรียกใช้การทดสอบที่สร้างขึ้นบันทึกผลลัพธ์สำหรับการทดสอบแต่ละครั้งและกรองด้วยตนเองเพื่อลบรายการที่ไม่เกี่ยวข้องอนุมัติผลการทดสอบที่ยอมรับได้สำหรับการทดสอบที่ผ่าน (เพื่อให้พวกเขาสามารถส่งผ่านโดยอัตโนมัติ) และทำเครื่องหมายว่าไม่ถูกต้อง .

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

ดังนั้นนี่คือส่วนประกอบบางส่วนที่คุณต้องการดู:

  • ส่วนประกอบในการแยกวิเคราะห์ซอร์สโค้ด / ฟังก์ชั่นของลายเซ็นต์ / คำอธิบายประกอบด้วยตนเองโดยอัตโนมัติสร้างกรณีทดสอบมาตรฐานหรือโครงร่าง / ลายเซ็นต์สำหรับกรณีทดสอบที่รอให้อินพุตของคุณเสร็จสมบูรณ์
  • ภาษาที่กำลังเติบโต / เปลี่ยนแปลงตลอดเวลาของแท็ก / คำอธิบายประกอบ / ความคิดเห็นซึ่งอาจไปที่ระดับความละเอียดใด ๆ (เมธอด / คลาส / ลายเซ็น / / ในขณะที่ลูป / etc ... ) แสดงถึงคำแนะนำของเครื่องมือสร้างการทดสอบอัตโนมัติ เป็นการดีที่คุณควรจะสามารถเล่นกับภาษานี้ได้โดยไม่ต้องถอดรหัสกรอบหรือชิ้นส่วนใด ๆ ในนั้น
  • นักวิ่งทดสอบอัตโนมัติที่มีความสามารถในการระบุการทดสอบใหม่ / เก่าและบันทึก / ทดสอบกับคำตอบ "ยอมรับ" สำหรับการทดสอบแต่ละครั้ง ในอุดมคติแล้วนักวิ่งนี้จะสร้างฐานข้อมูลการทดสอบผลการยอมรับ / ปฏิเสธและผลลัพธ์ที่ยอมรับได้ในปัจจุบันสำหรับการทดสอบแต่ละครั้ง
  • Automated "object faker" ซึ่งกำหนดชื่อคลาสและแผนที่ชื่อ - ค่า> สามารถสร้างวัตถุที่เลียนแบบคลาสส่งคืนข้อมูลที่ปรับแต่งได้สำหรับการเรียกใช้ฟังก์ชั่น accessors ช่องข้อมูลสาธารณะ ฯลฯ ...

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


5

ผมไม่ได้มีโอกาสที่จะใช้ในการประยุกต์ใช้ขนาดที่มีความหมายหรือความซับซ้อน ๆ แต่มีเครื่องมือรวมทั้งของ Google CodePro AnalytiXที่อัตโนมัติรุ่นทดสอบหน่วยสำหรับการใช้งานจาวา ฉันยังพบผลิตภัณฑ์เชิงพาณิชย์คือการทดสอบ C ++ ของ Parasoftที่ดูเหมือนจะอนุญาตให้มีการสร้างการทดสอบหน่วย C ++

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

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


เพื่อให้ได้รับการเผยแพร่เพิ่มขึ้นFalcon ได้ทดลองใช้ CodePro ในโครงการและเขียนประสบการณ์เกี่ยวกับประสบการณ์ของเขาเล็กน้อย


CodePro Analytix ของ Google ฟังดูน่าสนใจ แต่"Quip custodiet ipsos custodes" ใครเป็นคนทดสอบการทดสอบ? สิ่งนี้สามารถใช้เพื่อสำรองข้อมูลโครงการที่มีอยู่โดยการทดสอบหน่วยและอาจไม่ตรวจพบความล้มเหลวมันค่อนข้างจะถือว่าข้อบกพร่องนั้นถูกต้อง
เหยี่ยว

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

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

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

ฉันจะทดสอบในสัปดาห์หน้าด้วยแอปพลิเคชั่น J2EE ขนาดกลาง (120 klocs) ที่รวมเอากฎเกณฑ์ทางธุรกิจที่ยากและจะบอกเล่าประสบการณ์ของฉันที่นี่
เหยี่ยว

1

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

  • โอกาสของฉันคือกรอบหลักของโครงการที่ได้รับการพัฒนาให้การดำเนินงานมาตรฐานและการตั้งชื่อชั้นเรียน หากคุณกำลังคิดที่จะเขียนของคุณเองโครงสร้างมาตรฐานแบบนี้จะช่วยได้มาก
  • การใช้data-driven testingช่วยได้มากถ้าโค้ดเบสของคุณอนุญาต กรอบการทดสอบสร้างตารางฐานข้อมูลสำหรับการทดสอบแต่ละหน่วยเพื่อเก็บข้อมูลการทดสอบเพื่อให้แต่ละแถวในตารางนั้นเป็นการทดสอบแยกต่างหากและไม่จำเป็นต้องใช้รหัสเพิ่มเติม ( กฎการเป็นตัวแทน ) จากจุดนี้เป็นต้นไปการทดสอบจริงสามารถสร้างขึ้นได้อย่างง่ายดายโดยอัตโนมัติหรือป้อนด้วยตนเอง
  • การทดสอบหน่วยที่ได้นั้นง่าย แต่ก็ทำหน้าที่เป็นsmoke testอย่างน้อย สำหรับพื้นที่ที่มีความเสี่ยงสูงจะทำการทดสอบด้วยตนเองเพิ่มเติม

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

(ตามด้านข้างมีPexแต่สำหรับ. NET)

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