testrun模块呢就是最终自动化测试入口,调用前面封装的各个模块主要流程是:

1. 获取测试集种待执行的测试用例

2. 处理测试用例获取的数据,包括转换数据格式,处理数据的中的关联等

3. 处理完数据后发生request,获取返回结果,同时处理返回结果

4. 处理返回结果包括断言结果列表,提取变量,获取测试报告所需内容等

代码如下:

from ProVar.ProjConfigVar import *
from Util.getTestSuit import *
from Action.KeyAction import *
from Util.TestDataHandler import *
from Util.AssertResult import *
from Util.html_report import *
from Util.ClearData import *
import os
import re
#获取测试数据文件的绝对路径
#获取待测接口测试集
# 执行前先清除上次执行结果
clear()
# 开始运行
test_suit = get_test_case_sheet_names(ExceldirPath)
test_results_for_html_report = []
# 存储全局变量
global_vars = {}
#实例化一个Excel实例,用于回写每一个test_case的result到Excel
excel_instance_for_result_write = Excel(ExceldirPath)
for test_sheet_name in test_suit:
flag = True
# 请求接口sheet
apiName = test_sheet_name[1]
excel_instance_for_result_write.set_sheet_by_name(apiName)
# 获取测试步骤测试用例集
test_cases = test_cases_from_test_data_sheet(ExceldirPath,apiName)
# 转换数据格式
# test_cases = pre_data_hander(test_cases,global_vars)
for test_case in test_cases:
test_case = pre_data_hander(test_case,global_vars)
start_time = time.time()
test_case_serials,method,baseurl,header,auth,body,assert_content,var_get_reg,assert_word,test_case_name= test_case
# print(var_get_reg)
response= api_request(method,baseurl,header,auth,body,test_case_name)
end_time=time.time()
try:
info("接口的响应结果是:%s" %response.text)
# excel书写response的状态码和response内容
excel_instance_for_result_write.write_cell_value(int(test_case[0]+1),Test_Case_executeResult_col_no+1,response.status_code)
excel_instance_for_result_write.write_cell_value(int(test_case[0]+1),Test_Case_result_content_col_no+1,response.text)
# excel书写测试执行时间
excel_instance_for_result_write.write_current_time(int(test_case[0]+1),Test_Case_execute_time_col_no+1)
if assert_content:#如果有断言sheet
info("断言表为:%s" % assert_content)
if assert_result(excel_instance_for_result_write,response,assert_content):
# excel书写断言结果
excel_instance_for_result_write.write_cell_value(int(test_case[0] + 1),Test_Case_assert_result_col_no + 1, "成功", "green",apiName)
# 写report需要的字段
test_results_for_html_report.append(
(test_case_name,response.url, body, response.text, int((end_time - start_time) * 1000), assert_content, "成功"))
else:
excel_instance_for_result_write.write_cell_value(int(test_case[0] + 1),
Test_Case_assert_result_col_no + 1, "失败", "red",apiName)
# 写report需要的字段
test_results_for_html_report.append(
(test_case_name,response.url, body, response.text, int((end_time - start_time) * 1000), assert_content, "失败"))
flag = False
# 如果仅仅是单纯的验证某一个返回结果字段
elif assert_word:
info("断言字段为:%s" % assert_word)
if re.search(assert_word,response.text):
# excel书写断言结果
excel_instance_for_result_write.write_cell_value(int(test_case[0] + 1),Test_Case_assert_result_col_no + 1, "成功", "green",apiName)
# 写report需要的字段
test_results_for_html_report.append(
(test_case_name,response.url, body, response.text, int((end_time - start_time) * 1000), assert_content, "成功"))
else:
excel_instance_for_result_write.write_cell_value(int(test_case[0] + 1),
Test_Case_assert_result_col_no + 1, "失败", "red",apiName)
# 写report需要的字段
test_results_for_html_report.append(
(test_case_name,response.url, body, response.text, int((end_time - start_time) * 1000), assert_content, "失败"))
flag = False
#如果var_get_reg不为空,即要求提取返回变量
if var_get_reg:
var_name = var_get_reg.split("||")[0]
regx = var_get_reg.split("||")[1]
# print(var_name,regx)
if re.findall(regx, response.text):
var_value = re.findall(regx, response.text)
# 去除重复数据
var_value = list(set(var_value))
exec("global_vars['%s']=%s" % (var_name, var_value))
info("从响应中提取的变量名%s,变量值为%s" % (var_name, var_value))
info("生成全局变量名: global_vars['%s']=%s" % (var_name, var_value))
# 将提取的变量写入excel
excel_instance_for_result_write.write_cell_value(int(test_case[0] + 1),Test_Case_var_result_col_no+1,str(var_value),None,apiName)
except IndexError:
info('提取变量失败:'+traceback.format_exc())
excel_instance_for_result_write.write_cell_value(int(test_case[0] + 1),Test_Case_var_result_col_no+1,"Failed","red",apiName)
except:
# traceback.print_exc()
excel_instance_for_result_write.write_cell_value(int(test_case[0] + 1), Test_Case_executeResult_col_no+1, "失败","red",apiName)
if not response:
error("请求接口系统无法连接")
# break
test_results_for_html_report.append(
(test_case_name,baseurl, body, response, int((end_time - start_time) * 1000), assert_content, "失败"))
else:
test_results_for_html_report.append(
(test_case_name,response.url, body, response.text, int((end_time - start_time) * 1000), assert_content, "失败"))
flag = False
info("接口请求的耗时为%d 毫秒" %((end_time - start_time)*1000))
excel_instance_for_result_write.set_sheet_by_index(1)
if flag:
excel_instance_for_result_write.write_cell_value(int(test_sheet_name[0]) + 1, Test_Suit_execute_result_col_no+1, "成功","green")
else:
excel_instance_for_result_write.write_cell_value(int(test_sheet_name[0]) + 1, Test_Suit_execute_result_col_no+1, "失败","red")
excel_instance_for_result_write.write_current_time(int(test_sheet_name[0]) + 1, Test_Suit_execute_time_col_no+1)
# print(global_vars)
html_name = '接口测试报告'
report_html(test_results_for_html_report, html_name)

