• 1
  • 0
分享

1、引言

在上一章, 我封装了http_service,  如果你不知道的话, 直接点击《Python3,接口自动化框架之封装http_service》跳转去看。 

当然,也有小伙伴私下跟我说, 没想到, http_service的封装, 会这么简单。

其实... 确实... 不难...

今天,我们继续来封装接口自动化框架。

在封装之前, 我们先想一个问题:

你喜欢使用脚本来维护测试用例, 还是喜欢用excel来维护测试用例?

如果你的接口参数经常改变, 使用脚本来维护,必然不是一个最高效的方式, 

这个时候, excel的维护方式,就排上用场了。 

让代码直接读取excel里面的数据进行接口测试, 想想是不是就开心呢?

并且excel维护的另两个好处:

    ①如果你的接口有数据依赖, 那么excel方式维护方便;

    ②针对不会写代码的同学,使用这个接口框架,也能进行测试;

    ③数据修改方便;

你看,使用excel来作为测试case, 有这么多好处, 为什么,你还要写脚本呢?

别告诉我, 你为了练习敲键盘.....

    -->这是小学校才做的事情。

所以, 我们的接口自动化框架, 就是用读取excel 作为测试case。

我们一起来看代码。   

2、代码示例

代码也很简单, 主要思路:

    ①依旧是用requests 库来进行封装请求方式、url、其你去参数

    ②读取excel表的数据

    ③二次封装读取Excel表数据,返回data列表

    ③二次封装写入excel表数据

    ④同时追加断言,报错就抛出异常

接下来,就看代码。

# -*- coding:utf-8 -*-
# @Time   : 2019-10-23
# @Author : Carl_奕然
 
import json
import requests
from openpyxl.styles import colors
from Interface_python3.public.http_service import HTTP
from Interface_python3.public import config,read_excel,write_excel
 
# 拼接url,path参数是域名后面的虚拟目录部分
def get_url(path):
    return ''.join([config.base_url, path])
  
# 封装requests请求方法,方法参数为:请求方式,接口url,请求参数
def get_response(method, url, **DataALL):
    if method == 'get':
        resp = HTTP().get(url, **DataALL)
    elif method == 'put':
        resp = HTTP().put(url, **DataALL)
    elif method == 'post':
        resp = HTTP().post(url, **DataALL)
    elif method == 'delete':
        resp = HTTP().delete(url, **DataALL)
    else:
        return "no the method"
    resp.encoding = 'UTF-8'
    return resp 
 
# 封装requests请求方法,请求参数testdata数据是从Excel表读取的
def get_excel_response(testdata):
    method = testdata["method"]  # 请求方式
    url = testdata["url"]  # 请求url
 
    # url后面的params参数
    try:
        params = eval(testdata["params"])
    except:
        params = None
 
    # 请求头部headers
    try:
        headers = eval(testdata["headers"])
    except:
        headers = None
 
    # post请求body内容
    try:
        bodydata = eval(testdata["body"])
        # 可在这里实现excel的body里面某个字段动态赋值,实现接口参数的关联,如token
        if 'accessToken' in testdata["body"]:
            bodydata['accessToken'] = config.accessToken
    except:
        bodydata = {}
 
    # post请求body类型,判断传data数据还是json
    type = testdata["type"]
    if type == "data":
        body = bodydata
    elif type == "json":
        body = json.dumps(bodydata)
    else:
        body = json.dumps(bodydata)
 
    # 发起网络请求,并返回数据
    try:
        r = requests.request(method=method,
                             url=url,
                             params=params,
                             headers=headers,
                             data=body)
        r.encoding = 'UTF-8'
        return r
    except Exception as msg:
        return msg
 
# 这个是二次封装读取Excel表数据,返回的data是列表类型,列表中子元素是字典类型
def get_excel_data(file_name, sheet_name):
    # fileName是文件名(要带后缀),sheetName是表名
    sheet = read_excel.ReadExcel(config.test_data_path + file_name, sheet_name)
    data = sheet.get_dict_data()
    return data
 
# 这个是二次封装写入Excel表数据,fileName是文件名,sheetName是表名,r是网络请求结果
def write_to_excel(file_name, sheet_name, test_data, r):
    # 这里的文件夹路径要修改为你的
    write_excel.copy_excel(config.test_data_path + file_name)  # 复制备份一份测试数据
    wt = write_excel.WriteExcel(config.test_data_path + file_name, sheet_name)
    row = test_data.get('rowNum')
    color = colors.BLACK
    try:
        if test_data.get('isCheckStatusCode'):
            if str(r.status_code) == test_data.get('checkpoint'):
                wt.write(row, 12, "pass", color)  # 测试结果 pass
            else:
                color = colors.RED
                wt.write(row, 12, "fail", color)  # 测试结果 fail
        else:
            if test_data.get("checkpoint") == '':
                wt.write(row, 12, "checkpoint为空", colors.RED)  # 没有设置检查点的值
            elif test_data.get("checkpoint") in r.text:
                wt.write(row, 12, "pass", color)  # 测试结果 pass
            else:
                color = colors.RED
                wt.write(row, 12, "fail", color)  # 测试结果 fail
 
        wt.write(row, 10, str(r.status_code), color)  # 写入返回状态码statuscode,第8列
        wt.write(row, 11, str(r.elapsed.total_seconds()), color)  # 耗时
        wt.write(row, 13, r.text, color)  # 响应内容
        wt.write(row, 14, "")  # 异常置空
        wt.wb.close()
    except Exception as msg:
        color = colors.RED
        wt.write(row, 10, "")
        wt.write(row, 11, "")
        wt.write(row, 12, "fail", color)
        wt.write(row, 13, "")
        wt.write(row, 14, str(r), color)
        wt.wb.close()
    return wt

