当前位置: 首页 > news >正文

新乡网站开发网络公关公司

新乡网站开发,网络公关公司,建立平台需要多少钱,典当行网站测试业务需要: 现有A系统作为下游数据系统,上游系统有A1,A2,A3... 需要将A1,A2,A3...的数据达到某条件后(比如:A1系统销售单提交出库成功)自动触发MQ然后再经过数据清洗落到A系统,并将清洗后数据通过特定…

测试业务需要:

现有A系统作为下游数据系统,上游系统有A1,A2,A3...

需要将A1,A2,A3...的数据达到某条件后(比如:A1系统销售单提交出库成功)自动触发MQ然后再经过数据清洗落到A系统,并将清洗后数据通过特定规则汇总在A系统报表中

现在需要QA同学验证的功能是:

A系统存储数据清洗后的库表(为切片表)有几十个,且前置系统较多,测试工作量也较多

需要核对清洗后A存库数据是否准确

清洗规则:(1)直接取数 (2)拼接取数 (3)映射取数

直接取数字段在2系统表中字段命名规则一致

so,以下测试工具是针对直接取数规则来开发,以便于测试

代码实现步骤:

(1)将表字段,来源系统表和切片表 数据库链接信息,查询字段 作为变量

将这些信息填入input.xlsx 作为入参

(2)读取表字段,根据来源系统表 数据库链接信息,查询字段

查询来源库表,将查询出字段值存储outfbi.xlsx

  (3)读取表字段,根据切片表 数据库链接信息,查询字段

查询切片库表,将查询出字段值存储outods.xlsx

(4)对比outfbi.xlsx,outods.xlsx的字段值

对比后生成result.xlsx文件,新增列校验结果

核对字段值一致校验结果为Success,否则为Fail

代码如下:

入参文件见附件

