美文网首页python接口自动化测试
python接口自动化测试实战(第四章)

python接口自动化测试实战(第四章)

作者: 6780441d2bcc | 来源:发表于2019-07-02 22:45 被阅读27次

如果你不太明白这篇文章是做什么的,点击下方进入介绍篇:

点击跳转到介绍篇,你可以知道自己能收获什么,和将要做的功能点和是否值得学习,别再迷茫了,不日进,则日退,学习才是你应该做的事情。

进入介绍篇了解你将要走的路:python接口自动化测试(第一篇)

开始改变人生之旅,不在被开发嫌弃,不在害怕面试没有亮点,没有竞争力。

上一章已经可以把element相关接口的配置文件读取出来了,接下来咱们读取testcase文件:

文件下载地址可以加qq群进行获取,也可以通过下载地址进行获取

点击下载文件~

在seautotest下增加testcase文件,将testcase.xlsx放入这个文件夹下

image

testcase.xlsx内容如截图:


testcase.xlsx
testcase.xlsx

思路如下:

  • 第一步:将数据全部读取出来,使用上一章里面封装好的读取Excel的方法进行

  • 第二步:获取到的数据,组成json结构(不懂什么是json的可以自行百度下)

  • 第三步:替换数据,将excel的数据进行替换,调用python函数(这样可以灵活的处理数据)

接下来进行读取:

在utlis.py方法里面

加入这几行代码:

if __name__ == '__main__':
    # file = '../element/elements.xlsx'
    # e = Excel('r', file)
    # list_read = e.read()
    # ele = element_tojson(list_read)
    # print(ele['获取短信验证码'])
    test_case = '../testcase/testcase.xlsx'
    e_case = Excel('r', test_case)
    # 打印输出结果
    for case in e_case.read():
        print(case)

将获得的结果打印出来,输出结果如下:

image

看来封装的方法还是挺好用的~~~可以直接读取出来内容,接下来对testcase内容进行处理

这里进行第二步,将testcase.xlsx文件读取出来的内容,重组成为json格式

在utlis.py里面增加datatojson方法,代码如下:

"""
1.讲excel头部替换成英文的
2.处理成json格式
"""
def datatodict(data):
    header = {
        '用例编号': 'id',
        '用例标题': 'title',
        '前置条件': 'condition',
        '测试功能点': 'testdot',
        '测试步骤': 'step',
        '操作': 'keyword',
        '页面': 'page',
        '元素': 'element',
        '测试数据': 'data',
        '预期结果': 'expected',
        '设计者': 'designer',
        '步骤结果': 'score',
        '备注': 'remark',
    }
    head = []
    list_dict_data = []
    for d in data[1]:
        # 获取到英文的头部内容如果为中文,则替换成英文 进行改成一个k
        # 传入两个参数的作用是 查到则返回查到的数据查不到则返回传入的原数据
        d = header.get(d, d)
        # 将去除的头部英文装进list中
        head.append(d)

    # 获取到数据进行切片处理,0坐标为标题,1坐标是头部
    for b in data[2:]:
        # 头部和内容拼接为json串
        dict_data = {}
        for i in range(len(head)):
            # 之所以判断类型,如果不进行判断会出现str的错误,strip去除空格也有转str的用法
            if isinstance(b[i], str):
                dict_data[head[i]] = b[i].strip()
            else:
                dict_data[head[i]] = b[i]
        # list里面是字典格式
        list_dict_data.append(dict_data)
    return list_dict_data

写完之后运行检查下函数是否可用,也是检查下代码,写了一堆代码后来发现不能用是不是很尴尬,所以写一个就调试一下

if __name__ == '__main__':
    # file = '../element/elements.xlsx'
    # e = Excel('r', file)
    # list_read = e.read()
    # ele = element_tojson(list_read)
    # print(ele['获取短信验证码'])
    test_case = '../testcase/testcase.xlsx'
    e_case = Excel('r', test_case)
    re=e_case.read()
    for c in datatodict(re):
        print(c)

运行结果如下:

image

下一步,数据处理为json格式,可执行json格式:

我还是在utlis.py里面增加suite_format函数

讲dict格式的数据处理为测试套件格式


# dict格式的数据处理为测试套件格式
def suite_format(data):
    # 用例套件list
    testsuite = []
    # 每个用例的testcase
    testcase = {}
    # 得到用例的所有数据
    # 循环遍历判断里面是不是一组用例生成用例集
    for d in data:
        # 判断用例有没有标题,没有标题则认为是统一用例,有标题则认为是第二条第三条用例依次类推
        if d['id'].strip():
            # 判断是否为空 true false
            if testcase:
                # 不为空则只认为用例直接添加到list里面
                testsuite.append(testcase)
                # 讲testcase置空
                testcase = {}
            # 这里生成了用例的标题行,里面没有step
            for key in ('id', 'title', 'condition', 'testdot', 'designer', 'remark'):
                # test[key] 为id等值,d[key]为内容值
                testcase[key] = d[key]
            # 添加steps字段,并设置为list
            testcase['steps'] = []
            # 取出的是测试步骤第一步第二步
        step = {}
        # 步骤里面添加control字段
        step['control'] = ''
        # 步骤
        step['no'] = str(d['step'])
        #     去除这些对应的内容放入step里面
        for key in ('testdot', 'keyword', 'element', 'data', 'expected', 'output', 'score', 'remark'):
            # 获取用例内容字段进行拼接
            step[key] = d.get(key, '')
            # 仅作为测试结果输出时,保持原样
            # 进行的操作
        step['_keyword'] = d['keyword']
        # 对应的key取值
        step['_element'] = d['element']
        # 测试数据
        step['_data'] = d['data']
        # 预期结果
        step['_expected'] = d.get('expected', '')
        # 输出结果
        step['_output'] = ''
        # 测试结果信息
        step['_resultinfo'] = ''
        # 添加测试步骤
    testcase['steps'].append(step)

    testsuite.append(testcase)

    # 返回处理好的值
    return testsuite

