前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >08 测试数据:是不是可以把所有的参数都保存到Excel中?

08 测试数据:是不是可以把所有的参数都保存到Excel中?

作者头像
测试开发囤货
发布2021-08-11 15:12:09
5390
发布2021-08-11 15:12:09
举报
文章被收录于专栏:测试开发囤货

测试数据的好处:打造自动化测试框架

将数据存储到一种数据存储文件中,这样 代码就可以自行查找对应的参数,然后调取测试框架执行测试流程,接着再通过自动比对返 回预期,检验测试结果是否正确。

这样做有两个好处。

1. 无人值守,节省时间和精力。我们将所有的参数都存储到外部存储文件中,测试框架就 可以自行选择第一个参数进行测试,在完成第一个测试之后,它也就可以自行选择下一 个参数,整个执行过程是不需要人参与的。否则的话,我们每复制一组参数,就要执行 一次脚本,然后再人工替换一次参数,再执行一次脚本,这个过程耗时费力,而且又是 一个纯人工控制的没什么技术含量的活动。

2. 自动检测返回值,提高测试效率。如果你用上面的代码段完成接口测试,就要每执行一 次,人工去观察一次,看接口的返回是不是和预期一致,人工来做这些事情,不只非常 耗费时间,效率也很低下。但是通过代码完成一些关键匹配却很容易,这可以大大提高 测试效率,快速完成交付。

如何选取测试数据

Excel 是在设计测试用例方面使 用最多的一个工具,那么我们也就可以用 Excel 作为自己的参数存储文件

但在动手之前,你也应该想到,你的参数文件类型不会是一成不变的 Excel,未来你也有可 能使用其他格式的参数文件,因此在一开始你还要考虑到参数类的扩展性,这样你就不用每 多了一种参数文件存储格式,就写一个参数类,来完成参数的选取和调用了。那么如何选取和调用参数呢?你可以看看我设计的参数类:

代码语言:javascript
复制
import json
import xlrd


class Param(object):

    def __init__(self, paramConf='{}'):

    self.paramConf = json.loads(paramConf)


def paramRowsCount(self):
    pass


def paramColsCount(self):
    pass


def paramHeader(self):
    pass


def paramAllline(self):
    pass


def paramAlllineDict(self):
    pass


class XLS(Param):
    '''
    xls基本格式(如果要把xls中存储的数字按照文本读出来的话,纯数字前要加上英文单引号:
    第一行是参数的注释,就是每一行参数是什么
    第二行是参数名,参数名和对应模块的po页面的变量名一致
    第3~N行是参数
    最后一列是预期默认头Exp
    '''


def __init__(self, paramConf):
    '''
    :param paramConf: xls 文件位置(绝对路径)
    '''
    self.paramConf = paramConf
    self.paramfile = self.paramConf['file']
    self.data = xlrd.open_workbook(self.paramfile)
    self.getParamSheet(self.paramConf['sheet'])


def getParamSheet(self, nsheets):
    '''
    设定参数所处的sheet
    :param nsheets: 参数在第几个sheet中
    :return:
    '''
    self.paramsheet = self.data.sheets()[nsheets]


def getOneline(self, nRow):
    '''
    返回一行数据
    :param nRow: 行数
    :return: 一行数据 []
    '''
    return self.paramsheet.row_values(nRow)


def getOneCol(self, nCol):
    '''
    返回一列
    :param nCol: 列数
    :return: 一列数据 []
    '''
    return self.paramsheet.col_values(nCol)


def paramRowsCount(self):
    '''
    获取参数文件行数
    :return: 参数行数 int
    '''
    return self.paramsheet.nrows


def paramColsCount(self):
    '''
    获取参数文件列数(参数个数)
    :return: 参数文件列数(参数个数) int
    '''
    return self.paramsheet.ncols


def paramHeader(self):
    '''
    获取参数名称
    :return: 参数名称[]
    '''
    return self.getOneline(1)


