รหัสทดสอบการจัดส่ง ทำไมคุณไม่


17

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

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

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

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


8
ทำไมการทดสอบหน่วยในโปรแกรมโอเพนซอร์ส (หรือโปรแกรมโอเพนซอร์ซที่ไม่ได้ทำการแก้ไข) จะล้มเหลว? หากผลิตภัณฑ์ของคุณต้องมีปัญหาในการตั้งค่าและการตั้งค่าจำนวนมากพอสมควรมักเป็นแหล่งที่มาของบั๊กมันอาจเหมาะสมที่จะจัดส่งแอพ "ตรวจสอบการกำหนดค่าของฉัน" บางประเภทเช่นการตรวจสอบความถูกต้องของการเชื่อมต่อฐานข้อมูล รหัสของคุณขึ้นอยู่กับ ฯลฯ มันจะไม่สมเหตุสมผลสำหรับการทดสอบหน่วยที่จะล้มเหลวเนื่องจากคุณได้ตรวจสอบแล้วว่าโค้ดใช้งานได้
Justin Cave


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

7
@JonChesterfield: การสร้างคุณสมบัติทดสอบตัวเองในโปรแกรมของคุณน่าจะเป็นสิ่งที่ดี และถ้าคุณสมบัติการทดสอบตัวเองสามารถนำโค้ดจากการทดสอบหน่วยของคุณไปใช้บางส่วนได้ทำไมไม่ แต่คุณสมบัติดังกล่าวรวมถึงชิ้นส่วนที่นำกลับมาใช้ใหม่ควรได้รับการพัฒนาด้วยมุมมองแบบ "เป็นรหัสการผลิต"
Doc Brown

2
@JonChesterfield ฉันมีเวลายากที่จะนึกภาพการทดสอบหน่วยที่ล้มเหลวในสาเหตุส่วนใหญ่ การทดสอบการรวมเป็นอีกเรื่องหนึ่ง - ฉันเห็นข้อดีในการขนส่งพวกเขาหากสามารถทำได้โดยไม่ต้องมีอะไรพิเศษมากเกินไป
Loren Pechtel

คำตอบ:


19

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

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

ในทางกลับกันการทดสอบจำนวนมากนั้นไม่ดีอย่างน่าอายและไม่ได้ทดสอบสิ่งที่บางคนคิดว่าเป็นการทดสอบ นั่นคือปัญหาที่แตกต่าง ...

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


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

ใช่ยากที่จะทำตามความเป็นจริง ฉันคิดว่าคุณจะมีโชคมากขึ้นด้วยความทุ่มเทในการพัฒนาการทดสอบการจัดส่ง
Erik Eidt

@ErikEidt: ฉันมีอิสระที่จะให้คำแนะนำสำหรับการลบ "เป็นโอเพ่นซอร์ส" เพราะนั่นอาจไม่ใช่สิ่งที่ OP คิดไว้ในใจ - ฉันคิดว่าเขาต้องการทดสอบแบบปิดเป็นแหล่งข้อมูล
Doc Brown

@DocBrown ฉันใช้จุดของคุณ อาจเป็นเรื่องของการตีความในขณะที่ OP ได้พูดถึง "โอเพ่นซอร์ส" ที่ไหนสักแห่งในโพสต์ ไม่ว่าในกรณีใดการแก้ไขของคุณจะทำให้เป็นจุดทั่วไป
Erik Eidt

18

การทดสอบการจัดส่งสินค้า? ใช่. การทดสอบการจัดส่งสินค้าหน่วย? เลขที่

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

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

ดังนั้น - จัดส่งการทดสอบการรวมระบบของคุณแทนซึ่งจะเป็นสิ่งที่คุณต้องการสำหรับผลิตภัณฑ์ที่ติดตั้งและผสานรวม


2

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

ในกรณีดังกล่าวฝันร้ายที่เลวร้ายที่สุดของคุณมักจะเป็นกรณีที่การทดสอบของคุณ (หน่วยและการรวม) จะผ่านสำหรับ 5,000 เครื่องแรก / แพลตฟอร์มที่ทดสอบแตกต่างกัน แต่ล้มเหลวสำหรับ 5,001 เนื่องจากข้อบกพร่องของไดรเวอร์สำหรับรุ่น GPU ที่คลุมเครือ เกี่ยวกับสิ่งนี้ทำให้ฉันมีอาการสั่น - คุณอาจไม่สามารถทดสอบหรือคาดการณ์ล่วงหน้าได้

