จะจำลองเหตุการณ์ที่ทำให้เกิดข้อยกเว้นเพื่อทดสอบบล็อกลอง / จับได้อย่างไร


14

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

แม้ว่าฉันส่วนใหญ่จะพัฒนาโดยใช้ C # /. NET / Visual Studio คำตอบหรือแหล่งข้อมูลที่เกี่ยวข้องกับภาษาอื่นอาจมีประโยชน์


วิธีแก้ปัญหาที่เป็นไปได้อีกวิธีหนึ่งได้อธิบายไว้ในบทความ MSDN นี้: การทดสอบการฉีดผิดพลาดด้วย TestApi
Giorgi

คำตอบ:


13

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

ชอบ:

public class SqlUsersRepository : IUsersRepository
{
    public void RegisterNewUser (User newUser)
    {
        throw new SqlException ("Connection timeout");
    }
}

อย่างไรก็ตามที่นี่เราจะมีปัญหาว่ารหัสผู้ใช้ไม่ควรเกี่ยวข้องกับการจัดการข้อยกเว้นการใช้งานที่เป็นรูปธรรม

2) วิธีการอีกวิธีหนึ่งคือการแทนที่การเรียกเมธอดบางอย่างด้วย wrappers ที่กำหนดเองของคุณ

แทน:

FileStream fs = File.OpenRead (path);

คุณใช้:

FileStream fs = File.OpenRead_Test (path);

โดยการให้วิธีการขยายที่กำหนดเอง (เพียงแค่ความคิดด่วน):

public static FileStream OpenRead_Test (this System.IO.File file, string path)
{
    throw new FileNotFoundException ();
}

3

คุณต้องดูที่กรอบการเยาะเย้ย

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

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

public void Test1()
{
    throw new NullArgumentException();
}

การทดสอบของคุณจะผ่านเมื่อรหัสของคุณจัดการอย่างถูกต้อง


3

การเยาะเย้ยและการฉีดจะช่วยพาคุณไปได้ไกลและต้องการการเปลี่ยนแปลงครั้งใหญ่ในบางกรณี

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

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


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