編程學習網 > 編程語言 > Python > python單元測試unittest入門初探教程
2023
07-24

python單元測試unittest入門初探教程

本文先通過基本概念的簡單介紹,再以一個簡單的Python項目為例,講解在工程實踐中如何通過unittest編寫測試用例,同時也簡單介紹了unittest的一些常用寫法。

什么是單元測試?

單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對于Python來說,最小可測試單元就是函數或者方法。

Python支持的測試庫有pytest 、unittest等,這篇文件主要介紹如何使用Python內置的標準庫unittest編寫單元測試用例。

項目結構
首先需要介紹一下整個項目的一個目錄結構:

.
├── example.py  # 入口文件
├── tests  # 測試文件
│   ├── __init__.py
│   └── test_vector.py
└── vector  # 所有核心代碼
    ├── __init__.py
    └── vector.py
項目代碼如下:

# vector/__init__.py
from .vector import Vector

# vector/vector.py
class Vector:
    def __init__(self, x, y):
        if isinstance(x, (int, float)) and \
           isinstance(x, (int, float)):
            self.x = x
            self.y = y
        else:
            raise ValueError("not a number")
編寫第一個測試用例
我們在'tests'目錄下,以'test_'開頭創建一個Python文件,例如項目中的'test_vector.py'文件,我們后面所有的測試代碼都在里面編寫運行。

通過unittest編寫測試用例,需要繼承unittest.TestCase創建一個類,類名建議以'Test'開頭或結尾,而類方法則一定要以'test_'開頭。

下面的測試用例分別測試了x是否等于1,y是否等于2:

import unittest
from vector import Vector


class TestVector(unittest.TestCase):
    def test_init(self):
        v = Vector(1, 2)
        self.assertEqual(v.x, 1)
        self.assertTrue(v.y == 2)

編寫完成后只需要在項目根目錄下輸入以下命令:

python -m unittest
Python就會在你的目錄中自動尋找測試代碼,并且自動運行測試用例,運行結果如下:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
具體提供哪些測試方法,我們可以參考一下unittest[1]官方文檔。

從上面示例可以看到,官方提供了assertTrue方法,既然如此,為什么我們不直接全部使用這個方法就好了?其他方法還有什么作用呢?

下面對assertEqual和assertTrue做一個簡單對比,來說明其他方法的意義。

先看看assertEqual如果測試不通過,會報什么錯誤:

import unittest
from vector import Vector


class TestVector(unittest.TestCase):
    def test_init(self):
        v = Vector(1, 2)
        self.assertEqual(v.x, 0)
        # self.assertTrue(v.x == 0)

測試結果:

F
======================================================================
FAIL: test_init (tests.test_vector.TestVector)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/xuzhanhong/Development/Git/PythonNotes/測試/tests/test_vector.py", line 8, in test_init
    self.assertEqual(v.x, 0)
AssertionError: 1 != 0

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)
我們看報錯就知道v.x是1,不等于0。

如果我們是使用assertTrue方法,再看一下報錯:

F
======================================================================
FAIL: test_init (tests.test_vector.TestVector)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/xuzhanhong/Development/Git/PythonNotes/測試/tests/test_vector.py", line 9, in test_init
    self.assertTrue(v.x == 0)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)
那我們只能得到False is not true的錯誤提示,并不知道為什么上面的等式是False。

所以說其他方法也有自己的意義,而不是直接梭哈assertTrue方法就好了。

其他常見測試需求
在測試前后分別執行一些操作
如果想在測試類運行測試之前跟運行結束之后進行一些操作的話,就需要用到setUpClass和tearDownClass:

import unittest
from vector import Vector


class TestVector(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print('start')

    @classmethod
    def tearDownClass(cls):
        print('end')

    def test_init(self):
        v = Vector(1, 2)
        self.assertEqual(v.x, 1)
        self.assertTrue(v.y == 2)

這樣在運行所有測試方法的時候都會自動執行setUpClass和tearDownClass方法了:

start
.end

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
跳過某些情況
還有一個很常見的需求就是希望我的測試在某些情況下不運行,這種時候就需要用到unittest.skipIf裝飾器。

這個裝飾器傳入兩個參數,第一個參數是一個boolean,當條件成立測試不運行,第二個參數則是提示信息。

下面的示例表示這個測試不在Python3.8以下版本運行:

  @unittest.skipIf(sys.version_info < (3, 8),
                   "Only support 3.8+")
  def test_init(self):
      v = Vector(1, 2)
      self.assertEqual(v.x, 1)
      self.assertTrue(v.y == 2)

由于我的Python版本是3.7,所以運行時會顯示跳過:

start
send

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK (skipped=1)
同理,我們可以編寫其他的跳過條件,例如跳過Windows系統,跳過某些變量值等等。

小結
本文主要內容小結:

單元測試基礎概念。
Python工程實踐項目結構。
如何使用unittest編寫運行一個測試用例。

unittest常用寫法。

以上就是python單元測試unittest入門初探教程的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取