def paramAlllineDict(self):
    '''
    获取全部参数
    :return: {{}},其中dict的key值是header的值
    '''
    nCountRows = self.paramRowsCount()
    nCountCols = self.paramColsCount()
    ParamAllListDict = {}
    iRowStep = 2
    iColStep = 0
    ParamHeader = self.paramHeader()
    while iRowStep < nCountRows:
        ParamOneLinelist = self.getOneline(iRowStep)
    ParamOnelineDict = {}
    while iColStep < nCountCols:
        ParamOnelineDict[ParamHeader[iColStep]] = ParamOneLinelist[iColStep]
    iColStep = iColStep + 1
    iColStep = 0
    ParamAllListDict[iRowStep - 2] = ParamOnelineDict
    iRowStep = iRowStep + 1
    return ParamAllListDict


def paramAllline(self):
    '''
    获取全部参数
    :return: 全部参数[[]]
    '''
    nCountRows = self.paramRowsCount()
    paramall = []
    iRowStep = 2
    while iRowStep < nCountRows:
        paramall.append(self.getOneline(iRowStep))
    iRowStep = iRowStep + 1
    return paramall


def __getParamCell(self, numberRow, numberCol):
    return self.paramsheet.cell_value(numberRow, numberCol)


class ParamFactory(object):

    def chooseParam(self, type, paramConf):
        map_ = {
            'xls': XLS(paramConf)
        }

        return map_[type]

接下来,你就可以把这次测试的全 部参数都存到 Excel 里面了,具体内容如下图所示:

通过上面的参数类你可以看出,在这个 Excel 文件中,第一行是给人读取的每一列参数的注 释,而所有的 Excel 都是从第二行开始读取的,第二行是参数名和固定的表示预期结果的 exp。现在,我们使用 ParamFactory 类,再配合上面的这个 Excel,就可以完成”战 场“系统“选择武器”接口的改造了,如下面这段代码所示:

代码语言:javascript
复制
# 引入Common、ParamFactory类
from common import Common
from param import ParamFactory
import os

# uri_login存储战场的选择武器
uri_selectEq = '/selectEq'
comm = Common('http://127.0.0.1:12356', api_type='http')
# 武器编号变量存储武器编号,并且验证返回时是否有参数设计预期结果
# 获取当前路径绝对值
curPath = os.path.abspath('.')
# 定义存储参数的excel文件路径
searchparamfile = curPath + '/equipmentid_param.xls'
# 调用参数类完成参数读取,返回是一个字典,包含全部的excel数据除去excel的第一行表头说明
searchparam_dict = ParamFactory().chooseParam('xls', {'file': searchparamfile})
i = 0
while i < len(searchparam_dict):
    # 读取通过参数类获取的第i行的参数
    payload = 'equipmentid=' + searchparam_dict[i]['equipmentid']
    # 读取通过参数类获取的第i行的预期
    exp = searchparam_dict[i]['exp']
    # 进行接口测试
    response_selectEq = comm.post(uri_selectEq, params=payload)
    # 打印返回结果
    print('Response内容:' + response_selectEq.text)
    # 读取下一行excel中的数据
    i = i + 1

总结

今天我们接口测试数据准备的内容就到这里了,在接口测试的工作中,作为“巧妇”的测试 工程师,还是需要参数这个“米”来下锅的,虽然我们之前课程中的代码涉及到参数的处 理,但是都很简单粗暴,一点也不适合自动化的处理方式,因此今天,我带你完成了参数类 的封装。

有的时候,我们也把参数类叫做参数池,这也就是说参数是存放在一个池子中,那我们准备 好的池子就是 Excel。我相信未来你也会不断扩展自己参数池的种类,这有可能是由于测试 接口的特殊需求,也有可能是由于团队技术栈的要求。因此,我们封装参数池是通过简单工 厂设计模式来实现的,如果你的代码基础并不好,那么你可以不用搞清楚简单工厂设计模式 是什么,只需要知道如何模拟上述代码,再进行扩展就可以了。

一个好用的测试框架既要有很好的可用性,也要有很好的扩展性设计,这样我们的私有接口 测试武器仓库就会变成可以不断扩展的、保持统一使用方法的武器仓库,这样才能让你或者 你的团队在面对各种各样的测试任务时,既可以快速适应不同接口测试的需求,又不需要增 加学习的成本。

分享大佬们的公众号:

【分享测试开发相关技术,跟着博主从0到1写一个测试平台吧!】

【记录自己的测试开发之路。】

【小方,专注于测试开发笋货分享~】

【测试开发囤货】

1.共享测试资料,提高测试技能

2.了解软件测试行业最新的动态

3.给测试小白提供更多的帮助!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发囤货 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档