使用 Python unittest 模塊進行單元測試

已發表: 2021-11-08

沒有好的開發人員會在沒有徹底測試的情況下部署代碼。 單元測試是測試大型程序的各個模塊的過程。

本文將討論如何使用 Python unittest 模塊對代碼執行單元測試。 首先,讓我們了解一下測試的類型。

說到測試,有手動測試和自動測試。 手動測試是一種測試技術,其中人類在開發完成後手動執行測試。 自動化測試是一種測試技術,其中程序自動執行測試並將結果提供給我們。

您會明白手動測試既耗時又難以執行。 因此,開發人員編寫用於執行測試(自動測試)的代碼。 自動化測試中有不同類型的測試。 其中一些是單元測試、集成測試、端到端測試、壓力測試等,

讓我們看看標準的測試流程。

  • 編寫或更新代碼。
  • 為代碼的不同情況編寫或更新測試。
  • 運行測試(手動或使用測試運行器)。
  • 查看測試結果。 如果有任何錯誤,請修復它們並重複這些步驟。

在這裡,我們將討論稱為單元測試的最基本和最基本的測試類型。 事不宜遲,讓我們深入了解實際教程。

什麼是單元測試?

單元測試是一種測試一小塊獨立代碼的技術。 大多數情況下,小塊代碼將是一個函數。 獨立一詞意味著它不依賴於項目中的其他代碼段。

假設我們必須檢查一個字符串是否等於“Geekflare” 。 為此,我們編寫了一個函數,它接受一個參數並返回它是否等於“Geekflare”

 def is_equal_to_geekflare(string): return string == "Geekflare"

上述函數不依賴於任何其他代碼。 因此,我們可以通過提供不同的輸入來獨立測試它。 可以在整個項目中使用獨立的代碼段。

單元測試的重要性

一般來說,獨立塊代碼可以在整個項目中使用。 因此,它必須編寫好並經過測試。 單元測試是用於測試那些類型的獨立代碼塊的測試。 如果我們的項目不使用單元測試會發生什麼?

假設我們沒有測試整個項目中使用的小代碼塊。 所有其他測試,如集成測試、端到端測試等,使用其他小代碼塊可能會失敗。 這會破壞應用程序。 這就是為什麼必須很好地測試代碼的基本構建塊的原因。

現在,我們知道對所有獨立代碼塊進行單元測試和編寫單元測試的重要性。 由於我們執行了單元測試,因此其他測試,如集成測試、端到端測試等,不會因為獨立的代碼塊而失敗。

在接下來的部分中,我們將看到 Python unittest 模塊是什麼以及我們如何使用 unittest 模塊在 Python 中編寫單元測試。

注意:我們假設您熟悉 Python 類、模塊等。如果您不熟悉 Python 中級概念,如類、模塊等,您可能會發現難以理解接下來的部分。

什麼是 Python 單元測試?

Python unittest 是一個用於測試 Python 代碼的內置測試框架。 它有一個測試運行器,讓我們可以毫不費力地運行測試。 因此,我們可以使用內置的unittest模塊進行測試,而無需使用第三方模塊。 但是,它會根據您的要求而變化。 內置的unittest模塊非常適合開始在 Python 中進行測試。

我們必須按照以下步驟使用 unittest 模塊測試 Python 代碼。

#1. 編寫代碼。

#2. 導入unittest模塊。

#3. 創建一個以關鍵字test開頭的文件。 例如test_prime.py 。 關鍵字test用於標識測試文件。

#4. 創建一個擴展類unittest.TestCase的類。

#5. 在類中編寫方法(測試)。 根據您的要求,每種方法都包含不同的測試用例。 我們必須以test關鍵字開頭的方法命名。

#6. 運行測試。 我們可以用不同的方式運行測試。

  • 運行命令python -m unittest test_filename.py
  • 我們使用命令python test_filename.py運行測試文件,就像一般的 Python 文件python test_filename.py 。 為了讓這個方法起作用,我們需要調用測試文件中unittestmain方法。
  • 最後,使用discover 。 我們可以使用命令python -m unittest discover自動運行測試,而無需提及測試的文件名。 它將使用我們遵循的命名約定找到測試。 因此,我們必須在開始時使用關鍵字test命名我們的測試文件。

通常,在測試中,我們將代碼的輸出與預期的輸出進行比較。 因此,為了比較輸出, unittest提供了不同的方法。 您可以在此處找到比較函數的列表。

