1.excel结合测试用例的使用

测试自己写的函数是否可以正常使用,一般来说就简单的使用如下方法进行就可以:

# 使用 if __name__ == '__main__'和直接调用的区别就是其他模块中导入该模块时不会执行下面的代码
if __name__ == '__main__':result = read_excel('cases.xlsx','Sheet1')print(result)

excel.py文件中内容如下,读取excel数据:

from openpyxl import load_workbookdef read_excel(file,sheet_name):# 通过文件得到一个工作薄,参数是文件名,如果有路径要写绝对路径wb = load_workbook(file)# 获取sheet表格sheet = wb[sheet_name]# 获取sheet中所有的数据data = list(sheet.values)# 将列表还转化为字典dict_list = []for i in range(1, len(data)):dict_list.append(dict(zip(data[0], data[i])))return dict_list# 使用 if __name__ == '__main__'和直接调用的区别就是其他模块中导入该模块时不会执行下面的代码
if __name__ == '__main__':result = read_excel('cases.xlsx','Sheet1')print(result)

运行结果:

也可以编写测试用例进行调用,但一般不会使用这种方法去验证函数是否正确。

# unittest 测试函数,类下面的方法是否可以正常使用
# 也可以测试自定义的函数
# 1.准备测试数据 ,其实就是函数的实际参数 file='',sheet_name=''
# 2.准备预期结果
# 3.测试,调用read_excel函数,得到实际结果
# 实际工作当中,
from excel import read_excel
import unittestclass TestExcel(unittest.TestCase):def test_excel(self):file = 'cases.xlsx'sheet_name = 'Sheet1'excepted = [{'case_id': 1, 'data': 'kunkun', 'expected': 'ok', 'title': '测试用例1'},{'case_id': 2, 'data': '困困', 'expected': 'not ok', 'title': '测试用例2'}]actual = read_excel(file, sheet_name)self.assertEqual(excepted, actual)

运行结果:

下面有个例子,调用登录函数,编写测试用例:

login函数所在funcs.py文件内容如下:

def login(username=None, pwd=None):if username is None or pwd is None:return {'code': '400', 'msg': '用户名或密码为空'}if username == 'kunkun' and pwd == '123':return {'code': '200', 'msg': '登录成功'}return {'code': '300', 'msg': '用户名或密码错误'}

test_02_login.py文件内编写测试用例:

# 准备测试数据(根据被测函数的参数)
# 调用login函数,得到实际结果
# 断言
import unittest
from funcs import loginclass TestLogin(unittest.TestCase):# 测试用例方法名以test开头def test_login_1(self):username = 'kunkun'pwd = '123'actual = login(username, pwd)expected = {'code': '200', 'msg': '登录成功'}self.assertEqual(expected, actual)def test_login_2(self):username = 'pang'pwd = '1234'actual = login(username, pwd)expected = {'code': '300', 'msg': '用户名或密码错误'}self.assertEqual(expected, actual)def test_login_3(self):username = Nonepwd = Noneactual = login(username, pwd)expected = {'code': '400', 'msg': '用户名或密码为空'}self.assertEqual(expected, actual)

这样写测试用例,我们发现会存在大量的代码,且代码重复性高,缺点:

  • 1.一个用例要单独编写一个函数,存在重复性代码(可通过数据驱动解决)
  • 2.测试数据维护不方便,增加/修改,需要查找很多代码(可通过测试数据单独管理进行优化,比如放在excel当中)

缺点2,我们可以通过excel中存放测试用例数据,cases.xlsx文件存放测试用例的数据,如下:

此时我们使用for循环,实现从excel结合测试用例的使用,test_03_login_excel.py文件如下:

import unittest
from funcs import login
from excel import read_exceldata = read_excel('cases.xlsx', 'Sheet1')class TestLogin(unittest.TestCase):# 测试用例方法名以test开头def test_login(self):for row in data:params_str = row['data']params = eval(params_str)username = params['username']pwd = params['pwd']expected = eval(row['expected'])actual = login(username, pwd)self.assertEqual(expected, actual)

运行结果:

从上面例子发现,使用for循环实现测试用例方法的实现时,把所有的用例数据都当成了一个,不会自动生成单独的测试用例,这就导致了测试用例的缺失,这就引入了数据驱动(ddt)。

2.数据驱动(ddt)

针对上面的for循环可以优化:每组测试数据单独一个用例。使用数据驱动的方式:另一种叫法就是参数化 。

参数化:对于一个统一的逻辑,使用不同的参数(数据)去执行。

使用第三方库实现:ddt , unittestreport,使用前请先安装,切换到terminal,输入命令点击回车即可完成安装:pip install ddt;pip install unittestreport

2.1 unittestreport

import unittest
from funcs import login
from excel import read_excel
from unittestreport import ddt, list_datadata = read_excel('cases.xlsx', 'Sheet1')@ddt
class TestLogin(unittest.TestCase):@list_data(data)def test_login(self, row):# row表示每次从data这个list当住取出一个数据# 代表一组测试数据,相当于for row in data# 但不同点在于:会自动生成一个新的测试用例方法test_login_01()params_str = row['data']params = eval(params_str)username = params['username']pwd = params['pwd']expected = eval(row['expected'])actual = login(username, pwd)self.assertEqual(expected, actual)

运行结果:

ddt的高级之处在于,前面失败的测试用例不会影响后续的测试用例方法的生成,即ddt会根据每个不同的测试数据,自动生成新的测试用例方法。

参数化的具体使用过程:

1. 导入相应模块:form unittestreport import ddt,list_data;

2.在测试函数当中,加入参数row,row参数名称是可自定义的。

2.2 ddt

