จุดประสงค์ของการทดสอบหน่วยบนเซิร์ฟเวอร์ CI คืออะไร


98

ทำไมคุณถึงเรียกใช้การทดสอบหน่วยบนเซิร์ฟเวอร์ CI

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


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

2
@ BoristheSpider - เวิร์กโฟลว์ที่ดีมากอย่างแน่นอน masterควรมีเหตุผลและควรปรับใช้โดยอัตโนมัติในแต่ละการผสานกับสภาพแวดล้อมการจัดเตรียมสำหรับการตรวจสอบคุณภาพภายในและการทดสอบ
ต่อ Lundberg

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

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

5
"แน่นอนตามเวลาที่สิ่งที่มุ่งมั่นที่จะเป็นหลักนักพัฒนาได้ทำการทดสอบหน่วยทั้งหมดก่อนและแก้ไขข้อผิดพลาดใด ๆ ที่อาจเกิดขึ้นกับรหัสใหม่ของพวกเขา" ... ไม่แน่ใจว่าร้ายแรง
chucksmash

คำตอบ:


223

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

หรือไม่. อาจมีสาเหตุหลายประการที่ทำให้สิ่งนี้เกิดขึ้น:

  • นักพัฒนาไม่มีวินัยในการทำเช่นนั้น
  • พวกเขาลืมไปแล้ว
  • พวกเขาไม่ได้กระทำทุกอย่างและผลักดันชุดการกระทำที่ไม่สมบูรณ์ (ขอบคุณMatthieu M.
  • พวกเขาทำการทดสอบบางอย่างเท่านั้น แต่ไม่ใช่ทั้งชุด (ขอบคุณnhgrif )
  • พวกเขาทดสอบในสาขาของพวกเขาก่อนที่จะรวม (ขอบคุณnhgrif * 2)

แต่จุดที่แท้จริงคือการรันการทดสอบบนเครื่องที่ไม่ใช่เครื่องผู้พัฒนา หนึ่งที่กำหนดค่าแตกต่างกัน

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

เหตุผลที่ดีอื่น ๆ สำหรับ CI สร้างเพื่อใช้ทดสอบ:

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

36
สาเหตุทั่วไปอื่น ๆ : 1) เซิร์ฟเวอร์ CI อาจเรียกใช้การทดสอบการรวม / การยอมรับระดับสูงซึ่งใช้เวลานานเกินไปสำหรับนักพัฒนาในการเรียกใช้พวกเขาเสมอ 2) ผู้พัฒนาทำการเรียกใช้แล้วทำการเปลี่ยนแปลงเพียงเล็กน้อยก่อนที่จะผลักดันว่าพวกเขามั่นใจมากว่าจะไม่ทำลายอะไร แต่เราต้องการให้แน่ใจ
Ixrec

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

2
@MichaelT จับดี ที่จริงแล้วสาเหตุของ> 90% ของ CI ของเราล้มเหลวในวันนี้ไม่แน่ใจว่าฉันลืมมันได้อย่างไร ...
Ixrec

34
นอกจากนี้การใช้งานในสภาพแวดล้อม CI มักจะหมายความว่าคุณตั้งค่าโครงการของคุณตั้งแต่เริ่มต้นเพื่อให้มั่นใจว่างานสร้างของคุณสามารถทำซ้ำได้
mgarciaisaia

5
นอกจากนี้อาจมีการเปลี่ยนแปลงสองรายการที่ทดสอบว่าไม่เป็นไร แต่แยกกัน (เช่นการลบ API ที่ไม่ได้ใช้และการเริ่มใช้งานอื่น)
Simon Richter

74

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

ฉันจะต้องสร้างทดสอบและตรวจสอบว่าแอปพลิเคชันทำงานอย่างถูกต้องใน:

  • Microsoft Windows XP และ Vista พร้อมคอมไพเลอร์ Visual Studio 2008
  • Microsoft Windows 7 ที่มีคอมไพเลอร์ Visual Studio 2010
    • โอ้และ MSI สร้างขึ้นสำหรับแต่ละสิ่ง
  • RHEL 5 และ 6 ที่มี 4.1 และ 4.4 ตามลำดับ (CentOS ในทำนองเดียวกัน)
    • 7 เร็ว ๆ นี้ Woop-de-Woop
  • Fedora Workstation กับ GCC สำหรับสามรุ่นล่าสุด
  • Debian (และอนุพันธ์เช่น Ubuntu) สำหรับสามเวอร์ชันล่าสุด
  • Mac OSX ในสามเวอร์ชันล่าสุด
    • และแพคเกจ (รอบต่อนาที, dmg ฯลฯ )

เพิ่มใน Fortran (ทั้งคอมไพเลอร์ของ Intel และ GNU), Python (และเป็นเวอร์ชันต่าง ๆ ขึ้นอยู่กับระบบปฏิบัติการ) และส่วนประกอบสคริปต์ bash / bat และดีฉันคิดว่าคุณสามารถเห็นสิ่งที่หมุนวน

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

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


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

