欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

【Python自动化测试17】openpyxl二次封装与数据驱动

时间:2023-04-29
文章目录

一、前言 二、二次封装 三、数据驱动 一、前言

  本文章主要讲解Python自动化测试中openpyxl的二次封装,在自动化测试中能够更好的管理测试用例以及代码,除此之外下方有系列文章的传送门,还在持续更新中,感兴趣的小伙伴也可以前往查看,话不多说,让我们一起看看吧~

系列文章:
  系列文章1:【Python自动化测试1】遇见Python之美
  系列文章2:【Python自动化测试2】Python安装配置及PyCharm基本使用
  系列文章3:【Python自动化测试3】初识数据类型与基础语法
  系列文章4:【Python自动化测试4】字符串知识总结
  系列文章5:【Python自动化测试5】列表与元组知识总结
  系列文章6:【Python自动化测试6】字典与集合知识总结
  系列文章7:【Python自动化测试7】数据运算符知识合集
  系列文章8:【Python自动化测试8】流程控制语句讲解
  系列文章9:【Python自动化测试9】函数知识合集
  系列文章10:【Python自动化测试10】文件基础操作
  系列文章11:【Python自动化测试11】模块、包与路径知识合集
  系列文章12:【Python自动化测试12】异常处理机制知识合集
  系列文章13:【Python自动化测试13】类、对象、属性与方法知识合集
  系列文章14:【Python自动化测试14】Python自动化测试基础与进阶练习题
  系列文章15:【Python自动化测试15】unittest测试框架的核心概念与作用
  系列文章16:【Python自动化测试16】测试用例数据分离

  

二、二次封装

  基于上一次16章节的代码,我们可以继续对代码进行优化封装,封装后的代码会更加高效,主要分为三个文件:

(1)test_login.py # 测试文件
(2)login_function # 存储被测函数
(3)excel # excel表格读取
(4)login_case.xlsx # 测试用例数据

  优化后的代码如下所示(如果没有看过16章的同学,建议先去阅读16章):

"""被测函数:login_function"""def login(username=None, password=None): if username is None or password is None: return {"code": 400, "msg": "用户名或密码为空"} if username == "萌笑天" and password == "123456": return {"code": 200, "msg": "登录成功"} return {"code": 300, "msg": "用户名或密码错误"}

"""测试文件:test_login.py"""import unittestfrom excel import read_excel # 导入read_excel的函数,以使用对应的功能from login_function import login# 获取excel数据login_data = read_excel("login_case.xlsx", "login")class TestLogin(unittest.TestCase): def test_login_success(self): # 通过索引为0,找到第一组测试数据 data_info = login_data[0] # 取出测试数据当中的data字段 user_info = eval(data_info["data"]) username = user_info["username"] password = user_info["password"] expected = eval(data_info["expected"]) actual = login(username, password) self.assertEqual(expected, actual)

"""表格读取:excel.py""""""Python操作excel的思路:1、先打开excel文件2、选择对应表格页签3、读取对应单元格数据4、通过数据实现一定的操作5、关闭excel文件"""import openpyxl # 专门用于处理excel表格的库,openpyxl拥有pandas的特性,并属于轻量级库,不会像pandas一样更加复杂,更具优势from openpyxl.worksheet.worksheet import Worksheetdef read_excel(file_path, sheet_name ): """读取excel的函数""" workbook_data = openpyxl.load_workbook(file_path) # 打开名称为case.xlsx的excel文档 sheet: Worksheet = workbook_data[sheet_name] # 页签名为login,定位到login页签,指明sheet类型为Worksheet # """如果我们想要获取某一个单元格的数据,可以使用这个方式,但往往一个表格中有庞大的数据,我们并非通过这样的方式获取""" # cell = sheet.cell(row=1, column=1) # 获取单元格数据,row为行,column为列,代码中表示的为第一行第一列的单元格 # print(cell.value) # 获取第一行第一列的数据 """更推荐的获取方法是获取所有数据,因为获取的数据并非列表类型,我们还需要进一步进行数据转换""" values = list(sheet.values) workbook_data.close() # 关闭文件 title = values[0] rows = values[1:] new_rows = [dict(zip(title, row)) for row in rows] return new_rowsdata = read_excel("login_case.xlsx", "login")print(data)

  测试用例数据如下所示:

  执行结果如下所示,测试通过:

  当有过多的测试函数数据时我们需要通过循环去遍历,也就是for循环遍历,虽然更加便捷可以省略过多的测试函数编写,当仍然会出现一些新问题,Python程序从上往下执行,并逐条进行excel的数据读取,一旦出现报错,会终止程序运行,如下所示,会告知预期结果与实际结果不符,那么程序就会终止运行了(代码中没有直接使用for循环):

  

三、数据驱动

  思想:数据驱动(data driven testing)是一种将测试数据(输入,和期望输出)从只包含测试逻辑的测试脚本代码中区别开的方法,简单点说也就是数据分离,数据驱动也是使用不同的数据达到想要的目的。
  实现:通过导入数据驱动(DDT)的方式,进行数据驱动:
  注意:特别需要注意的就是,如果在代码中加了装饰器实现了数据驱动后,执行代码需要在空白行执行,否则会出现AttributeError的报错,需要牢记!
  意义:
  (1)测试逻辑高,代码复用率高,可以被多条测试数据复用,同时可以提高编写效率。
  (2)异常排查率较高,测试框架依据测试数据,每条数据生成测试用例,用例执行过程相互隔离,数据驱动可以让测试用例数据更加独立,具有独立性,每一个测试用例相互之间不会影响。
  (3)代码的可维护性高,清晰的测试框架,提高可读性与可维护性。

import unittestfrom excel import read_excel # 导入read_excel的函数,以使用对应的功能from login_function import loginfrom unittestreport import ddt, list_data # unittestreport是一个综合报告输出、ddt等多个内容的库# 获取excel数据login_data = read_excel("login_case.xlsx", "login")# 测试类上使用ddt,以表示使用数据驱动@ddtclass TestLogin(unittest.TestCase): # 如果你想在哪个函数上使用数据驱动,那么就在函数上增加list_data @list_data(login_data) def test_login_success(self, data_info): # 通过索引为0,找到第一组测试数据 data_info = login_data[0] # 取出测试数据当中的data字段 user_info = eval(data_info["data"]) username = user_info["username"] password = user_info["password"] expected = eval(data_info["expected"]) actual = login(username, password) self.assertEqual(expected, actual)


  
  

  好啦~以上就是本次文章分享的全部内容啦,你学会了吗?希望能给大家带来帮助哦!

  
  

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。