ฉันควรใช้ลองจับในวิธีการทดสอบของฉัน?


18

ฉันกำลังทำการทดสอบหน่วย

ฉันพยายามทดสอบหนึ่งฟังก์ชัน

ฉันเรียกมันจากองค์ประกอบการทดสอบของฉัน แต่ถ้าฟังก์ชั่นระยะไกลไม่สามารถจัดการกับข้อยกเว้นส่วนประกอบทดสอบของฉันจะได้รับการยกเว้นฉันเดา

ดังนั้นฉันจึงควรกังวลเกี่ยวกับการได้รับการยกเว้นในองค์ประกอบทดสอบของฉัน?

ขอบคุณ

แก้ไข:

PS:

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

OMG ฉันเขียนใบเสนอราคาการเขียนโปรแกรม !!


ฉันยังใหม่กับการทดสอบและฉันควรทดสอบพฤติกรรมของฟังก์ชันเท่านั้น ฉันคิดว่ามันเรียกว่าการทดสอบ blackbox และ whitebox โอ้ฉันจำได้ ฉันเรียนที่วิทยาลัย!
Vikas

คุณใช้ภาษาและกรอบ xUnit แบบใดโดยเฉพาะ ฉันจะโต้แย้งว่าใช่ในบางกรณี
เกร็ก K

ฉันใช้MXUnitกับMockBox และ ColdBoxสำหรับภาษา ColdFusion
Vikas

คำตอบ:


23

คำตอบสั้น ๆ : ไม่

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

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


ฉันคิดว่ากรอบการทดสอบขั้นสูงสามารถจัดการข้อยกเว้นได้เป็นอย่างดีแม้ฉันจะพบว่าใน Visual Studio เราสามารถทดสอบข้อยกเว้นเช่นเดียวกับที่คุณพูดว่า "ข้อยกเว้นที่คาดไว้" ดังนั้นจึงเป็นเรื่องดีที่จะรู้และแบ่งปัน ขอบคุณ ..
Vikas

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

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

1
@Jwenting อ่านย่อหน้าที่สอง - กรอบการทดสอบหน่วยจับข้อยกเว้นและอนุญาตให้ทดสอบผ่านหากมีข้อยกเว้นบางอย่างเพิ่มขึ้นและล้มเหลวหากพวกเขาไม่ใช่
mcottle

5

(ตรงกันข้ามกับคำตอบของ mcottle) คำตอบยาว: ไม่ ... ส่วนใหญ่

เมื่อคุณพูดว่าคุณคาดว่าการทดสอบจะเพิ่มข้อยกเว้นเฉพาะคุณจะรู้ว่าเมื่อใดที่บรรทัดใด ๆ ในการทดสอบนั้นยกข้อยกเว้นนั้นขึ้น

นั่นไม่ใช่สิ่งเดียวกันกับที่รู้ว่าวิธีการทดสอบจะทำให้เกิดข้อยกเว้น

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

ตัวอย่างเช่น

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

แล้ว

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

หากการทดสอบนี้ล้มเหลวฉันรู้ว่าวิธีการของฉันภายใต้การทดสอบนั้นทำให้เกิดข้อยกเว้นและไม่ใช่บางอย่างในการตั้งค่าแบบสุ่ม

(คุณควรลองและหลีกเลี่ยงการตั้งค่าแบบสุ่มบางครั้งจะง่ายกว่าที่จะมีรหัสการตั้งค่าในการทดสอบ)


เป็นตัวอย่างที่ดี! ฉันพยายามระวังอย่างมากเกี่ยวกับการ จำกัด ระยะ "ทดสอบ" เป็นเพียงการทดสอบที่แม่นยำ แต่ฉันจะจำเคล็ดลับนี้ได้เมื่อฉันไม่สามารถหาวิธีที่จะดึงสิ่งนั้นออกได้ (เช่นเมื่อทดสอบสภาพการแข่งขัน และต้องการ 'ตั้งค่า' ใกล้กับ 'ทดสอบ' เพื่อให้ตรงกับเงื่อนไข)
Ethel Evans

1

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


แต่ในวิธีการของ TDD เราคาดว่าจะทำตามขั้นตอนดังกล่าว:

  1. เขียนทดสอบ
  2. ดูมันล้มเหลวและทำให้เข้าใจผิดได้
  3. แก้ไขรหัส
  4. refactor รหัสและการทดสอบ

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

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