33
@ RobbieDee ฉันกลัวว่าฉันไม่เห็นจุดของคุณ? ฉันไม่แนะนำให้สร้างการทดสอบใหม่โดยไม่ทำการทดสอบในพื้นที่หรือเพียงแค่มอบหมายให้สิ่งต่าง ๆ ในการควบคุมแหล่งโดยไม่ทำการทดสอบด้วยตัวเองและฉันจะทำการทดสอบบนเครื่องของตัวเอง - แต่ "การกำหนดค่า" ไม่จำเป็นต้องผ่านการทดสอบ และจะเป็นการดีกว่าถ้าทำอย่างรวดเร็วเมื่อจิตใจของนักพัฒนายังคงอยู่ในพื้นที่นั้นมากกว่าการค้นหาปัญหาเมื่อทีมที่ใช้ Mac ส่วนใหญ่ตื่นขึ้นมาห่างออกไปสี่พันไมล์และอัปเดตสำเนาของพวกเขา
TZHX

7
@RobbieDee ผมว่า TZHX จะวิ่งทุกการทดสอบเฉพาะถ้าพวกเขาสามารถทำเช่นนั้น แต่พวกเขาไม่สามารถ เนื่องจาก TZHX ไม่สามารถทำได้พวกเขาจึงทำการทดสอบในเครื่อง (ที่สามารถทำงานบนระบบ dev และสั้นพอหรือเกี่ยวข้องกับรหัสที่เปลี่ยนไปมากที่สุด) และปล่อยให้แบตเตอรี่ทำงานเต็มในระบบ CI เหมาะสมพอสมควร
muru

11
@ RobbieDee: เขาเชื่อในการทดสอบหน่วย ดังนั้นเขาจึงทดสอบพวกเขาในเครื่อง Macbook ของเขาแล้วผ่านและเช็คอินเซิร์ฟเวอร์ CI ที่ใช้ Red Hat, Solaris และ Windows จะทำการทดสอบเหล่านั้นอีกครั้ง มันดีใช่ไหมที่รู้ว่าสิ่งที่คุณทดสอบนั้นใช้งานได้บนแพลตฟอร์มการผลิตด้วยเช่นกัน?
slebetman

2
@ RobbieDee: ฉันมักจะเขียนการทดสอบหน่วยที่เฉพาะเจาะจงกับคอมไพเลอร์บางอย่างบนแพลตฟอร์มที่แน่นอน พิจารณาเช่นระบบย่อยกราฟิกที่ใช้คำสั่ง CPU เฉพาะของ AMD (Intel คู่แข่ง) ซึ่งมีเฉพาะใน g ++ (คอมไพเลอร์ GNU C ++) เวอร์ชัน 4.5 หรือใหม่กว่า แต่ฉันทำงานกับ Atom CPU และ ICC (Intel C ++) คอมไพเลอร์) มันจะไร้สาระที่จะเรียกใช้การทดสอบ AMD / g ++ 4.5 ทุกครั้งบนเครื่องนั้น แต่มันเป็นรหัสที่จะทดสอบก่อนการเปิดตัว รวมถึงรหัสที่ไม่ขึ้นกับ CPU ของฉันเองต้องได้รับการทดสอบเพื่อการทำงานร่วมกันที่เหมาะสม แน่นอนว่ามี VMs และอีมูเลเตอร์ ...
phresnel

23

