บทช่วยสอน PyUnit: Python กรอบการทดสอบหน่วย (พร้อมตัวอย่าง)

⚡ สรุปอย่างชาญฉลาด

Python การทดสอบหน่วย (Unit Testing) ตรวจสอบส่วนเล็กๆ ของโค้ดของคุณแบบแยกส่วน เพื่อตรวจจับข้อผิดพลาดตั้งแต่เนิ่นๆ ในที่นี้คุณจะได้เรียนรู้เทคนิคการทดสอบหน่วย เฟรมเวิร์ก PyUnit (unittest) คลาสหลักๆ วิธีการออกแบบกรณีทดสอบ และตัวอย่างการทำงานจริง

  • 🧪 มันคืออะไร: การทดสอบหน่วย (Unit testing) ตรวจสอบโค้ดส่วนเล็กๆ ที่แยกออกจากกัน เพื่อตรวจจับข้อผิดพลาดตั้งแต่เนิ่นๆ
  • 🔬 เทคนิค: TDD, stubs และ mocks ช่วยแยกโค้ด ทำให้การทดสอบหน่วยเป็นอิสระต่อกัน
  • 🐍 หน่วยไพ: Pythonโมดูล unittest ในตัวของ (PyUnit) เป็นการพอร์ตมาจาก JUnit.
  • 🧱 วิชาหลัก: TestCase, TestSuite, TestLoader, TextTestRunner และ TestResults
  • 🤖 ความช่วยเหลือจาก AI: เครื่องมือ AI เช่น Copilot สร้างเคสทดสอบหน่วย (unittest) ได้ทันที

Python การทดสอบหน่วย

การทดสอบหน่วยคืออะไร?

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

การทดสอบหน่วยคือการทดสอบระดับรหัสสคริปต์ที่ออกแบบ Python เพื่อตรวจสอบ "หน่วย" การทำงานขนาดเล็ก การทดสอบหน่วยเป็นเฟรมเวิร์กเชิงวัตถุที่อิงตามฟิกซ์เจอร์ทดสอบ

Python เทคนิคการทดสอบหน่วย

Python การทดสอบหน่วยส่วนใหญ่เกี่ยวข้องกับการทดสอบโมดูลเฉพาะโดยไม่ต้องเข้าถึงโค้ดที่ต้องพึ่งพาใดๆ นักพัฒนาสามารถใช้เทคนิคต่างๆ เช่น stubs และ mocks เพื่อแยกโค้ดออกเป็น “หน่วย” และทำการทดสอบระดับหน่วยกับแต่ละส่วนได้

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

    ความตั้งใจของทั้งสองวิธีเหมือนกันในการกำจัดการทดสอบการขึ้นต่อกันทั้งหมดของคลาสหรือฟังก์ชัน

Python กรอบการทดสอบหน่วย

เพื่อให้กระบวนการทดสอบหน่วยง่ายขึ้นและปรับปรุงคุณภาพของโครงการของคุณ ขอแนะนำให้ Python กรอบการทดสอบหน่วย กรอบการทดสอบหน่วยประกอบด้วย

Python เทคนิคการทดสอบหน่วย

  • หน่วยไพ: PyUnit รองรับฟิกซ์เจอร์ กรณีทดสอบ ชุดทดสอบ และตัวดำเนินการทดสอบสำหรับการทดสอบโค้ดอัตโนมัติ ใน PyUnit คุณสามารถจัดระเบียบกรณีทดสอบเป็นชุดที่มีการติดตั้งแบบเดียวกันได้
  • จมูก: ปลั๊กอินในตัวของ Nose ช่วยคุณในการจับภาพเอาต์พุต การครอบคลุมโค้ด การทดสอบเอกสาร ฯลฯ ไวยากรณ์ของจมูกค่อนข้างง่ายกว่าและลดอุปสรรคในการเขียนการทดสอบ มันขยายออกไป Python unittest เพื่อให้การทดสอบง่ายขึ้น
  • อาจารย์ : สคริปต์การทดสอบ Doctest อยู่ใน docstring พร้อมฟังก์ชันขนาดเล็กที่ด้านล่างของไฟล์ Doctest ช่วยให้คุณสามารถทดสอบโค้ดของคุณโดยการรันตัวอย่างที่รวมอยู่ในเอกสารประกอบ และตรวจสอบว่าตัวอย่างเหล่านั้นส่งคืนผลลัพธ์ที่คาดหวัง กรณีการใช้งานของ doctest มีรายละเอียดน้อยกว่าและไม่รองรับกรณีพิเศษ สิ่งเหล่านี้มีประโยชน์ในฐานะเอกสารประกอบที่ชัดเจนเกี่ยวกับกรณีการใช้งานหลักของโมดูลและส่วนประกอบต่างๆ

การทดสอบหน่วยด้วย PyUnit

พยูนเป็น Python พอร์ตของ JUnit- ในฐานะส่วนหนึ่งของ Pyunit ในโมดูล unittest จะมีคลาสหลักอยู่ห้าคลาส

