背景:每个迭代都会新增套餐的功能项,而且包括主办套餐、展商套餐、加油包,迭代测试中重复的工作量较多,非常适合自动化来自动对比

一、python代码实现思路:

1、每个迭代新增的功能项会整合到最新的excel中,稍作调整把最新的功能项列表放入表格第1列中---作为期望值
2、我们只需要把获取套餐接口返回的列表,读取出来写入到excel的第2列中----作为实际值

3、写一个方法用来获取第1列的值存入列表A,获取第2列的值存入列表B,遍历列表A是否在列表B中,把不在的存入diff列表C中

4、最后把预期列表A和实际列表B打印出来,并且判断当diff的列表为空即为测试通过,如果不为空打印出差异列表C

框架:pytest框架、excel操作类

二、pytest的test函数代码分享

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os,sys,pytest,os,random,requests,json,allure
from seleniumwire import webdriver
from time import sleep
from src.interface_get import Run_Main
from requests.packages.urllib3.exceptions import InsecureRequestWarning
from util.operate_excel import OperateExcel
# dr = webdriver.Chrome()
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

host = 'https://jieroutest.digitalexpo.com/'
tenantId='10014032021013100016120583168790000000000328375'
zhanhui_id='1000149'
account=16616108888

prod_host='https://iwhale.digitalexpo.com/'
prod_tenantId='10014032021032000016161752045388335528290236709'

filepath = os.path.abspath("../data/case_packet_function_name.xls") # 表格关闭才可以
operate = OperateExcel(filepath, 0)

#主办登录成功 /api/v2/auth/sys/login
@pytest.fixture()
def login_01():
#获取组织列表
url = host + '/api/v2/auth/sys/login'
data = {"verifyCode":"888888","account":"16616102222",
"tenantId":tenantId,"loginType":"VERIFY_CODE"}
headers = {
'Content-Type': 'application/json'
}
req = Run_Main(url, data, headers, 'POST')
res = req.request_post_json(url, data, headers)
userId = res['resultInfo']['userId']
accessCode = res['resultInfo']['accessCode']
userOrganizeInfoList = res['resultInfo']['userOrganizeInfoList']
bizProfileId = res['resultInfo']['userOrganizeInfoList'][0]['bizProfileId']
rootUserId = res['resultInfo']['userOrganizeInfoList'][0]['userId']

# 获取token
url_login2 = host + '/api/v2/pc'
data_login2 = {
"userId": userId,
"accessCode": accessCode,
"tenantId": tenantId,
"rootUserId": rootUserId,
"bizProfileId": bizProfileId,
"userOrganizeInfoList":userOrganizeInfoList
}
req = Run_Main(url_login2, data_login2, headers, 'POST')
res = req.request_post_json(url_login2, data_login2, headers)
assert res['resultCode']=="SUCCESS"
global token
token=res['resultInfo']['authorization']

#获取套餐列表
def test_sku_list(login_01):
url = host+'api/v2/package/sku/function/code/my?'
rand_str=str(random.randint(1,10000))
data={"skuType":"SPONSOR"}
headers = {
'authorization':token,
'x-access-lang': 'zh-cn',
'x-ca-tenant-id': tenantId
}
req = Run_Main(url, data, headers, 'GET')
res = req.request_get(url, data, headers)
print(res)
print(len(res['resultInfo']['functionInfoList']))
assert res['resultCode']=='SUCCESS'
return res

def test_compare_list(login_01):
res=test_sku_list(login_01)
length=len(res['resultInfo']['functionInfoList'])
diffs = []
col_result = []
for i in range(length):
try:
col_result.append(res['resultInfo']['functionInfoList'][i]['functionName'])
except:
print("写入实际列表失败")
col_expect = operate.get_cols_data(0)
print("------预期功能列表项有%s个" % len(col_expect), "------预期功能项列表%s" % col_expect)
print("------实际功能列表项有%s个" % len(col_result), "------实际功能项列表为%s" % col_result)
for t in col_expect:
if t not in col_result:
diffs.append(t)#预期中有的,实际没有的打印出来
if diffs==[]:
print("实际和预期的套餐功能项一致,恭喜!")
else:
print("------实际和预期的套餐功能项一致,不一样的有%s" %diffs)

