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,它是个钩子,会在你提交代码到本 ...
随机推荐
- 18.linux基础优化
1.linux系统的基础优化 (1)关闭selinux sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config 临时关闭 ...
- pdfminer获取每页的layout
#! python2 # coding: utf-8 import sys from pdfminer import pdfparser from pdfminer import pdfdocumen ...
- WinForm控件之【CheckBox】
基本介绍 复选框顾名思义常用作选择用途,常见的便是多选项的使用: 常设置属性.事件 Checked:指示组件是否处于选中状态,true为选中处于勾选状态,false为未选中空白显示: Enabled: ...
- Junit初级应用实例
Request: public interface Request { String getName(); } Response: public interface Response { String ...
- Neo4j电影关系图
“电影关系图”实例将电影.电影导演.演员之间的复杂网状关系作为蓝本,使用Neo4j创建三者关系的图结构,虽然实例数据规模小但五脏俱全. 步骤: 一. 创建图数据:将电影.导演.演员等图数据导入Neo4 ...
- 哈夫曼编码与解码的C++实现:建立哈夫曼树、进行哈夫曼编码与解码
最近完成了数据结构课程设计,被分到的题目是<哈夫曼编码和解码>,现在在这篇博文里分享一下自己的成果. 我在设计时,在网上参考了很多老师和前辈的算法和代码,向他们表示感谢!他们的成果给了我很 ...
- LaTeX大全
1.指数和下标可以用^和_后加相应字符来实现.比如: 2.平方根(square root)的输入命令为:\sqrt,n 次方根相应地为: \sqrt[n].方根符号的大小由LATEX自动加以调整.也可 ...
- markdown浅谈
markdown是啥? markdown就是一种修饰网页/博客的方法,他能使网页变得更美观. 我们先解释一下代码框: 这个没法保留,就是把键盘左上角的⋅·⋅ 切换成英文变成`. 然后``` 在隔一行` ...
- php if语句
一.前言 if语句 是几乎所有编程语言都有的函数. 当然我们最好的php这么最好的语言也有啦~ 二.搞起! 直接上代码不多哔哔.talk is cheap show me the code 2.1 i ...
- jenkins +Jmeter 完成分布式性能测试
1.Jmeter 压测机器配置. 下载Jmeter 版本:https://jmeter.apache.org/download_jmeter.cgi 我下的是5.1.1 将下载后的版本进行解压. ...