您可以毫無困難地輕鬆理解它們。 他們很直接。

這是很多理論。 我們現在必須開始編碼。

注意:如果您對 unittest 模塊有任何疑問,可以去文檔中解惑。 事不宜遲,讓我們使用 unittest 模塊。

使用 unittest 在 Python 中進行單元測試

我們將首先編寫一些函數,然後我們將專注於編寫測試。 首先,在您喜歡的代碼編輯器中打開一個文件夾。 並創建一個名為utils.py的文件。 將以下代碼粘貼到文件中。

 import math def is_prime(n): if n < 0: return 'Negative numbers are not allowed' if n <= 1: return False if n == 2: return True if n % 2 == 0: return False for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: return False return True def cubic(a): return a * a * a def say_hello(name): return "Hello, " + name

我們在utils.py文件中有三個不同的函數。 現在,我們必須用不同的測試用例來測試每個函數。 讓我們為第一個函數is_prime編寫測試。

#1. 在示例文件夾中創建一個名為test_utils.py的文件作為utils.py

#2. 導入utilsunittest模塊。

#3. 創建一個名為TestUtils的類,擴展unittest.TestCase類。 類的名稱可以是任何東西。 試著給這個類起一個有意義的名字。

#4. 在類中,編寫一個名為test_is_prime的方法,它接受self作為參數。

#5. 使用is_prime參數編寫不同的測試用例,並將輸出與預期輸出進行比較。

#6. 示例測試用例self.assertFalse(utils.is_prime(1))

#7. 我們期望is_prime(1)的輸出在上述情況下為假。

#8. 與上述案例類似,我們將根據我們正在測試的功能進行不同的測試案例。

讓我們看看測試。

 import unittest import utils class TestUtils(unittest.TestCase): def test_is_prime(self): self.assertFalse(utils.is_prime(4)) self.assertTrue(utils.is_prime(2)) self.assertTrue(utils.is_prime(3)) self.assertFalse(utils.is_prime(8)) self.assertFalse(utils.is_prime(10)) self.assertTrue(utils.is_prime(7)) self.assertEqual(utils.is_prime(-3), "Negative numbers are not allowed") if __name__ == '__main__': unittest.main()

我們正在調用unittest模塊的main方法來使用python filename.py命令運行測試。 現在,運行測試。

您將看到類似於以下輸出的輸出。

 $ python test_utils.py . ---------------------------------------------------------------------- Ran 1 test in 0.001s OK

現在,嘗試為其他功能編寫測試用例。 考慮函數的不同情況並為它們編寫測試。 看一下添加到上述類中的以下測試。

 ... class TestUtils(unittest.TestCase): def test_is_prime(self): ... def test_cubic(self): self.assertEqual(utils.cubic(2), 8) self.assertEqual(utils.cubic(-2), -8) self.assertNotEqual(utils.cubic(2), 4) self.assertNotEqual(utils.cubic(-3), 27) def test_say_hello(self): self.assertEqual(utils.say_hello("Geekflare"), "Hello, Geekflare") self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan") self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan") self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez") ...

我們只使用了unittest模塊中的一些比較函數。 您可以在此處找到完整列表。

我們已經學習瞭如何使用 unittest 模塊編寫單元測試。 現在,是時候看看運行測試的不同方法了。

如何使用 unittest 運行測試

我們已經在上一節中看到了一種運行測試用例的方法。 讓我們看看其他兩種使用 unittest 模塊運行測試的方法。

#1. 使用文件名和 unittest 模塊。

在此方法中,我們將使用 unittest 模塊和文件名來運行測試。 運行測試的命令是python -m unittest filename.py 。 在我們的例子中,運行測試的命令是python -m unittest test_utils.py

#2. 使用發現方法

我們將使用 unittest 模塊的discover方法來自動檢測所有測試文件並運行它們。 要自動檢測測試文件,我們需要以關鍵字test開頭命名它們。

使用發現方法運行測試的命令是python -m unittest discover 。 該命令將檢測名稱以test開頭的所有文件並執行它們。

結論

單元測試是編程世界中的基本測試。 現實世界中還有很多其他的測試。 試著一一學習。 我希望本教程可以幫助您使用 unittest 模塊在 Python 中編寫基本測試。 有pytest、Robot Framework、nose、nose2、slash等第三方庫,大家可以根據項目需求自行探索。

快樂測試

您可能還對 Python 面試問題和答案感興趣。