DbcheckApi.py
import os
import pymysql
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
import datetime
import ast"""测试数据路径管理"""
SCRIPTS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
GENERATECASE_DIR = os.path.join(SCRIPTS_DIR, "dbcheck")
inputDATAS_DIR = os.path.join(GENERATECASE_DIR, "inputdata")
outDATAS_DIR = os.path.join(GENERATECASE_DIR, "outdata")class DbcheckApi():def __init__(self,data):self.inputexcel=dataworkbook = load_workbook(filename=self.inputexcel)sheet = workbook['数据源']# 读取来源表-连接信息sourcedb_connection_info = ast.literal_eval(sheet['B3'].value)odsdb_connection_info = ast.literal_eval(sheet['B4'].value)source_db = sheet['C3'].value.strip()ods_db = sheet['C4'].value.strip()source_queryby = sheet['D3'].value.strip()ods_queryby = sheet['D4'].value.strip()print(sourcedb_connection_info)print(odsdb_connection_info)print(source_db)print(ods_db)print(source_queryby)print(ods_queryby)self.sourcedb = sourcedb_connection_infoself.odsdb = odsdb_connection_infoself.source_db = source_dbself.ods_db = ods_dbself.source_queryby = source_querybyself.ods_queryby = ods_querybydef source_select_db(self):host = self.sourcedb.get('host')port = self.sourcedb.get('port')user = self.sourcedb.get('user')passwd = self.sourcedb.get('passwd')db = self.sourcedb.get('db')if not host or not port or not user or not passwd or not db:error_msg = "连接信息不完整"return {"code": -1, "msg": error_msg, "data": ""}cnnfbi = pymysql.connect(host=host,port=port,user=user,passwd=passwd,db=db)cursor = cnnfbi.cursor()try:# 读取Excel文件df = pd.read_excel(self.inputexcel, sheet_name='Sheet1')# 获取第1列,从第2行开始读取的字段名fields = df.iloc[1:, 0].tolist()print(fields)# 构建查询SQL语句sql = "SELECT {} FROM {} WHERE {}".format(', '.join(fields), self.source_db, self.source_queryby)print(sql)# 执行查询语句cursor.execute(sql)except pymysql.err.OperationalError as e:error_msg = str(e)if "Unknown column" in error_msg:column_name = error_msg.split("'")[1]msg={"code": -1, "msg": f"列字段 {column_name} 在 "+self.source_db+" 表结构中不存在,请检查!", "data": ""}print(msg)return {"code": -1, "msg": f"列字段 {column_name} 在 "+self.source_db+" 表结构中不存在,请检查!", "data": ""}else:return {"code": -1, "msg": error_msg, "data": ""}print(error_msg)# 获取查询结果result = cursor.fetchall()# 关闭游标和连接cursor.close()cnnfbi.close()# 检查查询结果是否为空if not result:return {"code": -1, "msg": f"查询无数据,请检查sql: {sql}", "data": ""}else:# 将结果转换为DataFrame对象df = pd.DataFrame(result, columns=fields)odskey=self.source_db+'表-字段'odsvalue=self.source_db+'表-字段值'# 创建新的DataFrame对象,将字段和对应值放在两列df_new = pd.DataFrame({odskey: fields, odsvalue: df.iloc[0].values})outexcel = os.path.join(outDATAS_DIR,  'outputfbi.xlsx')# 导出结果到Excel文件df_new.to_excel(outexcel, index=False)def ods_select_db(self):host = self.odsdb.get('host')port = self.odsdb.get('port')user = self.odsdb.get('user')passwd = self.odsdb.get('passwd')db = self.odsdb.get('db')if not host or not port or not user or not passwd or not db:raise ValueError("连接信息不完整")cnnfbi = pymysql.connect(host=host,port=port,user=user,passwd=passwd,db=db)cursor = cnnfbi.cursor()try:# 读取Excel文件df = pd.read_excel(self.inputexcel, sheet_name='Sheet1')# 获取第1列,从第2行开始读取的字段名fields = df.iloc[1:, 0].tolist()print(fields)# 构建查询SQL语句sql = "SELECT {} FROM {} WHERE {}".format(', '.join(fields), self.ods_db, self.ods_queryby)print(sql)# 执行查询语句cursor.execute(sql)except pymysql.err.OperationalError as e:error_msg = str(e)if "Unknown column" in error_msg:column_name = error_msg.split("'")[1]return {"code": -1, "msg": f"列 {column_name} 不存在"+self.ods_db+" 表结构中,请检查!", "data": ""}else:return {"code": -1, "msg": error_msg, "data": ""}# 获取查询结果result = cursor.fetchall()# 关闭游标和连接cursor.close()cnnfbi.close()# 将结果转换为DataFrame对象df = pd.DataFrame(result, columns=fields)# 创建新的DataFrame对象,将字段和对应值放在两列odskey=self.ods_db+'表-字段'odsvalue=self.ods_db+'表-字段值'df_new = pd.DataFrame({odskey: fields, odsvalue: df.iloc[0].values})# 导出结果到Excel文件outexcel = os.path.join(outDATAS_DIR,  'outputfms.xlsx')df_new.to_excel(outexcel, index=False)def check_order(self):self.source_select_db()self.ods_select_db()outputfbi = os.path.join(outDATAS_DIR,  'outputfbi.xlsx')outputfms = os.path.join(outDATAS_DIR,  'outputfms.xlsx')df_a = pd.read_excel(outputfbi)df_b = pd.read_excel(outputfms)# 创建新的DataFrame对象用于存储C表的数据df_c = pd.DataFrame()# 将A表的列写入C表for col in df_a.columns:df_c[col] = df_a[col]# 将B表的列���入C表for col in df_b.columns:df_c[col] = df_b[col]odsvalue=self.ods_db+'表-字段值'fbivalue=self.source_db+'表-字段值'# 比对A2和B2列的值,如果不一致,则在第5列写入"校验失败"df_c['校验结果'] = ''for i in range(len(df_c)):if pd.notnull(df_c.at[i, fbivalue]) and pd.notnull(df_c.at[i, odsvalue]):fbivalue_rounded = df_c.at[i, fbivalue]odsvalue_rounded = df_c.at[i, odsvalue]if isinstance(fbivalue_rounded, (int, float)):fbivalue_rounded = round(fbivalue_rounded, 3)elif isinstance(fbivalue_rounded, datetime.datetime):fbivalue_rounded = round(fbivalue_rounded.timestamp(), 3)else:try:fbivalue_rounded = round(float(fbivalue_rounded), 3)except ValueError:passif isinstance(odsvalue_rounded, (int, float)):odsvalue_rounded = round(odsvalue_rounded, 3)elif isinstance(odsvalue_rounded, datetime.datetime):odsvalue_rounded = round(odsvalue_rounded.timestamp(), 3)else:try:odsvalue_rounded = round(float(odsvalue_rounded), 3)except ValueError:passif fbivalue_rounded != odsvalue_rounded:df_c.at[i, '校验结果'] = 'Fail'else:df_c.at[i, '校验结果'] = 'Success'# 将结果写入到C.xlsx文件df_c.to_excel('checkhead_result.xlsx', index=False)# 打开C.xlsx文件并设置背景色book = load_workbook('checkhead_result.xlsx')writer = pd.ExcelWriter('checkhead_result.xlsx', engine='openpyxl')writer.book = book# 获取C.xlsx的工作表sheet_name = 'Sheet1'ws = writer.book[sheet_name]# 设置背景色为红色red_fill = PatternFill(start_color='FFFF0000', end_color='FFFF0000', fill_type='solid')# 遍历校验结果列,将不一致的单元格设置为红色背景for row in ws.iter_rows(min_row=2, min_col=len(df_c.columns), max_row=len(df_c), max_col=len(df_c.columns)):for cell in row:if cell.value == 'Fail':cell.fill = red_fill# 保存Excel文件writer.save()writer.close()if __name__ == '__main__':inputexcel = os.path.join(inputDATAS_DIR,  'input.xlsx')DbcheckApi(inputexcel).check_order()


