引入
單元測試負責對最小的軟件設計單元(模塊)進行驗證,unittest
是Python自帶的單元測試框架。 單元測試與功能測試都是日常開發中必不可少的部分,本文演示了Python中unittest
單元測試框架的基本使用。
一個簡單的測試例子
定義一個類,簡單的實現add
、sub
兩個方法,並對其進行單元測試。
待測試的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個重要的概念:
test fixture:
是初始化和清理測試數據及環境,通過重寫TestCase的setUp()
和tearDown()
方法來實現test case:
是測試用例test suite:
是測試用例的集合(俗稱測試套件),通過addTest加載TestCase到TestSuite中,返回一個TestSuite實例。test runner:
的作用是運行測試用例並返回結果,通過TextTestRunner類提供的run()方法來執行test suite
或test 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文件,並運行測試用例。