# 把不同的地方列表写入exlce某一列
for m in range(len(diffs)):
try:
operate.write_data(m, 3, diffs[m])
except:
print("写入文件失败")

# 把返回值列表写入exlce某一列中
for j in range(length):
try:
operate.write_data(j, 1, res['resultInfo']['functionInfoList'][j]['functionName'])
except:
print("写入文件失败")

三、excel操作代码分享

#coding=utf-8
import xlrd
import os
from xlutils.copy import copy
class OperateExcel(object):
def __init__(self, filepath,index):
self.filepath=filepath
self.index=index
self.data=self.get_data()
# def __init__(self, filepath=None,index=None):
# # if filepath:
# # self.filepath=filepath
# # self.index=index
# # else:
# # self.filepath="./data/case1.xls"
# # self.index=0
# self.data=self.get_data()
def get_data(self):
book=xlrd.open_workbook(self.filepath)
print(book.sheet_names())
sheet=book.sheet_by_index(self.index)
return sheet
def get_lines(self):
nrows=self.data.nrows
print(nrows)
return nrows
def get_cell_value(self,row,col):#先行后列,从0开始
value=self.data.cell(row,col).value
print(value)
return value

def write_data(self,row,col,value):
read_data=xlrd.open_workbook(self.filepath)
write_data=copy(read_data)
sheet=write_data.get_sheet(0)
sheet.write(row,col,value)
write_data.save(self.filepath)

#获取某一列的内容:
def get_cols_data(self,col_id=None):
if col_id!=None:
col_data=self.data.col_values(col_id)
else:
col_data=self.data.col_values(0)
return col_data

#根据对应caseid找到对应行的行号
def get_row_num(self,case_id):
num=0
col_datas=self.get_cols_data()
for col_data in col_datas:
if str(case_id) in col_data:
print(num)
return num
num=num+1

#根据行号,找到行的内容
def get_row_values(self,row):
sheet=self.data
row_data=sheet.row_values(row)
return row_data

#根据对应的caseid找到对应行的内容
def get_row_data(self,case_id):
row_num=self.get_row_num(case_id)
data=self.get_row_values(row_num)
print(data)
return data

#1204--excel获取接口数据,获取所有行的内容
def read_excel(self):
ll=[]
for i in range(1,self.get_lines()):
ll.append(self.get_row_values(i))
return ll

if __name__ == '__main__':
filepath=os.path.abspath("../data/case_test_yunzhan_web.xls")#表格关闭才可以
operate=OperateExcel(filepath,0)
operate.get_data()
operate.get_lines()
operate.get_cell_value(2,2)
operate.write_data(2,3,'no')
operate.get_cell_value(2,2)

operate.get_row_num('Imooc-05')
operate.get_row_data('Imooc-05')

