【Python自动化测试16】测试用例数据分离
文章目录
- 一、前言
- 二、什么是数据分离?
- 三、进行数据分离
- 四、Python操作excel
一、前言
本文章主要讲解Python自动化测试中测试用例的数据分离,在自动化测试中能够更好的管理测试用例以及代码,除此之外下方有系列文章的传送门,还在持续更新中,感兴趣的小伙伴也可以前往查看,话不多说,让我们一起看看吧~
系列文章:
系列文章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测试框架的核心概念与作用
二、什么是数据分离?
如下代码所示,在测试一个函数时我们需要编写测试用例并断言,通过框架及相关方法来进行测试,这样做会产生一个问题,对于一个庞大的软件、游戏而言,可能会有上万条测试用例,如果数据与代码存在绑定关系,很明显会有很多弊端,例如查询、更改测试数据等,这意味着代码和测试数据将会一起进行维护,维护成本会随着时间以及数量不断的增加,且有互相依赖性。
故此我们需要把数据与代码区分开来,那么分开的这个过程和结果,我们就称之为数据分离,进行单独性的管理。 那么测试用例的数据分离,就是将用例数据与代码区分开的意思。如果测试数据需要进行修改或添加,那么我们只需要维护测试数据即可,而测试用例是不需要进行改动的。
"""
一共涉及到4个知识内容:
1、setUp 测试用例前执行
2、teardown 测试用例后执行
3、setUpClass 测试类之前执行
4、teardownClass 测试类之后执行
"""
import unittestdef 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": "用户名或密码错误" }class TestLogin(unittest.TestCase):def setUp(self) -> None:"""每个测试用例之前都会执行的代码"""print("每个测试用例之前的准备工作")print("假装正在连接数据库...")def tearDown(self) -> None:"""每个测试用例之后都会执行的代码,无论测试用例是否通过,tearDown均会执行"""print("每个测试用例执行之后都需要做的事情")print("假装正在断开数据库")@classmethoddef setUpClass(cls) -> None:"""每个测试类之前都会执行的"""print("每个测试类之前只执行一次")@classmethoddef tearDownClass(cls) -> None:"""每个测试类之后都会执行的"""print("每个测试类之后会执行一次")def test_login_success(self):username = "萌笑天"password = 123456expected = {"code": 200, "msg": "登录成功"}actual = login(username,password)self.assertEqual(expected, actual) # 断言预期结果与实际结果是否相等def test_login_error(self):username = "萌笑天"password = 1234567expected = {"code": 1100, "msg": "用户名或密码错误" }actual = login(username,password)self.assertEqual(expected, actual)
三、进行数据分离
进行数据分离的核心就是将数据与代码分开,结合我们前面所学的知识,我们可以把一些测试数据以列表嵌套字典的形式进行存储,转化后的代码为:
"""
TODO:请注意,下面的这些代码并非是最佳的优化途径,只是为了在配合数据分离的知识内容进行讲解
TODO:在后续会逐渐进行优化,采取更优策略,后续文章会进行说明
"""
import unittestlogin_data = [{"username": "萌笑天", "password": 123456, "expected": {"code": 200, "msg": "登录成功"}},{"username": "萌笑天", "password": 1234567, "expected": {"code": 1100, "msg": "用户名或密码错误"}}
]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": "用户名或密码错误" }class TestLogin(unittest.TestCase):def setUp(self) -> None:"""每个测试用例之前都会执行的代码"""print("每个测试用例之前的准备工作")print("假装正在连接数据库...")def tearDown(self) -> None:"""每个测试用例之后都会执行的代码,无论测试用例是否通过,tearDown均会执行"""print("每个测试用例执行之后都需要做的事情")print("假装正在断开数据库")@classmethoddef setUpClass(cls) -> None:"""每个测试类之前都会执行的"""print("每个测试类之前只执行一次")@classmethoddef tearDownClass(cls) -> None:"""每个测试类之后都会执行的"""print("每个测试类之后会执行一次")def test_login_success(self):data = login_data[0]username = data["username"]password = data["password"]expected = data["expected"]actual = login(username,password)self.assertEqual(expected, actual)def test_login_error(self):data = login_data[1]username = data["username"]password = data["password"]expected = data["expected"]actual = login(username,password)self.assertEqual(expected, actual)
如上代码所示,目前测试数据和代码是实现了分离,这样当我们想进行测试数据维护或代码维护时就会更加便捷,虽然这样的方式并不是最有效的,但主要是为了让大家先行理解数据分离的概念,将会在后续的文章中继续进行优化。
正常而言我们要进行模块管理,即代码属于一个模块(py文件),而数据属于一个模块,故此我们实际的data数据并不是放在代码模块中的,而应该是一个新的data.py的模块文件,通过导入的方式进行调用,真实的项目里亦是如此,如上代码是方便新手进行理解所用:
E:\TestingSoftware\Python3.10.1(64x)\python.exe "E:\TestingSoftware\PyCharm\PyCharm Community Edition 2021.3\plugins\python-ce\helpers\pycharm\_jb_unittest_runner.py" --target test_login.TestLogin.test_login_error
Testing started at 10:49 ...
Launching unittests with arguments python -m unittest test_login.TestLogin.test_login_error in E:\TestingSoftware\Python3.10.1(64x)\PythonProject\CSDN自动化测试系列_第一节_Python基础语法1每个测试类之前只执行一次
每个测试用例之前的准备工作
假装正在连接数据库...
每个测试用例执行之后都需要做的事情
假装正在断开数据库{'code': 300, 'msg': '用户名或密码错误'} != {'code': 1100, 'msg': '用户名或密码错误'}Expected :{'code': 1100, 'msg': '用户名或密码错误'}
Actual :{'code': 300, 'msg': '用户名或密码错误'}
<Click to see difference>Traceback (most recent call last):File "E:\TestingSoftware\Python3.10.1(64x)\PythonProject\CSDN自动化测试系列_第一节_Python基础语法1\test_login.py", line 55, in test_login_errorself.assertEqual(expected, actual)
AssertionError: {'code': 1100, 'msg': '用户名或密码错误'} != {'code': 300, 'msg': '用户名或密码错误'}
- {'code': 1100, 'msg': '用户名或密码错误'}
? ^^+ {'code': 300, 'msg': '用户名或密码错误'}
? ^每个测试类之后会执行一次Ran 1 test in 0.005sFAILED (failures=1)Process finished with exit code 1
四、Python操作excel
"""
数据分离的流程:
1、excel编写测试用例
2、通过Python读取excel(读取出来的格式就是列表嵌套字典: [{}, {}, {}]
3、导入测试用例函数由上得知:目前只需要有一份excel版本的测试用例,并通过Python读取即可
"""
在路径下创建一个case.xlsx,存储测试用例数据
openpyxl
属于第三方库,故此我们需要先行安装,已经安装过会直接更新
如下代码所示:我们用函数进行封装,使用openpyxl进行excel数据的读取
"""
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() # 关闭文件return valuesdata = read_excel("case.xlsx", "login")
print(data)
在之前提及过,测试用例的数据是列表嵌套字典的形式,而打印的数据则是列表嵌套元组的形式,并不符合预期,所以还需要进一步的转换:
"""
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("case.xlsx", "login")
print(data)
好啦~以上就是本次文章分享的全部内容啦,你学会了吗?希望能给大家带来帮助哦!
【Python自动化测试16】测试用例数据分离相关推荐
- 【Python自动化测试7】数据运算符知识讲解
文章目录 一.前言 二.数据运算合集 2.1 算数运算符 2.2 赋值运算符 2.3 比较运算符 2.4 逻辑运算符 2.5 成员运算符 2.6 身份运算符 2.7 位运算符 2.8 运算优先级 2. ...
- python+excel接口自动化测试(实现 数据分离,token获取,数据依赖,发送邮件)
自我学习加探索,还有待完善 目录 excel: get_data.py 封装: #coding:utf-8 from util.operation_excel import OperationExce ...
- 【Python自动化测试20】接口自动化测试框架模型搭建
文章目录 一.前言 二.框架搭建流程 2.1 项目创建 2.2 README文件 2.3 .gitignore文件 2.4 什么是测试框架? 2.5 分层设计 2.6 框架搭建 2.6.1 公用目录( ...
- 【Python自动化测试26】接口自动化测试实战六_pytest框架+allure讲解
文章目录 一.前言 二.pytest讲解 2.1 什么是pytest? 2.2 为什么使用pytest? 2.3 使用pytest 2.4 pytest的运行方式 2.5 pytest高级特性 2.5 ...
- 【Python自动化测试32】App自动化环境搭建
文章目录 一.前言 二.安装与环境搭建教学 2.1 环境依赖 2.2 appium程序安装 2.3 appium-python-client 2.4 模拟器安装 2.5 java jdk安装 2.6 ...
- 【Python自动化测试14】Python自动化测试基础与进阶练习题
文章目录 一.前言 二.Python练习题 2.1 Python基础语法规则 2.2 字符串相关练习题 2.3 列表与元组相关练习题 2.4 字典与数据类型练习题 2.5 流程控制语句练习题 2.6 ...
- 【Python自动化测试8】流程控制语句讲解
文章目录 一.前言 二.流程控制语句 2.1 if else流程控制语句的作用 2.2 if else条件语句讲解 2.2.1 简单的if语句 2.2.2 if / else语句 2.2.3 if / ...
- 【Python自动化测试15】unittest测试框架的核心概念与作用
文章目录 一.前言 二.认识单元测试 三.unittest核心概念与操作 3.1.unittest的作用 3.2.测试用例(TestCase) 3.3.运行测试用例 3.4.测试套件.加载器与运行器( ...
- python自动化测试-Python自动化测试如何自动生成测试用例?
今天, 陕西优就业 小优整理了一些技术类干货知识,学习软件测试的小伙伴,可以来看看,都是一些基础知识,希望能对你的学习有所帮助! 传统的测试用例需要测试或者开发人员将用户的操作用代码表示出来,通过断言 ...
最新文章
- linux运维人员必会运维工具
- 如何使用Exchange邮件组仲裁
- (POJ-3279)Fliptile (dfs经典---也可以枚举)
- android 关于页面,解析android中的帮助、about、关于作者、HELP等提示页面
- arm linux 识别新硬盘_Arm发布首款64位实时处理器CortexR82
- java和python都要掌握_如果两者都决定要学的话,先学Java还是Python?
- vc6可编译的 linux 源码,Linux 下源码编译FFMEG
- java自学之路-day17
- (最优解)L1-028 判断素数 (10分)——17行代码AC
- java性能调优工具--笔记
- Hamburger Steak
- jzoj4742-单峰【数学,数论】
- mysql切换用户sql语句,MySQL用户管理及SQL语句详解
- 如何分析网站日志文件
- 信息学奥赛C++语言: 输出最大值
- JQuery插件之弹窗:lhgDialog
- 叶片制成切片的结构示意图_更集成的发动机!洞悉UTC 3D打印整体式半叶片
- IE和火狐CSS透明层兼容写法
- SoapUI:mock service的使用
- TCP通信调试助手===wireshark使用
热门文章
- wsl2中安装中文输入法
- 湖南大学计算机软件开发毕业论文,湖南大学研究生学位论文_学位论文各页均加页眉,在版心上边线隔一行1 5磅的加粗、细双线(粗线在上),其上居_东城文库...
- css box-shadow 使用
- 讲解Guitar Pro 7使用向导的技巧
- 概述SAP云平台上的ABAP开发环境
- 如何高效建立知识库?
- 区块链 fisco bcos 2.72 在多机器上部署多个docker节点 ubuntu
- matlab语言及应用期末试卷,《MATLAB语言及应用》期末考试试题
- MathType7的最新版的介绍
- 奋斗吧,程序员——第十九章 无可奈何花落去,似曾相识燕归来