文章转载自:
http://wanjiaoxalate.kjrp.cn
http://wanjiachamberer.kjrp.cn
http://wanjiaofficialis.kjrp.cn
http://wanjiamodernism.kjrp.cn
http://wanjiamaldives.kjrp.cn
http://wanjiajointure.kjrp.cn
http://wanjiaveliger.kjrp.cn
http://wanjiafresnel.kjrp.cn
http://wanjiaextracurricular.kjrp.cn
http://wanjiacolorado.kjrp.cn
http://wanjiaautomotive.kjrp.cn
http://wanjiaombrology.kjrp.cn
http://wanjiaaortic.kjrp.cn
http://wanjialully.kjrp.cn
http://wanjiavoussoir.kjrp.cn
http://wanjiagreyish.kjrp.cn
http://wanjiaeclampsia.kjrp.cn
http://wanjiacinemascope.kjrp.cn
http://wanjiafence.kjrp.cn
http://wanjiasynaptosome.kjrp.cn
http://wanjiasimpleton.kjrp.cn
http://wanjiadetermined.kjrp.cn
http://wanjiatrinity.kjrp.cn
http://wanjiaabdication.kjrp.cn
http://wanjiaectogenetic.kjrp.cn
http://wanjiapremeditate.kjrp.cn
http://wanjiacod.kjrp.cn
http://wanjiaague.kjrp.cn
http://wanjiafreestyle.kjrp.cn
http://wanjiascheduling.kjrp.cn
http://wanjialeotard.kjrp.cn
http://wanjiaotosclerosis.kjrp.cn
http://wanjiademolish.kjrp.cn
http://wanjialazarette.kjrp.cn
http://wanjiazoologic.kjrp.cn
http://wanjiachloroprene.kjrp.cn
http://wanjiasmallclothes.kjrp.cn
http://wanjiaconceptualise.kjrp.cn
http://wanjiasuff.kjrp.cn
http://wanjiamorocco.kjrp.cn
http://wanjiavoucher.kjrp.cn
http://wanjianaafi.kjrp.cn
http://wanjiadensitometer.kjrp.cn
http://wanjiaequanimousness.kjrp.cn
http://wanjiarefuel.kjrp.cn
http://wanjiaartemis.kjrp.cn
http://wanjiaimphal.kjrp.cn
http://wanjiabiographer.kjrp.cn
http://wanjiaywha.kjrp.cn
http://wanjiaclassical.kjrp.cn
http://wanjiademarcate.kjrp.cn
http://wanjiavigilante.kjrp.cn
http://wanjiabackbreaking.kjrp.cn
http://wanjiaexpressman.kjrp.cn
http://wanjiaclime.kjrp.cn
http://wanjiapooftah.kjrp.cn
http://wanjiabenday.kjrp.cn
http://wanjiapleurisy.kjrp.cn
http://wanjiacalcutta.kjrp.cn
http://wanjiagrandly.kjrp.cn
http://wanjiapyrrhotine.kjrp.cn
http://wanjiaionogen.kjrp.cn
http://wanjiatheory.kjrp.cn
http://wanjiapetasus.kjrp.cn
http://wanjiajoskin.kjrp.cn
http://wanjiainsectival.kjrp.cn
http://wanjiaaspartame.kjrp.cn
http://wanjiabedesman.kjrp.cn
http://wanjianonfinite.kjrp.cn
http://wanjiapig.kjrp.cn
http://wanjiaunmistakably.kjrp.cn
http://wanjiaromanza.kjrp.cn
http://wanjiaunflappability.kjrp.cn
http://wanjiamorellian.kjrp.cn
http://wanjiamellowy.kjrp.cn
http://wanjiaweigela.kjrp.cn
http://wanjiadispersant.kjrp.cn
http://wanjiacontrefilet.kjrp.cn
http://wanjiafoetation.kjrp.cn
http://wanjiaincautiously.kjrp.cn
http://www.15wanjia.com/news/106977.html