การทดสอบหน่วยด้วย PyUnit

  • คลาส TestCase: คลาส TestCase รองรับขั้นตอนการทดสอบและจัดเตรียมขั้นตอนสำหรับการทำแต่ละขั้นตอนและการทำความสะอาดหลังจากนั้น
  • คลาส TestSuite: ทำหน้าที่เป็นคอนเทนเนอร์คอลเลกชัน และสามารถมีวัตถุชุดทดสอบได้หลายรายการและวัตถุชุดทดสอบหลายรายการ
  • คลาส TestLoader: คลาสนี้โหลดกรณีทดสอบและชุดที่กำหนดในเครื่องหรือจากไฟล์ภายนอก โดยจะปล่อยออบเจ็กต์ชุดทดสอบที่มีห้องชุดและเคสเหล่านั้นออกมา
  • คลาส TextTestRunner: เพื่อดำเนินการทดสอบ จะมีแพลตฟอร์มมาตรฐานสำหรับดำเนินการทดสอบ
  • คลาส TestResults: มีภาชนะมาตรฐานสำหรับผลการทดสอบ

การออกแบบกรณีทดสอบสำหรับ Python การทดสอบโดยใช้ PyUnit

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

การออกแบบกรณีทดสอบสำหรับ Python

unittest.TestCase

setUp()
teardown()

skipTest(aMesg:string)
fail(aMesg:string)

id():string
shortDescription():string

ชุดแรกเป็นตะขอทดสอบก่อนและหลัง วิธีการตั้งค่า () เริ่มต้นก่อนรูทีนการทดสอบแต่ละครั้ง และการแยกส่วน () หลังจากรูทีน

วิธีชุดที่สองควบคุมการดำเนินการทดสอบ ทั้งสองวิธีใช้สตริงข้อความเป็นอินพุต และทั้งสองวิธียกเลิกการทดสอบที่กำลังดำเนินอยู่ แต่เมธอด skiktest() จะยกเลิกการทดสอบปัจจุบัน ในขณะที่เมธอด failed() ล้มเหลวโดยสิ้นเชิง

วิธีสุดท้ายหรือที่สามช่วยในการกำหนดการทดสอบ วิธีการ id() ส่งคืนสตริงที่ประกอบด้วยชื่อของวัตถุ testcase และของรูทีนการทดสอบ และวิธีการสั้นๆDescription() ส่งคืนความคิดเห็น docstr เมื่อเริ่มต้นรูทีนการทดสอบแต่ละอัน

Python ตัวอย่างการทดสอบหน่วย

ตัวอย่างด้านล่างนี้ทดสอบฟังก์ชัน add() อย่างง่ายโดยใช้โมดูล unittest เมธอดแต่ละตัวที่มีคำนำหน้า test_ จะทำงานโดยอัตโนมัติ และ assertEqual จะตรวจสอบผลลัพธ์เทียบกับค่าที่คาดหวัง

import unittest

def add(a, b):
    return a + b

class TestAdd(unittest.TestCase):
    def test_add_positive(self):
        self.assertEqual(add(2, 3), 5)

    def test_add_negative(self):
        self.assertEqual(add(-1, -1), -2)

if __name__ == "__main__":
    unittest.main()

บันทึกโค้ดแล้วรันด้วยคำสั่ง `python filename.py` โปรแกรม unittest จะรายงานจำนวนการทดสอบที่ผ่านหรือล้มเหลว

ข้อดีของการใช้ Python การทดสอบหน่วย

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

คำถามที่พบบ่อย

การทดสอบหน่วย (Unit testing) ตรวจสอบโค้ดส่วนเล็กๆ เช่น ฟังก์ชัน ในสภาพแวดล้อมที่แยกเป็นอิสระ ช่วยตรวจจับข้อผิดพลาดได้ตั้งแต่ช่วงเริ่มต้นของการพัฒนา ซึ่งจะทำให้การแก้ไขทำได้ง่ายและประหยัดค่าใช้จ่ายมากขึ้น

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

สร้างคลาสย่อยของ unittest.TestCase เขียนเมธอดที่ขึ้นต้นด้วย test_ และใช้ assertion เช่น assertEqual ภายในเมธอดเหล่านั้น เรียกใช้ไฟล์ด้วย unittest.main() เพื่อทำการทดสอบทั้งหมด

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

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

ผู้ช่วย AI อย่าง GitHub Copilot จะสร้างเคสทดสอบ unittest จากฟังก์ชัน แนะนำ edge cases และ assertions และสร้าง mock สำหรับ dependency ในขณะที่คุณเขียนโค้ด

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

การทดสอบหน่วยคือ Python`python.js` เป็นเฟรมเวิร์กในตัวที่ใช้คลาสและเมธอด `assert` ในขณะที่ `pytest` เป็นไลบรารีภายนอกที่มีคำสั่ง `assert` ที่เรียบง่ายกว่าและมีฟิกซ์เจอร์ที่มีประสิทธิภาพ ทั้งสองอย่างสามารถรันการทดสอบหน่วยได้

สรุปโพสต์นี้ด้วย: