คุณจะเขียนการทดสอบสำหรับรหัสที่ขึ้นอยู่กับการใช้งานภายนอกที่เป็นรูปธรรมที่ไม่สามารถเยาะเย้ยได้อย่างไร


17

ข้อมูลประกอบ: ฉันคิดว่าจะพยายามนำเสนอแนวคิดของการทดสอบหน่วยกับเพื่อนร่วมงานของฉันโดยสร้างบางอย่างสำหรับโมดูลที่ฉันทำงานอยู่ ข้อกำหนดของมันเพิ่งเปลี่ยนไปและต้องการ abstractions / interactions เพิ่มเติมดังนั้นจึงเป็นวิธีที่ดีในการพัฒนาชุดการทดสอบที่จะ "พิสูจน์" ว่าใช้งานได้โดยไม่ต้องใช้แอปพลิเคชันด้วยตนเอง

อย่างไรก็ตามปัญหาคือโมดูลนั้นขึ้นอยู่กับปัจจัยภายนอกที่ไม่สามารถยกเลิกได้เช่น PDF และ XSL โดยทั่วไปฉันอ่าน XML จากฐานข้อมูลและใช้การแปลง XSL กับมันจากนั้นแปลงเป็น PDF โดยใช้ไลบรารีที่เรียกว่า ABCPDF PDF นี้จะถูกรวมเข้ากับ PDF อื่นตามแม่แบบคงที่ ฉันรู้ว่าฉันสามารถทดสอบ XML และตรวจสอบให้แน่ใจว่าค่านั้นถูกต้อง แต่ข้อบกพร่องที่เป็นไปได้จำนวนมากและปัญหาที่เกี่ยวข้องกับการแสดงผลที่แท้จริงของเอกสารที่เสร็จแล้ว - เช่น minutiae เช่นสตริงข้อความยาวแค่ไหน ตั้งอยู่ในความสัมพันธ์กับเอกสาร ฯลฯ เป็นไปได้หรือไม่ที่จะทดสอบสิ่งเหล่านี้ (ฉันรู้ว่าสิ่งเหล่านี้อาจเป็นการทดสอบการรวมหรือการทดสอบประเภทที่สามที่ชื่อฉันลืม [ไม่ใช่แบบทดสอบการยอมรับประเภทอื่น] และไม่ใช่หน่วย การทดสอบ) เนื่องจากฉันไม่สามารถรู้ได้ว่าจะลอกแบบ PDF สั้น ๆ ง่ายๆจากการสร้างจากนั้นอ่านกลับหรือสร้างสตริง HTML (เช่นแปลง XML) และแยกวิเคราะห์ด้วยมือเพื่อตรวจสอบว่ามีเซลล์ตารางบางตัวใน ความสัมพันธ์กับเซลล์ตารางอื่น ๆ

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


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

2
ฉันไม่ได้ซื้อ "unmockable" ฉันจะยอมรับ "ที่ฉันไม่รู้วิธีการเยาะเย้ย" ซึ่งก็หมายความว่าคำถามที่แท้จริงของคุณคือ "ฉันจะเยาะเย้ยมันได้อย่างไร"
Rein Henrichs

อาจเป็นไปได้ :) ฉันคุ้นเคยกับการล้อเลียน XML ที่ใช้ แต่ไม่ใช่วิธีการจำลอง PDF จริงหรือเอกสาร HTML ที่การจัดรูปแบบมีความสำคัญ
Wayne Molina

1
ฉันคิดว่าคุณหมายถึงการทดสอบ "ใช้งานได้" (จบแอพพลิเคชั่น) หรือ "ระบบ" (จบแอพพลิเคชั่นหลายแอพ) จบสิ้น
Gary Rowe

@Gary - ใช่ฟังก์ชั่นคือคำว่า ฉันจำได้ตอนนี้จากการเรียนรู้ Rails: แบบทดสอบหน่วย, ตัวควบคุมการทดสอบหน้าที่, การรวมการทดสอบทุกอย่าง
Wayne Molina

คำตอบ:


13

ทดสอบคุณสมบัติไม่ใช่เครื่อง

การใช้อินพุต xml ที่รู้จักให้ส่งออก PDF และด้วยตนเอง จากนั้นบันทึกเป็นข้อมูลอ้างอิง

การทดสอบในอนาคตโดยใช้อินพุต xml เดียวกันสามารถทำการเปรียบเทียบไฟล์ไบนารีกับการอ้างอิง

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


+1 เนื่องจากคุณสนใจเฉพาะผลลัพธ์สุดท้ายที่ระดับนี้ หากคุณเปลี่ยนการใช้งานวิธีการรับ PDF คุณไม่ควรเปลี่ยนการทดสอบการทำงาน
Gary Rowe

2
+1 สำหรับคำแนะนำที่ดีนี่คือสิ่งที่เราทำในโครงการปัจจุบันของเรา เราสร้างชุดเครื่องมือแบบกำหนดเองสำหรับทำการเปรียบเทียบ PDF ซึ่งช่วยให้เราละเว้นการเปลี่ยนชิ้นส่วนในเอกสารเช่นการประทับเวลา ข้อแม้: การเปลี่ยนไปใช้ตัวแสดง PDF ที่แตกต่างกัน (เวอร์ชั่น) อาจทำให้เกิดการเปลี่ยนแปลงอย่างละเอียดในเลย์เอาต์ทำให้การเปรียบเทียบไบนารีโดยตรงกับกองสัญญาณของผลบวกปลอม
PéterTörök

5

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

public class PdfBuilder : IPdfBuilder
{
  public byte[] BuildPdf(...)
  {
    // actual untestable code here
  }
}

public interface IPdfBuilder
{
  byte[] BuildPdf(...);
}

จากนั้นคุณสามารถจำลอง IPdfBuilder ในการทดสอบเพื่อทำสิ่งที่คุณต้องการ บ่อยครั้งที่คุณต้องเริ่มใช้คอนเทนเนอร์ IoC ( /programming/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code)และ/programming/21288/which-net-dependency-injection-frameworks-are-worth-looking-intoเป็นสถานที่เริ่มต้น) หากคุณไม่ได้ใช้งานตอนนี้

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

แจ้งให้เราทราบหากนี่ไม่ชัดเจนทั้งหมด


+1 สำหรับการซ่อนรหัสที่ไม่สามารถทดสอบได้ จากนั้นคุณสามารถทำแบบทดสอบคู่มือจนกว่าคุณจะทำงานออกมาสิ่งที่ต้องข้ามอินเตอร์เฟซที่จะได้รับผลที่เหมาะสมและการทดสอบหน่วยที่ถูกสร้างขึ้นอย่างถูกต้องที่จะได้รับการทดสอบหน่วยการถดถอยของคุณ
Ethel Evans

1

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

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


มันแน่นมาก ๆ แต่เป็นพื้นที่ที่ฉันไม่สามารถแก้ไขได้เพราะไม่มีการบายอินเพื่อให้มันคู่กันอย่างหลวม ๆ และไม่มีทรัพยากรที่อุทิศให้กับการปรับโครงสร้างใหม่ (แต่นั่นเป็นปัญหาที่แตกต่างกันทั้งหมด)
Wayne Molina
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.