หากคุณควรมีเพียงหนึ่งการยืนยันต่อการทดสอบ; วิธีทดสอบหลายอินพุต


15

ฉันกำลังพยายามสร้างกรณีทดสอบและได้อ่านว่าคุณควรลองและ จำกัด จำนวนการยืนยันต่อกรณีทดสอบ

ดังนั้นคำถามของฉันคือวิธีที่ดีที่สุดในการทดสอบฟังก์ชั่นที่มีอินพุตหลายอินพุต ตัวอย่างเช่นฉันมีฟังก์ชั่นที่แยกวิเคราะห์สตริงจากผู้ใช้และส่งกลับจำนวนนาที สตริงสามารถอยู่ในรูปแบบ"5w6h2d1m"ที่w, h, d, mสอดคล้องกับจำนวนสัปดาห์ชั่วโมงวันและนาที

หากฉันต้องการปฏิบัติตาม 'การยืนยันที่ 1 ต่อกฎการทดสอบ' ฉันต้องทำการทดสอบหลายอย่างสำหรับแต่ละรูปแบบของอินพุตหรือไม่ ดูเหมือนว่างี่เง่าดังนั้นฉันจึงมีบางอย่างเช่น

self.assertEqual(parse_date('5m'), 5)
self.assertEqual(parse_date('5h'), 300)
self.assertEqual(parse_date('5d') ,7200)
self.assertEqual(parse_date('1d4h20m'), 1700)

ในกรณีทดสอบหนึ่ง มีวิธีที่ดีกว่า?


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

คำตอบ:


23

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

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

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

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


17

มันขึ้นอยู่กับห้องสมุดทดสอบของคุณเป็นอย่างมาก ในไลบรารี C # NUnit คุณสามารถทำสิ่งต่อไปนี้

[TestCase('5m', 5)]
[TestCase('5h', 300)]
[TestCase('5d', 7200)]
[TestCase('1d4h20m', 1700)]
public void ParseDateTest(inputString, expectedMinutes)
{
    Assert.That(parse_date(inputString), Is.EqualTo(expectedMinutes));
}

ใน java กับ TestNG คุณมีวิธีการ @DataProvider
Kemoda

นั่นเป็นทางออกที่ดีที่สุด IMHO ในเกือบทุกภาษาคุณสามารถกำหนดพารามิเตอร์การทดสอบของคุณได้ สำหรับ java: @Parameterized , JunitParams , Zohhak
piotrek

3

ใช่ทำการทดสอบหลายรายการสำหรับรูปแบบการป้อนข้อมูลแต่ละแบบ

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

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

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


1

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

เมื่อทดสอบกับ JUnit เราสามารถแก้ไขได้โดยใช้เมธอด assert * กับอาร์กิวเมนต์ String เริ่มต้นเพื่อแยกการยืนยันหนึ่งจากอีกวิธีหนึ่งในวิธีทดสอบเดียวกัน

self.assertEqual("just minutes", parse_date('5m'), 5)
self.assertEqual("just hours", parse_date('5h'), 300)
self.assertEqual("just days", ('5d') ,7200)
self.assertEqual("days, hours, minutes", parse_date('1d4h20m'), 1700)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.