单元测试方法以及实例
为什么要测试?
Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段]。其中测试阶段通过人工或自动来运行测试某个系统的功能。目的是检验其是否满足需求,并得出特定的结果,以达到弄清楚预期结果和实际结果之间的差别的最终目的。
测试的分类:
测试从软件开发过程可以分为:
- 单元测试
- 对单独的代码块(例如函数)分别进行测试,以保证它们的正确性
- 集成测试
- 对大量的程序单元的协同工作情况做测试
- 系统测试
- 同时对整个系统的正确性进行检查,而不是针对独立的片段
在众多的测试中,与程序开发人员最密切的就是单元测试,因为单元测试是由开发人员进行的,而其他测试都由专业的测试人员来完成。所以我们主要学习单元测试。
什么是单元测试?
程序开发过程中,写代码是为了实现需求。当我们的代码通过了编译,只是说明它的语法正确,功能能否实现则不能保证。 因此,当我们的某些功能代码完成后,为了检验其是否满足程序的需求。可以通过编写测试代码,模拟程序运行的过程,检验功能代码是否符合预期。
单元测试就是开发者编写一小段代码,检验目标代码的功能是否符合预期。通常情况下,单元测试主要面向一些功能单一的模块进行。
举个例子:一部手机有许多零部件组成,在正式组装一部手机前,手机内部的各个零部件,CPU、内存、电池、摄像头等,都要进行测试,这就是单元测试。
在Web开发过程中,单元测试实际上就是一些“断言”(assert)代码。
断言就是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果。 python中assert断言是声明布尔值为真的判定,如果表达式为假会发生异常。单元测试中,一般使用assert来断言结果。
断言方法的使用:
断言语句类似于:
if not expression: raise AssertionError AssertionError
常用的断言方法:
assertEqual 如果两个值相等,则pass assertNotEqual 如果两个值不相等,则pass assertTrue 判断bool值为True,则pass assertFalse 判断bool值为False,则pass assertIsNone 不存在,则pass assertIsNotNone 存在,则pass
如何测试?
简单的测试用例:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,
def fibo(x): if x == 0: resp = 0 elif x == 1: resp = 1 else: return fibo(x-1) + fibo(x-2) return resp assert fibo(5) == 5
单元测试的基本写法:
首先,定义一个类,继承自unittest.TestCase
import unittest class TestClass(unitest.TestCase): pass
其次,在测试类中,定义两个测试方法
import unittest class TestClass(unittest.TestCase): #该方法会首先执行,方法名为固定写法 def setUp(self): pass #该方法会在测试代码执行完后执行,方法名为固定写法 def tearDown(self): pass
最后,在测试类中,编写测试代码
import unittest class TestClass(unittest.TestCase): #该方法会首先执行,相当于做测试前的准备工作 def setUp(self): pass #该方法会在测试代码执行完后执行,相当于做测试后的扫尾工作 def tearDown(self): pass #测试代码 def test_app_exists(self): pass
登录测试
- 被测试的代码逻辑
@app.route('/login', methods=['POST']) def login(): username = request.form.get('username') password = request.form.get('password') # 判断参数是否为空 if not all([username, password]): result = { "errcode": -2, "errmsg": "params error" } return jsonify(result) # a = 1 / 0 # 如果账号密码正确 # 判断账号密码是否正确 if username == 'skylark' and password == 'python': result = { "errcode": 0, "errmsg": "success" } return jsonify(result) else: result = { "errcode": -1, "errmsg": "wrong username or password" } return jsonify(result)
- 单元测试代码
import json import unittest from demo1_login import app class LoginTest(unittest.TestCase): """为登录逻辑编写测试案例""" def setUp(self): app.testing = True self.client = app.test_client() def test_empty_username_password(self): """测试用户名与密码为空的情况[当参数不全的话,返回errcode=-2]""" response = app.test_client().post('/login', data={}) json_data = response.data json_dict = json.loads(json_data) self.assertIn('errcode', json_dict, '数据格式返回错误') self.assertEqual(json_dict['errcode'], -2, '状态码返回错误') # TODO 测试用户名为空的情况 # TODO 测试密码为空的情况 def test_error_username_password(self): """测试用户名和密码错误的情况[当登录名和密码错误的时候,返回 errcode = -1]""" response = app.test_client().post('/login', data={"username": "aaaaa", "password": "12343"}) json_data = response.data json_dict = json.loads(json_data) self.assertIn('errcode', json_dict, '数据格式返回错误') self.assertEqual(json_dict['errcode'], -1, '状态码返回错误') # TODO 测试用户名错误的情况 # TODO 测试密码错误的情况 if __name__ == '__main__': unittest.main()
数据库测试:
#coding=utf-8 import unittest from author_book import * #自定义测试类,setUp方法和tearDown方法会分别在测试前后执行。以test_开头的函数就是具体的测试代码。 class DatabaseTestCase(unittest.TestCase): def setUp(self): app.config['TESTING'] = True app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost/test0' self.app = app db.create_all() def tearDown(self): db.session.remove() db.drop_all() #测试代码 def test_append_data(self): au = Author(name='skylark') bk = Book(info='python') db.session.add_all([au,bk]) db.session.commit() author = Author.query.filter_by(name='skylark').first() book = Book.query.filter_by(info='python').first() #断言数据存在 self.assertIsNotNone(author) self.assertIsNotNone(book)
------- 知识无价,汗水有情,如需搬运请注明出处,谢谢!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
经典算法详解(8)数的分组
题目:有10个任意的正整数,将其分为两组A和B,要求组A中每个数据的和与组B中每个数据的和之差的绝对值最小。请设计算法实现数的分组(找出一个答案即可)。 C++版本: 1 #include<iostream> 2 3 using namespace std; 4 5 void get_groupAB(int arr[]) { 6 int sum_a, sum_b; 7 int index, difference=0; 8 int i,i_copy; 9 //数组所有的元素求和给difference赋初值 10 for ( i = 0; i < 10; i++) { 11 difference += arr[i]; 12 } 13 //从0000000000到1111111111,尾数为零时,对应的数组元素划分给a数组,否则划分给b数组 14 for ( i = 0; i < 0x3FF; i++) { 15 sum_a = 0, sum_b = 0; 16 i_copy=i; 17 for (int j = 0; j < 10; j++) { 18 if ...
- 下一篇
我的Java程序员工具箱
不知不觉已经毕业一年了,算上实习开发已有两年,在这两年的工作中学到了很多知识,涉及技术、沟通和效率等方面。开发工具是不得不提的内容,好的开发工具能大大提高我们的工作效率。作为Java程序员,除了必备的eclipse或intelij idea外,下面列举的工具对提升工作效率也有很大帮助: 设计工具 Gliffy Gliffy 是一个基于Web的在线作图应用,它可以帮助用户创建流程图、组织结构图、平面图、业务流程、网络图、技术图、线框图等等。Gliffy的基础版本免费。不过其在线制作的思维导图是公开的,高级版本有设置隐私权的权力。用户可以将其可以嵌入博客,办公室应用软件中,有很好的兼容性。通过Gliffy编辑的流程图图片可输出SVG、GPEG格式。本人用的Chrome插件版,主要用其画流程图。 XMind XMind 是一款采用Java语言开发的实用的思维导图软件。XMind不仅可以绘制思维导图,还能绘制鱼骨图、二维图、树形图、逻辑图、组织结构图。并且,可以方便地从这些展示形式之间进行转换。另外,其可以导入MindManager、FreeMind数据文件。灵活的定制节点外观、插入图标,丰富...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS关闭SELinux安全模块