Python项目中的单元测试
2024-09-09 08:13:53
引入
单元测试负责对最小的软件设计单元(模块)进行验证,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文件,并运行测试用例。
最新文章
- Mybatis原理分析之一:从JDBC到Mybatis
- JS判断input按了回车键
- webservice4
- JS 用sort方法排序字符串
- 让linux中的程序崩溃时生成core文件
- Love
- 黄聪:wordpress工作原理
- <;<;海闻电子发票接口 ESB 封装 代码指示 文档>;>;
- 现代程序设计 homework-08
- Eclipse / Android : “Errors running builder &#39;Android Pre Compiler&#39; on project…”
- 框架计划随笔 三.EntityFramework在传统事务脚本模式下的使用
- HDU1250:Hat&#39;s Fibonacci
- hdu 4920 Matrix multiplication(矩阵乘法)2014多培训学校5现场
- linkButton
- Dapper C# 访问SQLite
- 荣获MVP感想
- Could not load type &#39;System.ServiceModel.Activation.HttpModule&#39; from assembly &#39;System.ServiceModel, Version=3.0.0.0,";解决办法
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1
- Servlet+Tomcat总结
- Entity Framework 框架