美文网首页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