20191011-构建我们公司自己的自动化接口测试框架-testrun最重要的模块的更多相关文章

  1. 20191011-构建我们公司自己的自动化接口测试框架-Action的request方法封装

    Action模块 封装接口request方法,根据传入的参数调用不同的请求方法,因为项目特色,我们公司的接口都是get和post方法,所以仅仅封装了get和post方法: import request ...

  2. 20191011-构建我们公司自己的自动化接口测试框架-Util的ClearData模块

    cleardata模块主要是用于在每次测试之前清除历史执行痕迹,主要代码如下: from Util.ParseExcel import * from ProVar.ProjConfigVar impo ...

  3. 20191011-构建我们公司自己的自动化接口测试框架-Util的AssertResult模块

    AssertResult主要就是进行结果断言的了,因为断言结果分2种情况,一种是断言词,一种是断言sheet,如果涉及断言sheet,则需要操作excel到对应的断言表断言所有的字段并且书写断言结果主 ...

  4. 20191011-构建我们公司自己的自动化接口测试框架-Util的TestDataHandler模块

    TestDataHandler模块主要是做测试数据的处理,包括转换数据格式和变量参数处理转换数据格式函数: data是数据,data以$()的方式识别变量,如果请求的数据有变量,则将变量用global ...

  5. 20191011-构建我们公司自己的自动化接口测试框架-Util的getTestSuite模块

    getTestSuite主要是用于在testData里面获取测试集以及对应的测试数据,包括2个主要的方法,一个是获取测试集,一个是获取测试集里面要执行的测试用例 获取测试集方法: from Util. ...

  6. 20191011-构建我们公司自己的自动化接口测试框架-Util的htmlreport模块

    生成htmlreport的模块是我在网上随意找的一个版本,主要生成的report包括接口名称,接口url,请求数据,响应数据,断言词,断言结果等 具体的htmlreport代码如下: # -*- en ...

  7. 20191011-构建我们公司自己的自动化接口测试框架-Util的读取excel常用方法模块

    包括获取excel的sheet名字,设定excel的sheet,读excel,写excel等常规操作. from openpyxl import Workbook from openpyxl impo ...

  8. 20191011-构建我们公司自己的自动化接口测试框架-ProVar模块

    ProVar模块主要定义测试数据所在目录,以及定义变量和测试数据excel里面的column对应这样后续在进行excel操作的时候直接使用变量即可进行操作,后期excel的column有增删的时候,修 ...

  9. 20191011-构建我们公司自己的自动化接口测试框架-Config配置

    Config模块主要是为了存放的一些其他配置等的一个目录,当前目录存放日志配置文件 ################################################ [loggers] ...

随机推荐

  1. luogu_P4767 [IOI2000]邮局

    传送门 Description 高速公路旁边有一些村庄.高速公路表示为整数轴,每个村庄的位置用单个整数坐标标识.没有两个在同样地方的村庄.两个位置之间的距离是其整数坐标差的绝对值. 邮局将建在一些,但 ...

  2. 2019CSP-S初赛知识点汇总

    0x00 基本算法 0x01 位运算 0x02 前缀和与差分 0x03 二分 0x04 倍增 0x05 排序 0x06 离散化 0x07 高精度 0x10 数据结构 0x11 栈和队列 0x12 链表 ...

  3. js 返回两数(包含这两数)之间的随机数函数

    function selectFrom( lowerValue, upperValue ){ var choices = upperValue - lowerValue + 1; return Mat ...

  4. SCHED_FIFO与SCHED_OTHER调度机制

    疑问 两个线程分别有不同的调度策略,一个SCHED_FIFO,一个SCHED_OTHER,按照之前的理解,SCHED_FIFO实时线程一定会占用CPU一直运行,导致SCHED_OTHER的普通线程得不 ...

  5. Java 面向对象(十四)

    反射 反射是框架设计的灵魂 一.类的加载时机 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 :就是指将class文件读入内存,并为 ...

  6. jQuery 设置select,radio的值,无法自动触发绑定的change事件

    一.问题 今天在对select和radio做change事件绑定后,手动设置其value值,但是不能触发change事件 二.解决 使用trigger方法手动触发

  7. Echarts常用API(echarts和echartsInstance)

    一.echarts上的方法 一般在项目中引入echarts之后,可以获得一个全局的echarts对象. 1.下面是几个比较常用的echarts方法 echarts.init() 创建一个echarts ...

  8. qt 创建程序目录

    voidinitDir() { QStringuserFilePath=QStandardPaths::writableLocation(QStandardPaths::DocumentsLocati ...

  9. [Java复习] 缓存Cache part1

    1. 在项目中是如何使用缓存的?为什么要用?不用行不行?用了可能会有哪些不良后果? 结合项目业务,主要两个目的:高性能和高并发.缓存走内存,天然支持高并发. 不良后果: 缓存与DB双写不一致 缓存雪崩 ...

  10. KL距离(相对熵)

    KL距离,是Kullback-Leibler差异(Kullback-Leibler Divergence)的简称,也叫做相对熵(Relative Entropy).它衡量的是相同事件空间里的两个概率分 ...