iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0

在Python中,單元測試是一種用來檢查代碼各個功能是否按照預期運行的方法。Python提供了一個內建的模塊 unittest 來實現單元測試,它讓我們可以對代碼進行測試、組織測試、並生成測試報告。

壹、 unittest 模塊介紹

unittest 是Python標準庫中的一部分,可以用來對代碼進行測試。它支持:

  • 測試用例的編寫
  • 測試組的組織
  • 測試報告生成
  • 錯誤和異常處理

要使用 unittest,需要繼承 unittest.TestCase 並編寫測試方法。通常,測試方法以 test_ 開頭。

一、簡單示例

以下是一個使用 unittest 進行簡單單元測試的範例:

import unittest

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

class TestMathOperations(unittest.TestCase):
    
    def test_add(self):
        self.assertEqual(add(3, 5), 8)  # 測試 3 + 5 是否等於 8
        self.assertEqual(add(-1, 1), 0)  # 測試 -1 + 1 是否等於 0
    
    def test_subtract(self):
        self.assertEqual(subtract(10, 5), 5)  # 測試 10 - 5 是否等於 5
        self.assertEqual(subtract(-1, 1), -2)  # 測試 -1 - 1 是否等於 -2

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

二、測試結果

當運行這個腳本時,unittest 會自動執行所有以 test_ 開頭的函數,並檢查它們是否通過測試。輸出結果如下:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

這表明有兩個測試通過了。每個 . 代表一個通過的測試。

貳、常用的斷言方法

unittest.TestCase 提供了一些斷言方法來幫助你檢查代碼是否按照預期運行。常用的斷言方法包括:

  • assertEqual(a, b):檢查 a 和 b 是否相等
  • assertNotEqual(a, b):檢查 a 和 b 是否不相等
  • assertTrue(x):檢查 x 是否為真
  • assertFalse(x):檢查 x 是否為假
  • assertIs(a, b):檢查 a 和 b 是否是同一對象
  • assertIsNone(x):檢查 x 是否為 None
  • assertIn(a, b):檢查 a 是否在 b 中
  • assertRaises(exception, callable, *args, **kwds):檢查是否拋出指定異常

一、使用 assertEqual() 檢查結果

def multiply(x, y):
    return x * y

class TestMultiply(unittest.TestCase):
    
    def test_multiply(self):
        self.assertEqual(multiply(3, 4), 12)
        self.assertEqual(multiply(0, 10), 0)

二、使用 assertRaises() 測試異常

assertRaises() 用來測試某個方法是否會拋出指定的異常。如下例所示,我們期望 divide() 方法當除以零時拋出 ZeroDivisionError

def divide(x, y):
    if y == 0:
        raise ValueError("不能除以零")
    return x / y

class TestDivide(unittest.TestCase):
    
    def test_divide_by_zero(self):
        with self.assertRaises(ValueError):
            divide(10, 0)

上一篇
第28天:JSON操作
下一篇
第30天:單元測試 part2
系列文
python30天入門學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言