โดยเฉพาะอย่างยิ่งถ้าคุณเขียน GPU shaders คุณสามารถจบลอตเตอรี่ย้อนกลับโดยที่โค้ดครึ่งหนึ่งที่คุณเขียนจะก่อให้เกิดพฤติกรรมที่ไม่ได้กำหนดเนื่องจากมีการรับประกันมาตรฐานแบบพกพาจำนวนน้อยที่บังคับใช้โดยทุกรุ่น / ไดรเวอร์ของ GPU ที่เกี่ยวข้อง ในขณะที่มันได้รับน้อยลงและน้อยเช่นการเล่นเรือกวาดทุ่นระเบิดวันนี้นี้ควรให้คนที่ความคิดบางอย่างhttp://theorangeduck.com/page/writing-portable-opengl การลองสิ่งนี้ในช่วงปลายยุค 90 และต้นยุค 2000 นั้นน่ากลัวจริงๆและมันก็เป็นเรือกวาดทุ่นระเบิดไปตลอดทาง

สำหรับเหล่านี้ชนิดของกรณีคุณมักจะต้องทีม 10,000 ทดสอบด้วยจริงๆกว้างช่วงของฮาร์ดแวร์และระบบปฏิบัติการจริงๆแข็งผลิตภัณฑ์และรู้สึกมั่นใจเกี่ยวกับเรื่องนี้ก่อนที่จะมีการเปิดตัวที่มีเสถียรภาพ ไม่ใช่ทุก บริษัท ที่สามารถมีฐานการทดสอบที่กว้างและไม่มีระเบียบที่จะทำ (ทุกประเด็นที่เห็นได้ชัดเจนควรได้รับการแก้ไขก่อนที่จะมีผู้ทดสอบจำนวนมากในบางช่วง pre-alpha / alpha ภายในหรืออื่น ๆ รายงานซ้ำซ้อนที่ท่วมท้นสามารถทำให้นักพัฒนาตื่นตระหนกได้

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

อีกสิ่งหนึ่ง (ถ้าคุณสามารถโน้มน้าวใจเจ้านาย) ก็คือการมีฮาร์ดแวร์ที่หลากหลายเพื่อทำการเชื่อมต่ออย่างต่อเนื่อง ความหลากหลายมากขึ้นในคอมโบฮาร์ดแวร์ / ระบบปฏิบัติการ, merrier คุณต้องการแม้กระทั่งฮาร์ดแวร์ crap ที่หลากหลายซึ่งจำลองแบบข้อกำหนดขั้นต่ำของฮาร์ดแวร์ขั้นต่ำสำหรับเซิร์ฟเวอร์ CI ของคุณ: คุณไม่มีทางรู้

แต่มีอีกอย่างที่ฉันขอแนะนำ:

เข้าสู่ระบบ

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

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

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

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

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

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

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

อย่างไรก็ตามฉันหวังว่านี่จะช่วยได้ ฉันเคยเจอสิ่งล่อใจแบบนี้ในอดีตและมีความหวาดระแวงรอบ ๆ การเข้ารหัส GPU (GPGPU และ shaders) ซึ่งเป็นผลมาจากประสบการณ์ที่ผ่านมาระหว่างตัวฉันและทีมของฉัน (บางครั้งแค่เห็นสมาชิกในทีมจัดการกับสิ่งเหล่านี้จริงๆ ปลายและโพสต์ปล่อยให้ฉันครีพเหมือน ATI ความผิดพลาดในรูปแบบเฉพาะของ Radeon ซึ่งจะผิดพลาดในการแสดงเส้น antialiased รายงานในภายหลังและทำเครื่องหมายว่าเป็นปัญหาที่รู้จักกันด้วยวิธีแก้ปัญหาที่มีอยู่เท่านั้น)

การบันทึกเป็นสิ่งที่ช่วยรักษาก้นของเราที่นั่นทำให้เรามักจะเห็นปัญหาในเครื่องต้นแบบที่คลุมเครือครั้งที่ 10,001 ด้วย GPU ออนบอร์ดที่เราไม่เคยได้ยินด้วยรหัสบรรทัดสุดท้ายทันทีทำให้เราเห็นจุดที่ความล้มเหลวลดลงเหลือ 2 หรือรหัส 3 บรรทัดเป็นที่น่าสงสัยเช่นหากอยู่ใน shader ที่ซับซ้อนเราก็เป็น SOL เพราะเราไม่สามารถเข้าสู่ GPU shader ได้ แต่อย่างน้อยเราก็สามารถใช้การบันทึกเพื่อดูว่า shader ใดมีปัญหาในทันที เพื่อเริ่มการสอบสวน


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