Python項目中的單元測試

  • 2019 年 10 月 3 日
  • 筆記

引入

單元測試負責對最小的軟體設計單元(模組)進行驗證,unittest是Python自帶的單元測試框架。 單元測試與功能測試都是日常開發中必不可少的部分,本文演示了Python中unittest單元測試框架的基本使用。

 

一個簡單的測試例子

定義一個類,簡單的實現addsub兩個方法,並對其進行單元測試。

待測試的m1.py文件內容如下:

class MyClass(object):      """just a test case"""      def __init__(self, x, y):          self.x = int(x)          self.y = int(y)        def add(self):          return self.x + self.y        def sub(self):          return self.x - self.y

在與m1.py同級的目錄下創建test.py測試文件,使用unittest單元測試框架對A類的方法進行測試。程式碼內容如下:

import unittest  from m1 import MyClass      class MyClassTest(unittest.TestCase):      def setUp(self):          self.calc = MyClass(7, 5)        def tearDown(self):          pass        def test_add(self):          ret = self.calc.add()          self.assertEqual(ret, 12)        def test_sub(self):          ret = self.calc.sub()          self.assertEqual(ret, 2)      if __name__ == '__main__':      # 構造測試集      suite = unittest.TestSuite()      suite.addTest(MyClassTest('test_add'))      suite.addTest(MyClassTest('test_sub'))      # 執行測試      runner = unittest.TextTestRunner()      runner.run(suite)

運行測試:

demo1 $ python3 test.py  ..  ----------------------------------------------------------------------  Ran 2 tests in 0.000s    OK

到此一個簡單的單元測試就完成了。

 

unittest框架知識點

unittest框架中4個重要的概念:

  1. test fixture:是初始化和清理測試數據及環境,通過重寫TestCase的setUp()tearDown()方法來實現
  2. test case:是測試用例
  3. test suite:是測試用例的集合(俗稱測試套件),通過addTest載入TestCase到TestSuite中,返回一個TestSuite實例。
  4. test runner:的作用是運行測試用例並返回結果,通過TextTestRunner類提供的run()方法來執行test suitetest case

 

 

Django中的單元測試

Django項目的app目錄下都默認生成了一個

Model部分單元測試用例

假設項目中有一個Book的model:

class Book(models.Model):      title = models.CharField(max_length=32)      price = models.DecimalField(max_digits=10, decimal_places=2)

測試用例程式碼:

# app01/tests.py  from django.test import TestCase  from app01.models import Book  # Create your tests here.      class BookModelTest(TestCase):      def setUp(self):          Book.objects.create(title='書名', price=11.11)        def test_book_model(self):          from decimal import Decimal          result = Book.objects.get(title='書名')          self.assertEqual(result.price, Decimal('11.11'))

運行測試,在項目目錄下運行:

$ python3 manage.py test  Creating test database for alias 'default'...  System check identified no issues (0 silenced).  .  ----------------------------------------------------------------------  Ran 1 test in 0.003s    OK  Destroying test database for alias 'default'...

測試用例OK…

視圖部分單元測試用例

假設我們有個index視圖,程式碼如下:

def index(request):      return render(request, 'index.html')

app01/tests.py文件中添加測試用例程式碼:

# app01/tests.py  class IndexPageTest(TestCase):      """測試index頁面"""      def test_index_page_renders_index_template(self):          """測試index視圖"""          response = self.client.get('/index/')          self.assertEqual(response.status_code, 200)  # 判斷狀態碼          self.assertTemplateUsed(response, 'index.html')  # 判斷渲染的模板是否正確

在項目根目錄運行python manage.py test命令:

$ python3 manage.py test  Creating test database for alias 'default'...  System check identified no issues (0 silenced).  ..  ----------------------------------------------------------------------  Ran 2 tests in 0.027s    OK  Destroying test database for alias 'default'...

python manage.py test命令會查找當前項目中的tests.py文件,並運行測試用例。