import unittest
from funcs import login
from excel import read_excel
from ddt import ddt, dataexcel = read_excel('cases.xlsx', 'Sheet1')@ddt
class TestLogin(unittest.TestCase):@data(*excel)def test_login(self, row):# row表示每次从data这个list当住取出一个数据# 代表一组测试数据,相当于for row in data# 但不同点在于:会自动生成一个新的测试用例方法test_login_1()params_str = row['data']params = eval(params_str)username = params['username']pwd = params['pwd']expected = eval(row['expected'])actual = login(username, pwd)self.assertEqual(expected, actual)

运行结果:

3.excel结合测试用例的用法:

-为什么要用excel单独管理用例?便于维护。

-具体用法:

1.通过read_excel方法读取excel当中的数据;

2.通过参数化完成数据到用例的结合;

3.此时用例函数只需要写一个,而用例数据可以有成千上万个,节省了很多的测试用例函数;

4.什么数据可以整合到一个用例函数?一定要是测试逻辑一致,只有数据不一致。

-注意事项:

1.excel当中不存在字典,如果单元格当中有文本,读取出来是字符串。字典是python当中的概念;

2.参数化不要用for循环,因为for循环虽然一个函数可以执行多个数据,但是所有的数据被当成一个用例,for循环不会自动生成新的测试用例方法;

3.如果测试过程当中出现了异常,一定要养成打断点的习惯。

-参数化 VS 数据驱动

1.参数化:函数参数,一个测试函数当中会带参数,该参数往往就是测试数据

2.数据驱动(data driven testing,ddt),数据驱动是一种思想。具体实现方式是参数化的方式。

Python-openpyxl之二次封装相关推荐

  1. selenium + python自动化测试unittest框架学习(五)webdriver的二次封装

    因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<se ...

  2. python+selenium十:selenium的二次封装

    python+selenium十:基于原生selenium的二次封装 from selenium import webdriverfrom selenium.webdriver.support.wai ...

  3. python assert二次封装

    python assert二次封装 在编写接口自动化case时,感觉自带的assert与unittest内的assert都不太好用在某些场景下,所以对assert进行了二次封装,很多地方可以完善与修改 ...

  4. python期末版二版-习题题库

    <Python程序设计>题库 一.  填空题  1.  Python安装扩展库常用的是_工具.(pip)  2.  Python标准库math中用来计算平方根的函数是____.(sqrt) ...

  5. python openpyxl模块安装_python之openpyxl模块

    一 . Python操作EXCEL库的简介 1.1 Python官方库操作excel Python官方库一般使用xlrd库来读取Excel文件,使用xlwt库来生成Excel文件,使用xlutils库 ...

  6. Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day09[面向对象(封装.继承.多态).重写.私有权限] Python基础day ...

  7. Python自动化(十二):一分钟搞定几百个Excel中查找的数据

    一.需求说明 首先我们来看下今天的需求,有一份档案记录总表的Excel工作簿, 每天会根据当天日期建立新表,每天的表格内包含所有档案信息,同时也有可能会添加新的档案名.同个年度的总表在年末可能会有两. ...

  8. Python办公自动化(二)|从Excel到Word

    前言 在前几天的文章中我们讲解了如何从Word表格中提取指定数据并按照格式保存到Excel中,今天我们将再次以一位读者提出的真实需求来讲解如何使用Python从Excel中计算.整理数据并写入Word ...

  9. 数据列表组件 jqGrid 二次封装

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间在jqgrid基础上,进行了二次封装. 应用在公司新的开发平台上,相比以前效果更佳,开发更方便,减少代码50%.共享下 ...

  10. Python基础(二)完结

    今天分享又来了呀.ღ( ´・ᴗ・` ) 一起学习进步ღゝ◡╹)ノ♡ 关注公众号,回复"资料全集",不定期最新大数据业内资讯. ❤:在这里跟我一起学习技术.职场.人生.原理.健身.摄 ...

最新文章

  1. bat脚本交互输入_基于winserver操作系统的自动清理Oracle3天前归档日志脚本分享...
  2. 一个大型网游需要哪些代码块_你会因为网游的非公平性,而转投单机游戏阵营吗?...
  3. [CF125E]MST Company
  4. 比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
  5. php用到的mysql语句_PHP中常用到的一些MySQL语句_php
  6. Linux Ubuntu 安装编译Opencv 3.4.3 C++开发环境
  7. HDU2099 整除的尾数【模除】
  8. go语言 select
  9. python restful风格_总结python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
  10. 数据结构与算法之一快速排序
  11. 格式化输出;while循环;运算符
  12. chrome 独立安装包下载
  13. 遥感专业学c语言吗,2019遥感科学与技术专业怎么样、学什么、前景好吗
  14. miui删除内置不卡米教程_MIUI11卸载系统自带软件,无需ROOT也可以
  15. C# MVC 过滤器
  16. 程序员日常工作总结2020-01-21
  17. armbian ubuntu 桌面_armbian安装lxde桌面
  18. 北京交通大学本科毕业论文答辩PPT模板
  19. 20230103编译ToyBrick的TB-RK3588X的Andorid12的LOG01
  20. Vue 计算属性和ref的使用方法

热门文章

  1. 婚介行业线上引流渠道哪些?你还在为找不到客户而烦恼吗?这些渠道千万别错过!
  2. 故障诊断专家系统研究之一-----绪论
  3. BP神经网络(python代码)
  4. Python基础之占位符
  5. Visual Studio Code(VSCode) 编辑/编译/调试 C++ 代码
  6. Visual Studio Code 函数
  7. 出现413 Request Entity Too Large问题的解决方法
  8. 2021年9月22日-忆阻神经网络综述
  9. phpsocket客户端以及服务器例子
  10. AsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);