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 ...
 
随机推荐
- Insertion Sort and Merge Sort
			
Insertion Sort(插入排序) 思路:for 循环遍历数组中的每一个数 用while将每次遍历到的数于左侧的数进行对比,将小的排到左边 void InsertionSort(int*A, i ...
 - ESP32音频开发板ESP32-Korvo V1.1踩坑
			
电池供电ESP32-Korvo V1.1开发板供电电压低于3.9V不断复位: 报错->Brownout detector was triggered 断电探测器触发复位 根据同行资料发现,禁用断 ...
 - 记某次sql注入绕过ids
			
昨天测试sql注入,发现个站,存在ids,一个单引号直接拦截,无论我怎么编码都不行,怕不是废了.. 灵机一动 基础探测 /*'*/ 报错 /*''*/ 返回正常 是字符串类型. 先本地测试 返回所有 ...
 - 【Java】String、StringBuilder和StringBuffer
			
[String] 首先,从String类的定义入手,可以看到String类是由final修饰,即不可变的,一旦创建出来就不可修改,因此首先明确,字符串的拼接.截取等操作都会产生新的字符串对象. 观察以 ...
 - 05- 移动端APP的分类 与对比webApp hybridApp nativeApp
			
随着智能手机的普及,移动端应用几乎成为每个互联网产品的标配.在快速迭代的互联网战场中高效开发.低成本上线产品,是每个应用开发团队追求的目标.此时,选择合适的应用类型和开发模式便至关重要.移动应用可以粗 ...
 - Nginx配置动静分离
			
简单解释 所谓动静分离指的是当访问静态资源时,路由到一台静态资源服务器,当访问是非静态资源时,路由到另外一台服务器 配置实现 修改server块 server块配置参考,配置规则可自行修改,符合正则语 ...
 - tp5.1中返回当天、昨天、当月等的开始和结束时间戳
			
/** * 返回今日开始和结束的时间戳 * * @return array */function today(){ list($y, $m, $d) = explode('-', date('Y-m- ...
 - 解决docker镜像无法删除的问题
			
发现问题 来自守护进程的错误响应:冲突:无法删除050f26b6caca(必须强制) - 映像在多个存储库中被引用 Error response from daemon: conflict: unab ...
 - 修改composer配置(以修改cache-files-maxsize为例)修改composer拉取包出现"Content-Length mismatch"的问题
			
1.composer config -l -g查看composer配置信息 2.修改配置:composer config --global cache-files-maxsize 1024MiB
 - Linux系统运行netstat命令时的过三关斩一将
			
1.简介 这篇文章主要是记录在日常工作中遇到的一些问题,将其都总结整合到一起,方便查看,提高工作效率.小伙伴们看到标题可能觉得奇怪,不是过五关斩六将而是过三关斩一将.慢慢地往后看发现其中奥秘. 2.过 ...