คุณมีการทดสอบอัตโนมัติเพียงพอที่จะมั่นใจในขั้นตอนการรวมระบบอย่างต่อเนื่องของคุณเมื่อใด


10

การรวมอย่างต่อเนื่องกับการทดสอบมีประโยชน์สำหรับการตรวจสอบให้แน่ใจว่าคุณได้ตรวจสอบรหัส "shippable" ตลอดเวลา

อย่างไรก็ตามมันเป็นเรื่องยากที่จะติดตามชุดการทดสอบที่ครอบคลุมและบ่อยครั้งที่รู้สึกว่างานสร้างนั้นจะต้องมีค่ามาก

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

คำตอบ:


16

โดยทั่วไป

คุณมีการทดสอบอัตโนมัติเพียงพอที่จะมั่นใจในขั้นตอนการรวมระบบอย่างต่อเนื่องของคุณเมื่อใด

คำตอบอาจชัดเจนถ้าคุณคิดเกี่ยวกับสิ่งที่คุณต้องการมั่นใจ ในที่สุดมันแผนที่ 1-1; การทดสอบทุกครั้งทำให้คุณมั่นใจในการทดสอบ:

  • การทดสอบหน่วยช่วยให้คุณมั่นใจได้ว่าคลาส (หรือโมดูล) ทำหน้าที่ทดสอบ
  • การทดสอบการผสานรวมทำให้คุณมั่นใจได้ว่าหลาย ๆ หน่วยทำงานร่วมกันในแบบที่ได้รับการทดสอบ
  • การทดสอบแบบ end-to-end ช่วยให้คุณมั่นใจว่าแอปพลิเคชันทั้งหมดทำบางสิ่งตามที่อธิบายไว้ในการทดสอบ

จากวิธีที่คุณตั้งคำถามคุณอาจคิดในแง่ของภาพรวมธุรกิจในตอนนี้ตัวอย่างเช่น:

ฉันต้องการมั่นใจว่าแอปของฉันสามารถทำ Xได้

ดังนั้นคุณเขียนการทดสอบแบบ end-to-end ที่พยายามทำ X และตรวจสอบว่ามันถูกต้องหรือไม่

เป็นรูปธรรมมากขึ้น

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

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

ดังนั้นคุณสามารถเขียนการทดสอบหน่วยสำหรับคุณCheeseMeltCalculatorที่ให้ 100 กรัมเกาดาและชีสเอมเมนตัล 200 กรัมจากนั้นตรวจสอบอุณหภูมิและเวลาที่ถูกต้อง นั่นหมายความว่าตอนนี้คุณสามารถมั่นใจได้ว่าสามารถCheeseMeltCalculatorใช้ได้กับ 100 Gouda และชีส 200 กรัม ตอนนี้ถ้าคุณทำซ้ำการทดสอบนี้ด้วย 300 กรัมเกาดาแทนที่จะเป็น 200 กรัมคุณสามารถมั่นใจได้เลยว่ามันทำงานได้อย่างถูกต้องสำหรับค่าที่แตกต่างกัน คุณสามารถเพิ่มการทดสอบ0, -1และint.MaxValueกรัมของเกาจะมีความมั่นใจว่ารหัสไม่ได้เดินทางขึ้นไป (หรือการเดินทางอย่างถูกต้องตามที่ตั้งใจไว้) สำหรับการป้อนข้อมูลที่แปลก

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

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

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

เรื่องสั้นสั้น

ประเด็นคือคุณไม่สามารถทำการทดสอบได้ "ทำงานได้อย่างถูกต้อง" คุณสามารถทดสอบ "ถ้าฉันทำ X, Y เกิดขึ้น"

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

ข้อมูลเพิ่มเติม

ผู้ใช้ Richard เพิ่มข้อมูลนี้ในการแก้ไข:

Martin Fowler มีบทสรุปที่ดีมากในเว็บไซต์ของเขาเกี่ยวกับกลยุทธ์ที่พบบ่อยที่สุด: https://martinfowler.com/articles/microservice-testing/

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

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


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

@ Stonefruit ไม่จริง แต่ฉันคิดว่าฉันมีคำตอบที่คุณต้องการ: Testivus On Coverage Test
R. Schmitz

@ Stonefruit เกี่ยวกับตัวเลขในอุปมา 80% นั่นเป็นตัวเลขที่คุณได้ยินบ่อยกว่าในบริบทนี้ สาเหตุหลักมาจากหลักการ pareto - ความครอบคลุม 20% สุดท้ายคือ 80% ของงาน พูดอีกอย่างคือมันทำงานได้มากถึง 4 เท่าจาก 80% ถึง 100% เพราะมันจะได้มากถึง 80% ในตอนแรก นั่นคือมักจะ overkill แต่คิดว่าคุณเขียนโค้ดควบคุมกำลังดาวเทียม: ถ้าข้อผิดพลาดปรากฏขึ้นคุณก็ไม่สามารถแก้ไขปัญหาที่; รับความคุ้มครองถึง 100% เป็นการลงทุนที่คุ้มค่า
R. Schmitz

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

