python接口自动化测试

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

2019-07-02  本文已影响14人  6780441d2bcc

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

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

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

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

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

文件下载地址可以加qq群进行获取,也可以通过下面的开源项目地址,把文件提取出来

在上一篇文章内,咱们也将把表格测试数据,转换成自己想要的内容,给做到了

已经跟着做到这一步的同学,是不是感觉略有小成呢?

数据转换的工作咱们已经做的差不多了

接下来,咱们开始封装requests

import requests? 引用包,没有安装的同学可以使用 pip install??requests 进行安装,工具内也可以直接安装
在control包下增加log.py和httpcaps.py文件
image
咱们在utils.py下增加一个函数,用来创建文件工具函数
# 判断当前目录是否存在
def mkdir(p):
    path = Path(p)
    # 如果文件不存在 则创建
    if not path.is_dir():
        path.mkdir()

log.py代码如下:

import logging
import datetime
from pathlib import Path
import sys
from control.utils import mkdir

# 获得当前的时间
def today():
    now = datetime.datetime.now()
    return now.strftime('%Y%m%d')


# 获取logger实例,如果参数为空则返回root logger
logger = logging.getLogger("seautotest")

# 指定logger输出格式
formatter = logging.Formatter(
    '%(asctime)s [%(levelname)s] %(filename)s line:%(lineno)d: %(message)s')
# 创建log文件夹
mkdir('log')
# 文件日志
log_file = str(Path('log') / '{}.log'.format(today()))
file_handler=logging.FileHandler(log_file, mode='a', encoding='utf-8', delay=False)
# file_handler = logging.FileHandler(filename=log_file, encoding="utf-8")
file_handler.setFormatter(formatter)  # 可以通过setFormatter指定输出格式

# 控制台日志
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter  # 也可以直接给formatter赋值

# 为logger添加的日志处理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# 指定日志的最低输出级别,默认为WARN级别
# DEBUG,INFO,WARNING,ERROR,CRITICAL
logger.setLevel(logging.INFO)

开始封装httpcaps.py
import requests
from control.log import logger
from control.utils import iscompare_json, writetoken


def htpp_requests(step, junit, sort='get'):
    data = step['data'].replace("\n", "")
    http_type, parmars = datatating(data)
    # 记录为何不通过
    content = ''
    # 记录是否通过
    list_record = []
    if http_type == 'headers':
        httrequst = getattr(requests, sort)(step['element'], headers=eval(parmars))
    else:
        httrequst = getattr(requests, sort)(step['element'], eval(parmars))

    status = httrequst.status_code
    # 1.接口不等于200,不进行验证和断言
    if status != 200:
        logger.error('接口出错了%s' % status)
        return
        # 获得接口的返回值
    response = httrequst.json()
    expected = step['expected']
    testdot = step['testdot']
    # 如果是登录的接口,将登录的token写入文本

    if testdot in ('登录接口验证'):
        logger.info(response['data']['token'])
        writetoken(response['data']['token'])

    # 2.验证断言内容 断言只有在预期结果写了#('xxx','xxx')这种才会进行
    if '#' in step['expected']:
        # 1预期结果 2需要断言的内容 是元祖类型 ,返回:断言通过 返回'' ,反之返回不通过的字段
        is_as_pass = asset_content(expected, response)
        # 通过
        if is_as_pass == '':
            content += '断言通过'
            pass
        # 不通过
        else:
            list_record.append(1)
            content += '断言不通过%s' % is_as_pass
    # 3.验证返回值json格式
    result = iscompare_json(eval(expected), response)
    if result == 'Pass':
        content += '对比格式通过'
    else:
        list_record.append(1)
        content += 'json对比格式不通过'

    if len(list_record) >= 1:
        step['score'] = 'Fail'
        junit.failure('testdot:' + step['testdot'] + '-' + 'step:' + step['no'] + '-' + 'element:' + step[
            'element'] + '-' + ', %s' % content)

    else:
        step['score'] = 'Pass'
    step['_resultinfo'] = content
    step['output'] = response
    logger.info(step['element'])
    logger.info(response)
    return step


# 处理json类型和参数
def datatating(data):
    if data.strip():
        http_info = data.split('=', 1)
        # 获得类型
        http_type = http_info[0]
        # 获得请求的参数
        parmars = http_info[1]
    else:
        # 获得类型
        http_type = 'parmars'
        # 获得请求的参数
        parmars = "{' ': ' '}"
    return http_type, parmars


# 如果有#号将进行处理,没有不处理
def affirm(expected):
    # 返回的是list
    ex_list = expected.split('#')
    # 0代表是预期结果,1是代表是断言的内容
    # eval处理是元祖类型
    return ex_list[0], eval(ex_list[1])


def asset_content(expected, response):
    # 处理预期结果的内容,切割出来断言
    # 1.是预期结果 2.是需要断言的内容 元祖类型
    expected, astent = affirm(expected)
    fail_tent = ''
    for t in astent:
        if t not in str(response):
            fail_tent += '接口没有此值:%s,' % t
    return fail_tent

封装完成后,咱们调用试一下看看如何,因为公司的接口不方便开放,所以只能自己动手写一个了,目录下增加这个py文件

image httptunn.py代码如下
import flask, json

server = flask.Flask(__name__)  # __name__代表当前的python文件。把当前的python文件当做一个服务启动


@server.route('/index', methods=['get', 'post'])  # 第一个参数就是路径,第二个参数支持的请求方式,不写的话默认是get
def index():
    res = {'msg': '这是我开发的第一个接口', 'msg_code': 0}
    return json.dumps(res, ensure_ascii=False)

server.run(port=8888, debug=True, host='127.0.0.1')

先运行httptunn.py文件

开始调试httpcaps.py代码增加如下

if __name__ == '__main__':
    step = {'no': '1', 'testdot': '获取验证码功能验证', 'keyword': 'API', 'page': '',
            'element': 'http://127.0.0.1:8888/index',

            'data': "parmars={'phone': '17547817934', 'type': '1'}",

            'expected': "{'msg': '这是我开发的第一个接口', 'msg_code': 0}", 'output': {'msg': '这是我开发的第一个接口', 'msg_code': 0},

            'score': 'Pass', 'remark': '', '_keyword': 'API', '_element': '获取短信验证码',

            '_expected': "{'msg': '这是我开发的第一个接口', 'msg_code': 0}", '_output': ''}

    print(htpp_requests(step, 'get'))


运行截图如下:

image

小伙伴如果你运行失败了,出现了错误,将下一章节进行解决你现在的问题哦

遇到报错不要慌,总是会有解决办法的~

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

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

上一篇下一篇

猜你喜欢

热点阅读