python代码对比数据相关推荐

  1. python代码学习-数据处理图片加遮挡、噪声、模糊

    python代码学习-数据处理图片加遮挡.噪声.模糊 (一)python代码学习-数据处理图片加遮挡 代码: from matplotlib import pyplot as plt from PIL ...

  2. 3000 字推荐一个可视化神器,50 行 Python 代码制作数据大屏

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编给大家分享一个制作数据大屏的工具,非常的好用,100行左右的Python代码就可以制作出来一个完整的数据大屏,并且代码的逻辑非常容易理解. Py ...

  3. dataframe 输出标题_【学界】第八章:Python代码之数据输出、调参与算法总结

    作者:小杨 学校:广东工业大学 年级:研二 专业:工业工程 主要研究兴趣:强化学习.深度学习 简介:作者是广东工业大学2016级工业工程系研究生,师从广东工业大学教授.博士生导师.<工业工程&g ...

  4. 50行Python代码绘制数据大屏,这个可视化框架真的太神了

    今天小编来为大家安利另外一个用于绘制可视化图表的Python框架,名叫Dash,建立在Flask.Plotly.js以及React.js的基础之上,在创建之出的目的是为了帮助前端知识匮乏的数据分析人员 ...

  5. 50 行 Python 代码绘制数据大屏,这个可视化框架真的太神了

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编来为大家安利另外一个用于绘制可视化图表的Python框架,名叫Dash,建立在Flask.Plotly.js以及React.js的基础之上,在创 ...

  6. php和python对比-通过PHP与Python代码对比浅析语法差异

    一.背景 人工智能这几年一直都比较火,笔者一直想去学习一番:因为一直是从事PHP开发工作,对于Python接触并不算多,总是在关键时候面临着基础不牢,地动山摇的尴尬,比如在遇到稍微深入些的问题时候就容 ...

  7. python语法类似于php_通过PHP与Python代码对比浅析语法差异

    一.背景 人工智能这几年一直都比较火,笔者一直想去学习一番:因为一直是从事PHP开发工作,对于Python接触并不算多,总是在关键时候面临着基础不牢,地动山摇的尴尬,比如在遇到稍微深入些的问题时候就容 ...

  8. bp神经网络预测python代码_机器学习之多层神经网络(附Python代码和数据)

    1 引言 多层神经网络,Multiple-layers Perceptron (MLP),又被称为多层感知机,是机器学习中深度学习的典型算法.关于多层神经网络的算法原理,我们在Stata和R实现的文章 ...

  9. python收集数据程序_用一行Python代码进行数据收集探索!Python真牛逼!

    简易的Pandas之路 任何使用P ython数据的人都会熟悉Pandas包.P andas是大多数行和列格式数据的go-to包. 如果你没有Pandas,请确保在终端中使用pip install安装 ...

最新文章

  1. [转载]windows phone 墓碑化(9)
  2. c语言程序结果 856400,C语言程序设计答案(黄保和编)第3章.pdf
  3. C++---类成员变量定义为引用
  4. spring mvc+junit
  5. 数据集转换_“2000坐标”成了标配,你还不懂坐标系定义和转换吗?
  6. 双非硕士阿里大数据开发面经(已拿offer)
  7. 【复习笔记】Cache的映像方法
  8. 软件外包相关职业规划
  9. WaitForMultipleObjects、WaitForSingleObject、GetExitCodeThread
  10. S7-200SMART案例分析——运动控制之步进选型(一)
  11. SDLC - 螺旋模型
  12. 我的世界java版海岛种子_我的世界海岛生存种子,是出生在海岛不是找的那种。...
  13. Mock Server入门及实践
  14. php加壳,文件加壳实现(三) —— ZwUnmapViewOfSection
  15. 计算机高程知识点,测量学复习基本知识点(全).doc
  16. 《租车管理系统 ——“订单管理(代驾)”模块》项目研发阶段性总结
  17. 如何隐藏Android模拟器的虚拟按键
  18. 实体链接在小布助手和OGraph的实践应用
  19. 我的Linux安装之旅
  20. 如何简单使用纯CSS3模仿时钟的指针转动

热门文章

  1. 【shell脚本编程大全-笔录01】
  2. linux 堆利用基础知识
  3. Mysql中比较时间的方法。
  4. 公众平台返回原始数据为: 错误代码-40164,错误信息-invalid ip, not in whitelist hint...
  5. 更适合娱乐办公的真无线耳机,续航音质都出色,QCY AilyPods上手
  6. 页面请求加载框,并屏蔽页面点击
  7. acwing 区间选点-java-贪心
  8. 在命令行窗口中看大片《星球大战》,太强了!
  9. wpf menu 菜单 快捷键
  10. 平台型时间信号强度曲线_乳腺MR灌注时间-信号强度曲线表现及价值研究