1
@ Stonefruit บางทีคุณอาจเป็นคนแรก หากคุณมีโครงการที่มีอยู่ซึ่งมีความคุ้มครองเป็น 0% อย่าเริ่มต้นความตายเป็น 80% จริงๆแล้ว " แค่เขียนแบบทดสอบที่ดี " อาจใช้ครึ่งหลังของวันศุกร์เพื่อเขียนข้อสอบ จากประสบการณ์ของฉันคุณจะได้รับการทดสอบโดยอัตโนมัติด้วยอัตราส่วนการได้รับรางวัลความพยายามที่ดีที่สุดก่อนและการทดสอบทุกครั้งจะทำให้คุณมีความมั่นใจมากขึ้น
R. Schmitz

4

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

"การวัด" เดียวที่ฉันพบที่ทำให้ฉันมั่นใจในการครอบคลุมการทดสอบของเราคือ:

  1. จำนวนข้อบกพร่องที่พบในการผลิต
  2. คุณสามารถ refactor ฐานรหัสและพึ่งพาการทดสอบครอบคลุมเพื่อตรวจจับข้อบกพร่องการถดถอย?

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

เมตริกเดียวที่คุณสามารถวัดได้คือ "คุณส่งมอบซอฟต์แวร์ที่ดีกว่านี้หรือไม่"

และถึงตอนนั้นมันเป็นเรื่องส่วนตัว


เปรียบเทียบกับคำตอบอื่น ๆ คำตอบนี้เน้นที่ตัวชี้วัดที่เป็นไปได้ ฉันกำลังคิดที่จะทำให้ตัวชี้วัดที่แนะนำมีความหมายมากขึ้น นอกเหนือจากการค้นหาจำนวนข้อบกพร่องที่พบในการผลิตแล้วให้คะแนนแต่ละข้อบกพร่องตามการบริหารความเสี่ยงและกำหนดเกณฑ์ (เช่น 30 คะแนนข้อบกพร่องที่พบใน 3 เดือนที่ผ่านมา) ถึงเกณฑ์อาจบ่งชี้ว่าทำการทบทวนระบบสำหรับข้อผิดพลาดที่เป็นไปได้ก่อนที่หนี้ทางเทคนิคสำหรับรหัสรถเพิ่มขึ้นชี้แจง
Stonefruit

2

คุณมีการทดสอบอัตโนมัติเพียงพอที่จะมั่นใจในขั้นตอนการรวมระบบอย่างต่อเนื่องของคุณเมื่อใด

ในสภาพแวดล้อมทางเศรษฐกิจส่วนใหญ่คุณจะไม่มีงบประมาณในการใช้ความมั่นใจมากพอ (> 99%) แต่คุณต้องจัดการงบประมาณที่ จำกัด : ทั้งหมดเกี่ยวกับอัตราส่วนต้นทุน / ผลประโยชน์

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

เป้าหมายย่อยหนึ่งของการพัฒนาที่อ่อนนุ่มคือการสร้างสถาปัตยกรรมที่ง่าย / ถูกในการทดสอบ (ออกแบบเพื่อความสามารถในการทดสอบโดยใช้Test-driven_development ) เพื่อให้การทดสอบแบบอัตโนมัติมีราคาไม่แพง

ฉันคิดว่าPareto_principleสามารถนำไปใช้กับซอฟต์แวร์ที่สามารถบำรุงรักษา / ทดสอบได้ที่นี่เช่นกัน: มันบอกว่าด้วยการใช้จ่ายเงินพิเศษมากขึ้น 20% คุณจะได้รับประโยชน์พิเศษ 80% เพื่อให้ได้ผลประโยชน์ที่เหลืออีก 20% คุณจะต้องใช้เงินพิเศษ 80%

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

แต่ถึงแม้ว่าจะครอบคลุม 100% คุณก็ไม่สามารถมั่นใจได้ว่าโค้ดของคุณปราศจากข้อบกพร่อง

การจัดการชอบ codemetrics หาก "การครอบคลุมรหัส> = 80%" ถูกบังคับใช้โดยฝ่ายบริหารในขณะที่ผู้พัฒนาไม่สนับสนุน / เหมือนการทดสอบอัตโนมัติมีวิธีเขียนรหัสที่มีการครอบคลุมสูงซึ่งไม่ได้พิสูจน์สิ่งที่ให้ความปลอดภัยที่ผิดพลาด


1

เคล็ดลับที่นี่ไม่ต้องกังวลเกี่ยวกับความคุ้มครองที่สมบูรณ์ แต่ในการจัดการความเสี่ยงของการเปลี่ยนแปลงของคุณ

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

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

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

แต่เดี๋ยวก่อน ... บรรทัดนี้ไม่ตรงกับจุด CI และ CD หรือไม่?

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

TLDR

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


0

เป็นตัวชี้วัดเดียวกับเมื่อคุณทดสอบผลิตภัณฑ์ของคุณด้วยตนเอง

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

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

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