接下来咱们将写好的方法调用一下试试

if __name__ == '__main__':
    # file = '../element/elements.xlsx'
    # e = Excel('r', file)
    # list_read = e.read()
    # ele = element_tojson(list_read)
    # print(ele['获取短信验证码'])
    test_case = '../testcase/testcase.xlsx'
    e_case = Excel('r', test_case)
    re = e_case.read()
    data = datatodict(re)
    testsuite = suite_format(data)
    print(testsuite)

输出结果这里不演示了太长了...

通过json格式在线校验,可以清楚的看到结构:
image
下面我们将测试数据的内容进行替换:
有的同学已经问到提交表单等信息怎么进行提交
下面可以将测试数据进行替换成咱们想要的内容:

test-case的测试数据内容,进行重组

parmars={'phone': '<b.create_phone()>', 'type': '1'}

进行处理成咱们想要的内容:

代码结构新增data.py文件和lib文件夹,lib文件下,创建b.py文件

image
image
init.py如下:
__all__=['b']

b.py:如下

import random
from pathlib import Path
"""
自定义函数,生成相对于的加密串,手机号等信息
"""
path = str(Path('config') / ('txt_final.txt'))


def create_phone():
    # 第二位数字
    second = [3, 4, 5, 7, 8][random.randint(0, 4)]

    # 第三位数字
    third = {
        3: random.randint(0, 9),
        4: [5, 7, 9][random.randint(0, 2)],
        5: [i for i in range(10) if i != 4][random.randint(0, 8)],
        7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)],
        8: random.randint(0, 9),
    }[second]

    # 最后八位数字
    suffix = random.randint(9999999, 100000000)
    phone = "1{}{}{}".format(second, third, suffix)

    writetxt(phone)
    # 拼接手机号
    return phone



# 方法可以写入token和普通常量
def writetxt(phone):
    print(phone)
    f = open(path, 'a')
    f.write(phone + '\n')
    f.close()


def gettxt():
    try:
        f = open(path, 'r')
        sourceInLines = f.readlines()  # 按行读出文件内容

        return sourceInLines[0]
    except:
        # print('null')
        pass

    f.close()
def gettoken():
    f = open(path, 'r')
    sourceInLines = f.readlines()  # 按行读出文件内容
    try:
        return sourceInLines[1]
    except:
        print('no found token')
    f.close()

data.py中增加如下方法:
import re
import time
#因为在data.py中replace函数会调用lib文件下b.py文件,所以咱们data.py中引入
from lib import *
var = []

# 这个方法是将自定义函数计算出来,eval函数可以用过字符的方法计算出结果内容,函数嵌套函数也是可以的
def replace(data):
    # 正则匹配出 data 中所有  中的变量,返回列表 不包含这些内容则返回空
    keys = re.findall(r'<(.*?)>', data)
    # 返回是个list,采用替换的方法进行数据重组
    for r in keys:
        # 第一个参数是原来的值,第二个是参数是计算出来之后得到的值
        data = data.replace('<' + r + '>', eval(r))

    return data

b.py中增加如下方法:

def create_phone():

    # 第二位数字

    second = [3, 4, 5, 7, 8][random.randint(0, 4)]

    # 第三位数字

    third = {

        3: random.randint(0, 9),

        4: [5, 7, 9][random.randint(0, 2)],

        5: [i for i in range(10) if i != 4][random.randint(0, 8)],

        7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)],

        8: random.randint(0, 9),

    }[second]

    # 最后八位数字

    suffix = random.randint(9999999, 100000000)

    phone = "1{}{}{}".format(second, third, suffix)

    # 拼接手机号

    return phone

image

接下来咱们调用试一下,直接在data.py里面调试即可,完整版代码如下:

import re
import time
from lib import *
var = []

# 这个方法是将自定义函数计算出来,eval函数可以用过字符的方法计算出结果内容,函数嵌套函数也是可以的
def replace(data):
    # 正则匹配出 data 中所有  中的变量,返回列表 不包含这些内容则返回空
    keys = re.findall(r'<(.*?)>', data)
    # 返回是个list,采用替换的方法进行数据重组
    for r in keys:
        # 第一个参数是原来的值,第二个是参数是计算出来之后得到的值
        data = data.replace('<' + r + '>', eval(r))

    return data

if __name__=='__main__':
    parmars = "{'phone': '<b.create_phone()>', 'type': '1'}"
    print(replace(parmars))

输出结果如下:


image
接口自动化第五章,开始继续学习吧~

源码下载地址复制地址打开,不然会没有权限:https://gitee.com/zhangmeng1314/seautotet-public.git
感谢您的阅读,本人是希望能帮助到想进步学习的同学,大佬勿喷,我会一直维护此项目争取做的更好,我也是一个小白,希望和大家一起成长,第一次写博客文章,大家有意见感觉写的不好不清楚,评论区留言都可以的哦,我会用最简单的方式去解答您的问题,谢谢
qq群:234922431

相关文章

网友评论

    本文标题:python接口自动化测试实战(第四章)

    本文链接:https://www.haomeiwen.com/subject/oayxhctx.html