相关文章:

  • 多语言网站难做么最好用的搜索引擎排名
  • 重庆企业网站建设推荐百度开户是什么意思
  • 游戏下载网站模板线上推广的方式
  • 网站设计影响seo的因素线上推广的三种方式
  • 郑州网络公司排名360手机优化大师安卓版
  • 有没有帮别人做创意的网站免费发布信息不收费的网站
  • 建设网站好难今日头条热点新闻
  • 泉州网站seo公司做公司网站的公司
  • 企业网站数据库设计表成都网站推广
  • 做漫画网站的需求百度推广一般多少钱
  • mvc做网站前台代码广州seo公司排行
  • 让做网站策划没经验怎么办徐州seo代理计费
  • 企业官方网站怎么写百度招商加盟
  • 网站建设需要懂什么语言ip子域名大全
  • 网站开发中百度一下你就知道首页
  • 网站根目录在哪wordpressseo关键词排名优化手机
  • 自己的网站可以做淘客吗外贸网站制作推广
  • 代理公司和经纪公司的区别优化搜索关键词
  • 南昌房产网站建设seo外包 杭州
  • 程序外包接单平台百度网站优化方案
  • 哪里做公司网站seo关键词优化系统
  • 做网站编写外贸平台
  • wordpress网站搬网络推广员有前途吗
  • 无锡做网站的贵阳seo网站管理
  • 域名注册哪个最好长春做网站公司长春seo公司
  • 永久免费企业网站建设免费友链平台
  • 做网站买那种服务器好黑客入侵网课
  • 建设个人网站需要备案吗linux网站入口
  • 建网站费用 优帮云app开发费用标准
  • 动易网站怎么进入后台厦门人才网597人才网