Python单元测试简介及Django中的单元测试
Python单元测试简介及Django中的单元测试
单元测试负责对最小的软件设计单元(模块)进行验证,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目录下都默认生成了一个tests.py
文件,我们可以把我们的测试用例代码都写在这个文件中。
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文件,并运行测试用例。
结束语
本文只演示了最基本的基于unittest
的单元测试示例,更多的单元测试示例,请自行搜索学习…
Python单元测试简介及Django中的单元测试的更多相关文章
- Celery简介以及Django中使用celery
目录 Celery简介 消息中间件 任务执行单元 任务结果存储 使用场景 Celery的安装和配置 Celery执行异步任务 基本使用 延时任务 定时任务 异步处理Django任务 案例: Celer ...
- 在python的web框架Django中使用SQL Server
在pycharm中安装 安装pyodbc和Django——pyodbc是一个用python写的ODBC引擎 安装Django-pyodbc-azure 在后方网址中查 ...
- 好代码是管出来的——.Net Core中的单元测试与代码覆盖率
测试对于软件来说,是保证其质量的一个重要过程,而测试又分为很多种,单元测试.集成测试.系统测试.压力测试等等,不同的测试的测试粒度和测试目标也不同,如单元测试关注每一行代码,集成测试关注的是多个模块是 ...
- Python项目中的单元测试
引入 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元 ...
- 在Android Studio中进行单元测试和UI测试
本篇教程翻译自Google I/O 2015中关于测试的codelab,掌握科学上网的同学请点击这里阅读:Unit and UI Testing in Android Studio.能力有限,如有翻译 ...
- Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?
Inspectdb Django项目通过绑定的数据库中的相应表格直接自动化生成Model 模型类 python manage.py inspectdb Django 中的 ORM 可以实现对象关系映射 ...
- 在Django中使用Channels功能
前言:最近后台写游戏更新版本功能,简单就是前端发送更新请求,后端需要对很多台服务器进行更新和各种操作,本来想着实现不难,后来发现因为后端需要执行很长时间,前端返回报错,后端会执行完毕,但是前端先断开了 ...
- Django 中的 csrf_token 与单元测试
Django 中的 csrf_token 与单元测试 在<Python Web开发:测试驱动方法>一书中作者使用的 Django 版本是 1.7,而我使用的是1.9.7版(官网已经更新到1 ...
- Python框架学习之Flask中的蓝图与单元测试
因为Flask框架的集成度很低,随着Flask项目文件的增多,会导致不太好管理.但如果对一个项目进行模块化管理的,那样子管理起来就会特别方便.而在Flask中刚好就提供了这么一个特别好用的工具蓝图(B ...
随机推荐
- Firefox 启动带有配置信息
若不设置进行下述配置,那么 webdriver 每次启动火狐浏览器,默认都是一个不太有任何插件的浏览器被启动. 通过配置的方式,指定一个浏览器设置来启动,就可以使用以前安装的插件或配置信息了. 步骤一 ...
- MySQL数据库干货分享!unsigned使用案例分析
今天主要写一下unsigned的使用,进入正文前先分享一套博主觉得讲的很详细很实用的MySQL教程给大家 https://www.bilibili.com/video/BV1fx411X7BD 好了, ...
- AdaBoostClassifier参数
[AdaBoostClassifier] Adaboost-参数: base_estimator:基分类器,默认是决策树,在该分类器基础上进行boosting,理论上可以是任意一个分类器,但是如果是其 ...
- 浅谈跨域问题,CORS跨域资源共享
1,何为跨域? 在理解跨域问题之前,你先要了解同源策略和URL,简单叙述: 1)同源策略 三同:协议相同,域名相同,端口相同: 目的:保证用户信息安全,防止恶意网站窃取数据.同源策略是必须的,否则co ...
- HDU 1430 关系映射 + 打表 .
题意是中文的不解释.(http://acm.hdu.edu.cn/showproblem.php?pid=1430) 思路: 这个题目直接BFS会超时的(我一开始超时了) ,如果 ...
- hdu4771 水搜索(状态压缩+bfs)
题意: 给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...
- Linux下逻辑卷LVM的管理和RAID磁盘阵列
目录 LVM 一:LVM的创建 二:LVM的拉伸 三:LVM的缩小 四:LVM的删除 五:RAID磁盘阵列的添加 LVM LVM(Logical Volume Manager) 逻辑卷管理器,可以动态 ...
- hdu4884 模拟
题意: 一个厨师,他能炒n道菜,他每次炒菜用时t分钟,每次最多可以炒同样的菜k分,有m个人来买饭,给你每个人来的时间和菜的种类以及份数,问你每个人都是什么时候离开的. 思路: ...
- Python中math和cmath模块的使用
目录 Math模块 Cmath模块 Math模块 pi 数字常量,圆周率 e 表示一个常量 sqrt(x) 求x的平方根 ...
- Win64 驱动内核编程-7.内核里操作进程
在内核里操作进程 在内核里操作进程,相信是很多对 WINDOWS 内核编程感兴趣的朋友第一个学习的知识点.但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还是调用那几个和进程 ...