引入
单元测试负责对最小的软件设计单元 (模块) 进行验证, 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 文件, 并运行测试用例.
来源: https://www.cnblogs.com/peng104/p/11364927.html