Python项目中的单元测试
引入
单元测试负责对最小的软件设计单元(模块)进行验证,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文件,并运行测试用例。
Python项目中的单元测试的更多相关文章
- python项目中requirements的巧用(一键导入所有安装包)
一个Python 项目中可能安装很多安装包, 再次创建虚拟环境是需要重新安装的话很麻烦也费时间, 或者项目部署的时候避免重装, 可以将现有项目的所有安装包记录在requirements.txt 文件, ...
- Python项目中如何优雅的import
Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的imp ...
- .NET 项目中的单元测试
.NET 项目中的单元测试 Intro "不会写单元测试的程序员不是合格的程序员,不写单元测试的程序员不是优秀的工程师." -- 一只想要成为一个优秀程序员的渣逼程序猿. 那么问题 ...
- 在 python 项目中如何记录日志
一. 概述 写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍,好记性不如烂笔头, 这里把查阅的内容记录下来,方便以后查找. python 项目中记录 ...
- 项目中创建单元测试—VS2012
我们在每个项目的开发过程中,开发完一个功能,自己首先需要测试一下,VS提供了很方便的测试功能,可以很容易的创建单元测试,但是在VS2012中类名上点击右键没有『创建单元测试』这个菜单,需要先进行设置一 ...
- SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例
要搭建的项目的项目结构如下(使用的框架为:Spring.SpingMVC.MyBatis): 2.pom.xml中的配置如下(注意,本工程分为几个小的子工程,另外两个工程最终是jar包): 其中 ...
- python 项目中包中__init__.py文件的作用
开发python项目时,我遇到了一个这样的现象,当我新建一个pythonpackage时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么, ...
- vue项目中添加单元测试
从网上找了很多例子关于单元测试,都是如何新建项目的时候的添加单元测试,用vue-cli中怎么添加,但是我的项目已经生成了,不能再一次重新初始化,这时如何添加单元测试,这里面遇到了好多坑,写在这里记录一 ...
- [git]安装git-pylint-commit-hook提高python项目中的代码质量
什么是'git-pylint-commit-hook' 我在工作中,团队为了保证代码和提高代码的质量,要求每个项目都要求安装git-pylint-commit-hook,它是个钩子,会在你提交代码到本 ...
随机推荐
- 控制反转&依赖注入
IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么 ...
- mplayer+ffmpeg 组合截图
mplayer截图的优点:对于一个时长很长的视频,可以任意指定一个时间点截图,mplayer会直接跳到这个时间点开始解码截图: 缺点:由于是直接跳到指定的时间点,也就是直接跳过了之前的帧,这样解码出来 ...
- [USACO09OCT]Invasion of the Milkweed】乳草的侵占-C++
Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高 ...
- drop、truncate和delete的区别 [转载]
drop.truncate和delete的区别 本文转载自: https://www.cnblogs.com/zhizhao/p/7825469.html (1)DELETE语句执行删除的过程 ...
- Android自定义的属性的使用
获取引用类型的属性值 private void init(Context context, AttributeSet attrs) { //int textId = attrs.getAttribut ...
- GitLab-CI 来自动创建 Docker 镜像
1.what is gitlab-ci docker image CI/CD 自动化集成,自动化部署.简单的说就是把代码提交到gitlab管理的同时部署到指定的server,打成docker imag ...
- Jenkins持续部署-创建差量更新包
目录 Jenkins持续部署-创建差量更新包 目录 前言 目的 详细流程 生成版本号 获取版本号 创建文件更新清单 压缩 获取上个版本的包 创建差量更新包 读取服务器Json配置 远程创建文件夹目录 ...
- 1.4.3 ID遍历爬虫(每天一更)
# -*- coding: utf-8 -*- ''' Created on 2019年5月7日 @author: 薛卫卫 ''' import itertools import urllib.req ...
- 原创:微信小程序开发要点总结
废话不多少,下面是对我从开发微信小程序的第一步开始到发布的总结,觉得对您有帮助的话,可以赞赏下,以对我表示鼓励. 一:首先注册登录微信公众平台,这个平台很重要,以后查文档全在上面看.https://m ...
- 统计学习方法6—logistic回归和最大熵模型
目录 logistic回归和最大熵模型 1. logistic回归模型 1.1 logistic分布 1.2 二项logistic回归模型 1.3 模型参数估计 2. 最大熵模型 2.1 最大熵原理 ...