นอกเหนือจากคำตอบ Oded ที่ยอดเยี่ยม:

  • คุณทดสอบโค้ดจากพื้นที่เก็บข้อมูล มันอาจทำงานกับเครื่องของคุณด้วยไฟล์ของคุณ ... ที่คุณลืมที่จะกระทำ มันอาจขึ้นอยู่กับตารางใหม่ที่ไม่มีสคริปต์การสร้าง (ใน liquibase เช่น) ข้อมูลการกำหนดค่าบางอย่างหรือไฟล์คุณสมบัติ
  • คุณหลีกเลี่ยงปัญหาการรวมรหัส นักพัฒนาซอฟต์แวร์หนึ่งคนดาวน์โหลดเวอร์ชันล่าสุดสร้างหน่วยทดสอบและบูรณาการเพิ่มรหัสผ่านการทดสอบทั้งหมดในเครื่องของเขา ผู้พัฒนารายอื่นเพิ่งทำแบบเดียวกัน การเปลี่ยนแปลงทั้งสองอย่างถูกต้องด้วยตัวเอง แต่เมื่อรวมแล้วทำให้เกิดข้อผิดพลาด นี่อาจเป็นการรวมที่เก็บข้อมูลหรือเพียงแค่ตรวจไม่พบว่าเป็นความขัดแย้ง เช่น Dev 1 ลบไฟล์ที่ไม่ได้ใช้เลย รหัส Dev 2 กับไฟล์นี้และการทดสอบโดยไม่มีการเปลี่ยนแปลง Dev 1
  • คุณพัฒนาสคริปต์เพื่อปรับใช้โดยอัตโนมัติจากที่เก็บ การมีอาคารสากลและการปรับใช้สคริปต์สามารถแก้ไขปัญหาได้มากมาย นักพัฒนาบางคนอาจเพิ่มตัวเลือก lib หรือการรวบรวมที่ทุกคนไม่ได้แชร์ ไม่เพียง แต่ช่วยคุณประหยัดเวลา แต่ที่สำคัญกว่านั้นยังทำให้การปรับใช้ปลอดภัยและคาดการณ์ได้ นอกจากนี้คุณสามารถกลับไปที่ที่เก็บของคุณเป็นรุ่น 2.3.1 และปรับใช้เวอร์ชันนี้ด้วยสคริปต์ที่ทำงานกับเวอร์ชันนี้ มันมีวัตถุฐานข้อมูลเช่นมุมมองขั้นตอนการจัดเก็บมุมมองและทริกเกอร์ที่ควรเป็นรุ่น (หรือคุณจะไม่สามารถกลับไปใช้เวอร์ชันที่ใช้การได้)
  • การทดสอบอื่น ๆ : เช่นเดียวกับการรวมประสิทธิภาพและสิ้นสุดการทดสอบ สิ่งนี้อาจช้าและอาจรวมถึงเครื่องมือทดสอบเช่น Selenium คุณอาจต้องการชุดข้อมูลที่สมบูรณ์พร้อมฐานข้อมูลจริงแทนที่จะเป็นวัตถุจำลองหรือ HSQL

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


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

22

คุณคิดว่าไม่ใช่คุณ - แต่นักพัฒนาเป็นมนุษย์และบางครั้งพวกเขาก็ลืม

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

การทดสอบของคุณอาจขึ้นอยู่กับทรัพยากรในพื้นที่ (ไม่ จำกัด ) สิ่งที่การทดสอบหน่วยท้องถิ่นของคุณจะไม่ได้รับ

หากคุณคิดว่าสิ่งที่กล่าวมาข้างต้นมีความเพ้อฝันมีระดับที่สูงกว่า CI (อย่างน้อยใน TFS) เรียกว่าGatedโดยที่การสร้างที่มีการทดสอบที่ล้มเหลวจะถูกจัดวางและไม่ได้มุ่งมั่นที่จะสร้างฐานรหัส


7
ฉันได้เห็นโอ๊ะโอมากกว่าฉันลืมที่จะยอมรับว่า CI ความล้มเหลวที่ฉันยอมรับที่จะยอมรับ
Dan Neely

@DanNeely เพื่อความเป็นธรรมคุณจะได้รับก้นเตะของคุณโดยผู้จัดการสร้างเพราะคุณลืมที่จะบอกเขา / เธอเกี่ยวกับบางสิ่งบางอย่าง ... :-)
Robbie Dee

3
นั่นเป็นหนึ่งในเหตุผลที่ฉันรัก CI การค้นหาและแก้ไข ooopses ของคุณนั้นดีกว่าการให้คนอื่นมาหาคุณ
Dan Neely

14

เมื่อถึงเวลาที่บางสิ่งมุ่งมั่นที่จะเป็นผู้เชี่ยวชาญ

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

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

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

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

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


1
คุณไม่ควรมีการทดสอบหน่วยช้าจริง ๆ - นี่เป็นการละเมิดหลักการแรก
Robbie Dee

4
@ RobbieDee: ฉันคิดว่าโดยปกติแล้วเซิร์ฟเวอร์ CI จะทำการทดสอบทั้งหมดไม่ใช่แค่การทดสอบหน่วย
RemcoGerlich

4
@ RobbieDee: ตามทฤษฏีการทดสอบหน่วยทั้งหมดรวดเร็ว ในทางปฏิบัติ .... ไม่ว่า CI จะสามารถและควรทำการทดสอบทั้งหมด - linters, การวิเคราะห์สแตติก, การทดสอบหน่วย, การทดสอบการรวม
Daenyth

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

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

4

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

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


3

สมมติว่า (ตรงกันข้ามกับคำตอบอื่น ๆ ) ที่นักพัฒนาค่อนข้างมีระเบียบวินัยและทำการทดสอบหน่วยก่อนที่จะกระทำอาจมีหลายสาเหตุ:

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

3

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

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

นอกจากนี้นักพัฒนาซอฟต์แวร์บางคนไม่ได้เรียกใช้การทดสอบหน่วยทั้งหมดในขณะที่นักพัฒนาซอฟต์แวร์ส่วนใหญ่ทำได้


2

ลองถามคำถามที่เทียบเท่ากัน

ทำไมคุณต้องสร้างรหัสบนเซิร์ฟเวอร์ CI

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


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

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

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