ทำอย่างไรถึงจะทำให้ลำตัวมั่นคงเมื่อการทดสอบใช้เวลานาน


9

เรามีห้องทดสอบสามชุด:

  • ชุด "เล็ก" ใช้เวลาเพียงสองสามชั่วโมงในการทำงาน
  • ชุด "กลาง" ที่ใช้เวลาหลายชั่วโมงโดยปกติแล้วจะวิ่งทุกคืน (ทุกคืน)
  • ชุด "ใหญ่" ที่ใช้เวลาหนึ่งสัปดาห์ + ในการทำงาน

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

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

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

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

และมันจะสำคัญไหมถ้ามันเป็นระบบควบคุมแหล่งรวมส่วนกลางอย่าง SVN หรือระบบที่กระจายแบบ git?

โดยวิธีการที่ฉันเป็นนักพัฒนาจูเนียร์ที่มีความสามารถที่ จำกัด ในการเปลี่ยนแปลงสิ่งต่าง ๆ ฉันแค่พยายามที่จะเข้าใจว่ามีวิธีการจัดการกับความเจ็บปวดนี้ที่ฉันกำลังประสบ


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

2
มีอะไร "น่ารำคาญอย่างยิ่ง" เกี่ยวกับลำตัวไม่มั่นคง? ไม่ทราบว่าคุณรู้หรือไม่ แต่หนึ่งในกลยุทธ์การแตกแขนงที่ได้รับความนิยมมากที่สุดคือเรียกว่าลำตัวที่ไม่เสถียร
gnat

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

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

1
@ honk การทดสอบบางอย่างใช้เวลานานในการรัน ฉันทำงานให้กับ บริษัท ที่ทำให้อุปกรณ์เก็บข้อมูลและการทดสอบ "บางส่วน" ของเราใช้เวลาประมาณหนึ่งชั่วโมง การทดสอบจำเป็นต้องทำการวัดแบบต่างๆและใช้เวลาเพียงเล็กน้อย
Velociraptors

คำตอบ:


1

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

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

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

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


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

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

12

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

วิธีที่ได้เปรียบที่สุดในการแก้ไขปัญหานี้คือการเริ่มแยกฐานรหัสของคุณและทดสอบเป็นหน่วยย่อย (อิสระ)
มีข้อดีมากมายในเรื่องนี้:

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

ในการจัดการ flipside ของโครงสร้าง VCS ของคุณจะมีความซับซ้อนมากขึ้น แต่ในหนึ่งสัปดาห์เต็มสำหรับการทดสอบแบบเต็มของคุณฉันคิดว่าคุณสามารถรับความเจ็บปวดได้!

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


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

2
@oak - ในทางชุดอะตอมเป็นถ้าใช้ทั้งหมดเป็นวิธีเดียวที่คุณมั่นใจจริง ๆ ว่ารหัสมีเสถียรภาพ แต่คุณทำจุดดีดังนั้นฉันได้แก้ไขคำตอบของฉัน
Joris Timmermans

4
เรามีชุดทดสอบขนาดใหญ่สำหรับคอมไพเลอร์ซึ่งบางตัวใช้เวลาหลายวันในการรันและฉันไม่คิดว่ามันเป็นเรื่องแปลกสำหรับซอฟต์แวร์ที่ซับซ้อนเหมือนกับคอมไพเลอร์ C ++ ไม่ใช่ชุดที่กำหนดสิ่งที่จะถือว่าเป็น "เสถียร" แต่มีจำนวน cornercases ที่แตกต่างกันหลายรุ่นของการสร้างรหัสที่เป็นไปไม่ได้ที่จะทดสอบพวกเขาทุกวัน
JesperE

1
@JesperE - เป็นที่เข้าใจได้ถ้าชุดทดสอบขนาดใหญ่ไม่ได้นิยาม "เสถียร" แต่เป็นการทดสอบสติขนาดมหึมา ฉันจะไม่คาดหวังว่าชุดเต็ม (หรือแม้แต่ชุดกลาง) ล้มเหลวบ่อยมาก
Joris Timmermans

1

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

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

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


1

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


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

@ โอ๊ค: บางคนที่นี่ (คุณ?) โหวตคำตอบของฉันลง - แต่บางครั้งสิ่งที่คุณไม่ต้องการที่จะได้ยินก็เป็นเพียงสิ่งเดียวที่จะช่วยได้ ดังที่คุณเห็นในการสนทนาใต้คำถามของคุณผู้อื่นแนะนำเหมือนกันดังนั้นข้อเสนอแนะของฉันดูเหมือนจะไม่เลวร้ายนัก
Doc Brown

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

1

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

หากมีความล้มเหลวจะมีการทดสอบที่เกี่ยวข้องเหมือนกันที่ล้มเหลวเสมอ?

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

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


1

คุณต้องทำให้การทดสอบของคุณทำงานเร็วขึ้นไม่มีวิธีอื่นในการจัดวงกลมนี้

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

นี่คือสิ่งที่ฉันแนะนำ:

1) ทำการทดสอบแบบ atmomic มากที่สุดและนำสภาพแวดล้อมกลับมาใช้ใหม่ให้สูงสุด

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


0

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

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

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

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

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

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