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


14

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

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

หากต้องการทำสิ่งนี้เป็นความคิดที่ดี:

  • ในการใช้การทดสอบหน่วยเพื่อให้ทราบถึงเวลาที่ใช้ในการดำเนินการแอ็คชั่นเดียวกัน² nครั้ง

  • หากต้องการใช้การหมดเวลาทดสอบต่อหนึ่งครั้งผ่าน[TestMethod, Timeout(200)]แอตทริบิวต์ใน C #

ฉันคาดว่าจะมีปัญหาหลายอย่างเกี่ยวกับวิธีการนี้:

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

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

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

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

  • การทดสอบประสิทธิภาพมากเกินไปจะส่งผลต่อเวลาที่ต้องใช้ในการทดสอบดังนั้นวิธีนี้ จำกัด เฉพาะการกระทำสั้น ๆ เท่านั้น

เมื่อคำนึงถึงปัญหาเหล่านั้นแล้วฉันยังคงน่าสนใจที่จะใช้การทดสอบหน่วยดังกล่าวหากรวมกับการวัดประสิทธิภาพที่แท้จริงโดยแผนก QA

ฉันผิดหรือเปล่า? มีปัญหาอื่น ๆ หรือไม่ที่ทำให้ไม่สามารถใช้การทดสอบหน่วยสำหรับสิ่งนี้ได้ทั้งหมด?

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


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

²ตามการกระทำฉันหมายถึงโค้ดสั้น ๆ ซึ่งใช้เวลาสองสามมิลลิวินาทีในการทำงาน

คำตอบ:


3

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

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

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

ที่ถูกกล่าวว่านี่คือบางประเด็นปัญหาของคุณ:

  • แนวคิด: มันเป็นความจริงว่านี่ไม่ใช่สิ่งที่ทดสอบหน่วยเกี่ยวกับ แต่ตราบใดที่ทุกคนตระหนักว่าการทดสอบไม่ควรตรวจสอบสิ่งที่ควรทำก็ดี

  • Visual Studio: ไม่สามารถพูดอะไรเกี่ยวกับเรื่องนี้ได้เนื่องจากเราไม่ได้ใช้กรอบการทดสอบหน่วยจาก VS

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

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

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


3

ฉันส่วนใหญ่สอดคล้องกับความคิดของคุณ เพียงให้เหตุผลกับกระแสที่เป็นอิสระ

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

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

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

ฉันไม่ได้เลิกตระหนักถึงฟังก์ชั่น Visual Studio แต่โดยทั่วไปคุณต้องใช้เครื่องมือทำโปรไฟล์ที่กว้างขึ้น


2

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

ข้อควรพิจารณาบางประการไม่เรียงตามลำดับซึ่งอาจเป็นประโยชน์:

  • การทดสอบประสิทธิภาพโดย QA นั้นใช้แรงงานมากและมีกำหนดการของตัวเอง (พูดครั้งเดียวในรอบซ้ำ) ดังนั้นการกดปุ่มควบคุมแหล่งที่มาจึงไม่เป็นปัญหา
  • ระบบของเรามีขนาดใหญ่และเป็นแบบแยกส่วนการทดสอบหน่วยนั้นละเอียดเกินไปสำหรับความต้องการของเราและเราได้สร้างการทดสอบหน่วย "ไขมัน" พิเศษที่ออกแบบมาอย่างรอบคอบเพื่อก่อให้เกิดปัญหาด้านประสิทธิภาพในพื้นที่เฉพาะที่น่าสนใจ รายละเอียดการนำไปใช้)
  • ข้อ จำกัด ตามปกติสำหรับการทดสอบหน่วยยังคงมีอยู่: ควรมีขนาดเล็กเร็วและตรงประเด็น
  • หากต้องการยกเว้นอิทธิพลของกรอบการทดสอบพวกเขาใช้เครื่องมือห่อหุ้มพิเศษเพื่อให้เรารู้ว่าต้องใช้เวลาเท่าไร
  • เป็นไปได้ที่จะเขียนลงไปก่อนที่การใช้งานจริงจะเสร็จสมบูรณ์ (ผลลัพธ์อาจไม่เกี่ยวข้องหรือมีประโยชน์ขึ้นอยู่กับกระบวนการบางทีนักพัฒนาอาจยังคงทดลองใช้งานและต้องการดูว่าโดยรวมจะเป็นอย่างไร)
  • พวกเขากำลังทำงานโดยเซิร์ฟเวอร์ CI หลังจากแต่ละบิลด์ดังนั้นเวลารันไทม์ทั้งหมดควรถูกเก็บไว้ค่อนข้างสั้น
  • เซิร์ฟเวอร์ CI นั้นทรงพลังและมีฮาร์ดแวร์ที่ได้รับการแก้ไขดังนั้นเราจึงนับว่าเป็นเครื่องเฉพาะ (เป็นไปได้ที่จะใช้เซิร์ฟเวอร์เฉพาะจริง ๆ โดยใช้ตัวแทนการสร้างระยะไกล)
  • เครื่องห่อทดสอบรวบรวมข้อมูลที่เกี่ยวข้องทั้งหมด (รายละเอียดฮาร์ดแวร์ชื่อการทดสอบ / หมวดหมู่โหลดระบบเวลาที่ใช้ไป ฯลฯ ) และส่งออกเป็นรายงานหรือไปยังฐานข้อมูล
  • เรามีแกดเจ็ตสำหรับ JIRA ที่ดึงรายงานเหล่านั้นและวาดแผนภูมิที่สวยงามตามชื่อ / หมวดหมู่ / หมายเลขบิลด์ที่มีการควบคุมบางอย่าง (วางทับรุ่นก่อนหน้าเป็นปัจจุบัน ฯลฯ ) ดังนั้นนักพัฒนาสามารถเห็นผลกระทบได้อย่างรวดเร็วและผู้จัดการสามารถรับภาพรวม (แดงบางเขียวทุกต้นคุณรู้ว่ามันสำคัญสำหรับพวกมัน)
  • มันเป็นไปได้ที่จะวิเคราะห์ว่าโครงการดำเนินไปอย่างไรเมื่อเวลาผ่านไปโดยใช้สถิติที่รวบรวมได้

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

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


0

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

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