看到这里, 是不是觉得,自己也能写base.py的配置了。

其实,都是一样的, 不难的。 

所以,要想写好自动化接口框架, 满足以下3点即可:

    -    首先,需要先非常熟悉接口测试, 非常熟悉你的项目, 

    -    其次,有编码的能力, 

    -    第三,有经验...  


你看,还觉得编写接口自动化框架难吗......

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   栉风沐雨二十载,继往开来谱新篇。一路热爱一路奔赴的51Testing迎来了20岁的生日。  2004年至今,51testing和大家追光而遇,沐光而行。在这里感恩每一位51Testing人,未来我们会继续热爱、继续发光!  余华曾说“和高人聊,从书上学,在事上练”是最快最重要的学习方式。  今天我们有幸邀请了十位特别嘉宾,他们有的是与51Testing一起成长20周年的版主,有的是51Testing的合作讲师,他们深耕在不同的行业,见证了软件测试行业的发展,见证了51Testing的成长,希望他们的观点,能够带给你不一样的启发!  特邀嘉宾  01特邀嘉宾:苗条小胖(合作讲师)  嘉宾身份...
            0 0 521
            分享
          • 测试报告是由测试人员撰写的,阅读对象是整个项目组。在测试报告的帮助下,测试人员、开发人员、项目经理、产品经理等相关者了解整体测试活动的质量。它可以帮助成员找出问题的根源或问题出现的阶段。它有助于分析问题是否是由于需求分析不够完善,代码设计不妥、管理不善的后果、不稳定的环境设施而导致的。对于项目的收官有重大意义。那测试总结报告应该怎么写呢?我见过一些测试总结报告只有过程,忽略结果,还有的总结报告只体现结果,忽略过程。我认为一份完整的测试总结报告需要将结果和过程相结合。具体包括的内容如下:任何报告都是结论先行。一上来,先pia一个结论,然后再详细开展论述。结论是为了告诉别人这个版本测试是合格还是不...
            3 3 6899
            分享
          • 12月19日消息,美国当地时间周日,推特宣布将禁止用户在其平台上免费推广其他社交媒体,违规者将被要求删除推文,严重者将被封禁账户。今年10月末,在埃隆·马斯克(Elon Musk)斥资440亿美元收购了推特后,许多用户在推特上分享他们的其他社交媒体账户。推特在周日的声明中表示:“我们认识到,我们的许多用户在其他社交媒体平台上都很活跃。然而,我们将不再允许某些社交媒体平台在推特上免费推广。”该公司继续称:“我们将删除仅仅为了推广其他社交平台而创建的账户,以及包含下列平台的链接或用户名的内容,Facebook、Instagram、Mastodon、Truth Social、Tribel、Nostr...
            0 0 990
            分享
          • 功能测试常规可输入的内容,数字,英文,中文,特殊符号,转义符等;非常规且有一定含义的html标签,css,js代码,url等;输入内容的边界值,空字符,超长文本;长度:最大长度的显示是否正常;是否支持换行;全角半角的字母、数字;字符串前后中带空格,前后的空格是否过滤,中间的空格是否保留;快捷键:能不能全选,部分选择,复制剪切粘贴是否可用,粘贴超过最大长度的字符串怎么显示,table键盘是否可用;兼容性测试根据产品的用户分布,手机品牌,分辨率,topN的机型;根据产品在不同浏览器上的占有率,选择主要的浏览器进行测试;兼容性关注页面的渲染,页面的布局,可以借助firebug测试;稳定性测试在某一压...
            0 0 1588
            分享
          • 一、同源策略所谓同源策略,就是指两个页面具有相同的协议,主机(也常说域名),端口,三个要素缺一不可二、什么是跨域 单地理解就是因为JavaScript同源策略的限制,一个域的页面去请求另一个域的资源,A域的页面去请求B域的资源。三、解决跨域1、Jsonp实现跨域jsonp的原理:动态创建<script>标签,而<script>的src属性是没有跨域限制的前端创建script标记,设置src,添加到head中(你可以往body中添加)后台返回一个js变量jsonp,这个jsonp就是请求后的JSON数据回调完成后删除script标记(还有一些清理工作如避免部分浏...
            0 0 976
            分享
      • 51testing软件测试圈微信