1. 程式人生 > >Python專案中的單元測試

Python專案中的單元測試

引入

單元測試負責對最小的軟體設計單元(模組)進行驗證,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檔案,並執行測試用