前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python接口自动化(初版)

Python接口自动化(初版)

原创
作者头像
Meccer
修改于 2022-03-12 11:40:54
修改于 2022-03-12 11:40:54
89100
代码可运行
举报
文章被收录于专栏:测试学习之路测试学习之路
运行总次数:0
代码可运行

框架设计

pytest+requests+allure


目录结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
utils                  ——工具类
data                   ——用例文件存放目录
conf                   ——配置类
scripts                ——测试用例驱动
TestCase               ——测试用例
start.py               ——执行脚本
pytest.ini             ——pytest配置文件

添加配置文件

配置文件总是项目中必不可少的部分!

将固定不变的信息集中在固定的文件中

settings.py

项目中都应该有一个文件对整体的配置进行管理,我也在这个python项目中设置了此文件。

在项目conf目录创建settings.py文件,所有的配置信息写在这个文件里面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
import datetime

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 关于Excel配置表中测试用例默认配置
FILE_NAME = "本地接口测试用例.xlsx"
FILES_PATH = os.path.join(BASE_DIR, "data", FILE_NAME)


#----初始化template cookies dict

COOKIES_DICT = {}

# -----allure报告相关

ALLURE_COMMAND = "allure generate {from_json_path} -o {save_to_path} --clean".format(
    from_json_path=os.path.join(BASE_DIR, "report", "json_result"),
    save_to_path=os.path.join(BASE_DIR, "report", "allure_result")
)

# ---日志相关
# 日志级别
LOG_LEVEL = "debug"
LOG_STREAM_LEVEL = "debug"  # 屏幕输出流
LOG_FILE_LEVEL = "info"  # 文件输出流

# 日志文件命名
LOG_FILE_NAME = os.path.join(BASE_DIR, "logs", datetime.datetime.now().strftime("%Y-%m-%d") + ".log")



# 邮件相关
# 第三方SMTP服务
MAIL_HOST = "smtp.qq.com"  # 设置服务器
# 邮件相关
# 第三方SMTP服务
MAIL_HOST = "smtp.qq.com"  # 设置服务器
MAIL_USER = "test@qq.com"  # 用户名
MAIL_TOKEN = "hhhhhhhhm"  # 授权码
# 设置收件人和发件人
SENDER = "test@qq.com"
RECEIVERS = ["test@qq.com", "test@163.com"]  # 接收邮箱可以设置你的qq或者其它邮箱

# 邮件主题
THEME = "接口测试报告"
# 正文内容
SEND_CONTENT = "详情看附件"
# 附件的file name
SEND_FILE_NAME = "allure_report.zip"

excel工具类

用来读取Excel中的用例数据。

我们在utils目录中新建一个文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import xlrd
from conf import settings


class ExcelOperate:
    def __init__(self, file_path, sheet_by_index=0):
        self.book = xlrd.open_workbook(file_path)
        self.sheet = self.book.sheet_by_index(sheet_by_index)

    def get_excel(self):
        """
        获取Excel表中接口测试用例
        :return: 构造好的测试用例数据,格式:[{'case_num': '', 'title ': '', 'url': '',}]
        dict()
        """
        title = self.sheet.row_values(0)    #获取excel中的标题栏,
        print(type(title))
        case_suite=[dict(zip(title, self.sheet.row_values(row))) for row in range(1, self.sheet.nrows)]   #将标题和遍历取出的值一一对应,形成多个字典,放在用例列表中。
        return case_suite

用python的xlrd 模块对Excel文件进行了读取。再按照制定格式输出用例。

核心驱动类

用于读取用例中所有和请求相关的数据,并且处理依赖和写入cookies

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

"""
处理请求
ExcelHandler模块中读取测试用例,对用例字段进去处理,然后发送请求获取响应结果
"""
import json
import re

import requests

from conf import settings
from jsonpath_rw import parse  # 第三方插件,需要pip install ,作用json数据提取
# jsonpath_rw官网:https://github.com/kennknowles/python-jsonpath-rw


from utils.ExcelHandler import ExcelOperate

from utils.LogHandler import logger


class RequestsOperate:

    def __init__(self, current_case, all_excel_data_list):
        """
        :param current_case: 用例列表中的一条条单独测试用例(字典形式),用来给request构造发送请求
        :param all_excel_data_list: 全部用例列表
        """
        self.current_case = current_case
        self.all_excel_data_list = all_excel_data_list

    def get_response_msg(self):
        """
        发送请求并且获取结果
        :return:
        """
        return self._send_msg()

    def _send_msg(self):
        """发请求"""
        logger().info("正在向{0}发送请求,{1}".format(self.current_case.get("url"), self.current_case))
        response = requests.request(
            method=self.current_case.get("method"),
            url=self.current_case.get("url"),
            data=self._check_request_data(),
            json=self._check_request_json(),
            params=self._check_request_params(),
            cookies=self._check_request_cookies(),
            headers=self._check_request_headers(),
        )
        self._write_cookies(response)
        return json.loads(self.current_case.get("except")), response.json()

    def _check_request_headers(self):
        """
        校验请求头,做携带cookies 和 数据依赖的问题
        {
            'user':'${}$',
            'testfan-id':'ca447223-876e-46ba-9e45-f775335dfcbe'
        }
        :return:
        """
        headers = self.current_case.get("headers")
        if headers:
            return self._operate_re_msg(headers)
        else:
            return {}

    def _write_cookies(self, response):
        """ 监测响应结果中是否含有cookies,有就保存起来"""
        for item in self.all_excel_data_list:
            if item.get("case_num") == self.current_case.get("case_num"):
                item["temporary_response_cookies"] = response.cookies.get_dict()
                if response.headers.get("Content-Type").lower() == "application/json":
                    item["temporary_response_json"] = response.json()
                # 如果去请求头中取数据都存一份
                item["temporary_request_headers"] = self.current_case.get("headers")
                item["temporary_request_data"] = self.current_case.get("data")
                item["temporary_request_json"] = self.current_case.get("json")
                item["temporary_request_params"] = self.current_case.get("params")
                # 所有去响应头中取值的都存一份
                item["temporary_response_headers"] = response.headers
                print(response.cookies.get_dict())



    def _check_request_data(self):
        """处理请求的data参数,检查是否有依赖"""
        data = self.current_case.get("data")
        if data:
            return self._operate_re_msg(data)
        else:
            return {}

    def _check_request_json(self):
        """处理请求的data参数,检查是否有依赖"""
        data = self.current_case.get("json")
        if data:
            return json.loads(data)
        else:
            return {}

    def _check_request_params(self):
        """处理get请求的参数,检查是否有依赖"""
        params = self.current_case.get("params")
        if params:
            return json.loads(params)
        else:
            return {}

    def _check_request_cookies(self):
        """处理请求中的cookies"""
        cookies_case_num = self.current_case.get("cookies")
        if cookies_case_num:  # 当前接口需要cookies
            for item in self.all_excel_data_list:
                if item.get("case_num") == cookies_case_num:
                    return item.get("temporary_response_cookies", {})
        else:
            return {}

    def _operate_re_msg(self, parameter):
        """
        正则校验,数据依赖的字段
        :param parameter: 各种参数,如:data,header,params
        :return:
        """
        # 使用re 将提取依赖字段 {"testfan-token":"${neeo_001>response_json>data}$"}
        if isinstance(parameter, dict):
            json.dumps(parameter)
        pattern = re.compile("\${(.*?)}\$")  # 定义规则
        rule_list = pattern.findall(parameter)  # 按照规则匹配
        if rule_list:  # 该参数有数据依赖要处理
            for rule in rule_list:
                case_num, params, json_path = rule.split(">")
                for line in self.all_excel_data_list:
                    print(line)
                    if line.get("case_num") == case_num:
                        temp_data = line.get("temporary_{0}".format(params))
                        if isinstance(temp_data, str):
                            temp_data = json.loads(temp_data)
                        match_list = parse(json_path).find(temp_data)
                        print(match_list)
                        if match_list:
                            match_data = [v.value for v in match_list][0]
                        # 将提取出来的值替换到原来规则,
                parameter = re.sub(pattern=pattern, repl=match_data, string=parameter, count=1)
            return json.loads(parameter)
        else:
            if isinstance(parameter, str):
                parameter = json.loads(parameter)
            return parameter


记录操作日志

日志,大家应该都很熟悉这个名词,就是记录代码中的动作。

utils目录中新建loggerHandler.py文件。

这个文件就是我们用来在自动化测试过程中记录一些操作步骤的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging

from conf import settings


class LoggerHandler:
    """ 日志操作 """
    _logger_level = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warning': logging.WARNING,
        'error': logging.ERROR,
        'critical': logging.CRITICAL
    }

    def __init__(self, log_name, file_name, logger_level, stream_level='info', file_level='warning'):
        self.log_name = log_name
        self.file_name = file_name
        self.logger_level = self._logger_level.get(logger_level, 'debug')
        self.stream_level = self._logger_level.get(stream_level, 'info')
        self.file_level = self._logger_level.get(file_level, 'warning')
        # 创建日志对象
        self.logger = logging.getLogger(self.log_name)
        # 设置日志级别
        self.logger.setLevel(self.logger_level)

        if not self.logger.handlers:
            # 设置日志输出流
            f_stream = logging.StreamHandler()
            f_file = logging.FileHandler(self.file_name)
            # 设置输出流级别
            f_stream.setLevel(self.stream_level)
            f_file.setLevel(self.file_level)
            # 设置日志输出格式
            formatter = logging.Formatter(
                "%(asctime)s %(name)s %(levelname)s %(message)s"
            )
            f_stream.setFormatter(formatter)
            f_file.setFormatter(formatter)
            self.logger.addHandler(f_stream)
            self.logger.addHandler(f_file)
        # print(1111111, self.logger.handlers)

    @property
    def get_logger(self):
        return self.logger


def logger(log_name='接口测试'):
    return LoggerHandler(
        log_name=log_name,
        logger_level=settings.LOG_LEVEL,
        file_name=settings.LOG_FILE_NAME,
        stream_level=settings.LOG_STREAM_LEVEL,
        file_level=settings.LOG_FILE_LEVEL,
    ).get_logger


if __name__ == '__main__':
    logger().debug('aaaa')
    logger().info('aaaa')
    logger().warning('aaaa')
    logger().error('aaaa')

在终端中运行该文件,就看到命令行打印出了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2022-03-12 18:49:59,371 接口测试 DEBUG aaaa
2022-03-12 18:49:59,371 接口测试 INFO aaaa
2022-03-12 18:49:59,371 接口测试 WARNING aaaa
2022-03-12 18:49:59,371 接口测试 ERROR aaaa

然后在项目logs目录下生成了当日的日志文件


allure报告类

用来定制allure的输出,处理打包发送报告邮件的需求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
allure报告相关
"""
import os

import zipfile  # 打包
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

import subprocess  # 执行cmd命令
from conf import settings
from utils.LogHandler import logger


class AllureOperate:

    def get_allure_report(self):
        """生成报告"""
        # os.system(ALLURE_COMMAND) 运行cmd命令,但是不安全
        logger().info("正在生成测试报告......")
        subprocess.call(settings.ALLURE_COMMAND, shell=True)
        logger().info("生成测试报告成功......")

    def check_zip(self):
        """打包"""
        try:
            logger().info("正在打包测试报告......")
            BASE_DIR = os.path.join(settings.BASE_DIR, "report")
            start_zip_dir = os.path.join(BASE_DIR, "allure_result")  # 要压缩文件夹的根路径
            zip_file_name = 'allure_report.zip'  # 为压缩后的文件起个名字
            zip_file_path = os.path.join(BASE_DIR, zip_file_name)
            f = zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED)
            for dir_path, dir_name, file_names in os.walk(start_zip_dir):
                # 要是不replace,就从根目录开始复制
                file_path = dir_path.replace(start_zip_dir, '')
                # 实现当前文件夹以及包含的所有文件
                file_path = file_path and file_path + os.sep or ''
                for file_name in file_names:
                    f.write(os.path.join(dir_path, file_name), file_path + file_name)
            f.close()
            logger().info("打包测试报告完成......")
        except Exception as er:
            logger().error("打包测试报告失败:{0}".format(er))

    def send_mail(self):
        """发送邮件"""
        # 第三方SMTP服务
        mail_host = settings.MAIL_HOST  # 设置服务器
        mail_user = settings.MAIL_USER  # 用户名
        mail_pass = settings.MAIL_TOKEN  # 口令
        # 设置收件人和发件人
        sender = settings.SENDER
        receivers = settings.RECEIVERS  # 接收邮箱可以设置你的qq或者其它邮箱
        # 创建一个带附件的实例对象
        message = MIMEMultipart()
        # 邮箱主题、收件人、发件人
        subject = settings.THEME  # 邮件主题
        message["Subject"] = Header(subject, "utf-8")
        message["From"] = Header("{0}".format(sender), "utf-8")
        message["To"] = Header("{0}".format(";".join(receivers)), "utf-8")
        # 邮件正文内容
        send_content = settings.SEND_CONTENT
        content_obj = MIMEText(send_content, "plain", "utf-8")  # 第一个参数为邮件内容
        message.attach(content_obj)
        # 构造附件
        att = MIMEText(_text=self._get_zip_file(), _subtype="base64", _charset="utf-8")
        att["Content-Type"] = "application/octet-stream"
        att["Content-Disposition"] = 'attachment;filename="{}"'.format(settings.SEND_FILE_NAME)  # 邮件附件中显示什么名字
        message.attach(att)
        try:
            smtp_obj = smtplib.SMTP()
            smtp_obj.connect(mail_host, 25)  # 25SMTP端口号
            smtp_obj.login(mail_user, mail_pass)
            smtp_obj.send_message(sender, receivers, message.as_string())
            smtp_obj.quit()
            logger().info("邮件发送成功")
            print("邮箱发送成功")
        except smtplib.SMTPException as er:
            logger().error("email end error:{0}".format(er))

    def _get_zip_file(self):
        """获取zip文件内容"""
        with open(file=os.path.join(settings.BASE_DIR, "report", "allure_report.zip"), mode="rb") as f:
            return f.read()


if __name__ == '__main__':
    AllureOperate().get_allure_report()


执行用例

以上我们已经编写完成了整个框架和测试用例。

我们新增一个模板用例方法,并利用@pytest.mark.parametrize来进行参数化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-


import pytest
import allure
from deepdiff import DeepDiff

from utils.AssertResult import AssertUtil
from utils.ExcelHandler import ExcelOperate
from utils.RequestsHandler import RequestsOperate
from utils.LogHandler import logger
from conf import settings

excel_data_list = ExcelOperate(settings.FILES_PATH, 3).get_excel()


class TestCase:
    @pytest.mark.parametrize("item", excel_data_list)
    def test_case(self, item):
        logger().info("正在进行断言...")
        except_data, result = RequestsOperate(current_case=item, all_excel_data_list=excel_data_list).get_response_msg()
        allure.dynamic.title(item.get("title"))
        allure.dynamic.description(
            "<b style='color:red'>请求的url:</b>{0}<hr />"
            "<b style='color:red'>预期值:</b>{1}<hr />"
            "<b style='color:red'>实际执行结果:</b>{2}<hr />".format(item["url"], item["except"], result)
        )

        assert AssertUtil().assert_in_body(except_data,result)
        logger().info("完成断言,{0}-{1}".format(except_data, result))

接下来就是执行命令脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-


import os

import shutil
import pytest

from conf.settings import BASE_DIR
from utils.AllureHandler import AllureOperate

if __name__ == '__main__':
    dir_path = os.path.join(BASE_DIR, "report", "json_result")
    if os.path.isdir(dir_path):
        # 执行用例前,首先清除上一次测试生成的json文件
        shutil.rmtree(dir_path)
        pytest.main()  # 执行测试用例
        # 生成allure测试报告
        allure_obj = AllureOperate()
        allure_obj.get_allure_report()
        # 压缩文件
        allure_obj.check_zip()
        # 执行完毕后发送邮件
        # allure_obj.send_mail()z
    else:
        os.makedirs(dir_path)

项目的report目录中生成了一个report.html文件。

这就是生成的测试报告文件。

执行结果:


用例:

我们采用的是Excel的驱动,用例的字段为case_num,title,url,method,params,data,json,cookies,headers,except

case_num代表用例编号,一定要唯一,作为接口依赖的用例定位。

title表明用例名称,在报告中会对应体现

url为请求地址,暂时需要写入host,后续会优化成只需地址,host由配置文件控制

method为请求方式,如果为get,有参数就在params填写。如果为post,有参数就在data或者json处填写

cookies处填写用例id,对应的用例就是获取cookies的来源

headers可以自己写入,也可以通过格式关联

except表示预期结果,只要返回值包含,就会认为用例保存成功,注意,布尔True or False需要小写

然后我们讲讲用例依赖,基本上只有headers,和参数会用到依赖。

我们依赖固定的写入格式为:

{"userName":"${neeo_002>request_params>userName}$","X-Auth-Token":"${neeo_001>response_headers>X-Auth-Token}$"}

如上,指的就是从用例1中取请求参数中的userName,以及用例3中的返回头中的X-Auth-Token

运行

安装依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install -r requirements.txt

执行主文件

  • 在项目根目录执行start.py文件即可运行项目

集成jekins

之前文章也讲过,一样的路子来就好了

代码地址:

https://gitee.com/czhtest/p_autotest_api.git

待优化内容:

测试环境切换

数据库断言

多种预期结果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python+requests接口自动化
文章来源:https://my.oschina.net/u/3041656/blog/820023
py3study
2020/01/15
8230
python+requests接口自动化
测开新手学自动化:分享几点构建自动化测试框架经验
传统软件测试行业是以手工测试为主,也就是所谓的点点点,加上国内软件公司不注重测试,受制于大环境影响等也就给了大众一种测试人员虽然身处互联网行业,却是毫无技术可言的工种。
测试开发技术
2021/03/25
8650
月薪40K+银行测试经理,自动化测试实践经验分享
大家好,我是Arthur,拥有超过10年以上的银行测试经验,目前在一家互联网创业公司担任测试经理。在我们那个年代,基本上都是不会写代码的做测试工作,而且基本都是纯手工;最近几年,测试开发开始流行,互联网行业越来越重视测试人员的综合能力,使得我们这些老测试也必须转型,才能跟上时代的步伐,因此我也报名了狂师老师的 全栈测开训练营,之前我也在一些网络培训网站上学习一些新的知识点,但我感觉狂师的课程无论是范围、广度、深度比大多数培训机构强很多,也正是工作当中经常能用到的内容,非常值得大家学习。那么,今天我将结合训练营课程的讲解,分享一些关于接口自动化测试学习实践总结,并且这些我已经应用到了实际工作上,希望对大家也有所帮助。
测试开发技术
2021/08/12
7830
ui自动化Python版本
在项目config目录创建conf.py文件,所有的目录配置信息写在这个文件里面。
Meccer
2022/02/09
1.6K1
python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(优化版)
python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告
虫无涯
2023/01/31
7260
Python+Pytest+Allure+Json 最全Api自动化框架之邮件发送功能
Python+Pytest+Allure+Json 最全Api自动化框架 分享后,受到许多小伙伴的关注,最近一直在完善这个 API 自动化框架的功能,准备在框架成熟后分享给更多需要的小伙伴们。
Wu_Candy
2022/07/04
1K0
Python+Pytest+Allure+Json 最全Api自动化框架之邮件发送功能
开发指南,自研关键字驱动框架
框架内核是pytest,为框架提供了用例识别、组织运行、IDE集成等基础能力,以及pytest框架稳定性和强劲扩展能力。同时集成了requests等三方库,支持接口测试等。并实现了项目脚手架。
dongfanger
2023/11/11
2820
开发指南,自研关键字驱动框架
Pytest+Allure+Jenkins接口自动化项目实战(一)
经过一周多时间,基于python+pytest+excel+allure框架的接口自动化测试初版已基本实现,包括基本配置读取、用例读取、用例执行、sql读取执行、前置数据准备、后置数据清理以及测试报告生成等,环境独立运行、项目独立运行、用例独立运行、jenkins集成、邮件发送暂未实现,再后期版本会再次推出,现在把整个框架设计思路和想法分享给大家来参考和借鉴。希望大家也能提供更好的思路和方法帮助我进行优化改进。整个过程中遇到的问题清参考Python自动化测试疑问及解决方案(一)Python自动化测试|如何解决前置模块及数据依赖(二)
王大力测试进阶之路
2020/02/19
3.3K0
Pytest+Allure+Jenkins接口自动化项目实战(一)
接口自动化框架pyface详细介绍
本框架系本人结合一些实践经验和开源框架设计思想,在家基于兴趣爱好独立完成的代码开发。
dongfanger
2020/09/23
6860
接口自动化框架pyface详细介绍
pytestx重新定义接口框架设计
启动平台前后端服务后,从页面下载脚手架,平台会拉取开源项目tep-project最新代码,打成压缩包,生成下载文件,弹窗下载。
dongfanger
2023/08/26
1970
pytestx重新定义接口框架设计
【python自动化】七月PytestAutoApi开源框架学习笔记(二)
「注:请先阅读作者的README.md文档https://gitee.com/yu_xiao_qi/pytest-auto-api2/blob/master/README.md」
梦无矶小仔
2023/09/08
8170
【python自动化】七月PytestAutoApi开源框架学习笔记(二)
搭一个简单的接口测试框架
可以理解为工具的集合,把日常所需要实现功能的代码,模块进行封装起来结合其他的工具进行测试。得出结论报告。
赵云龙龙
2020/02/24
4790
tep1.0.0正式版发布且将不再维护
根据pypistats统计,tep在pypi的下载量达到了1w,对于纯个人研发的一款测试小工具来说,已经算不错了,要知道HttpRunner也才6w啊。tep可以说是我在接口自动化测试这个领域的技术沉淀,凝结了个人经验和所见所闻的精华之作,它基于Pytest,借鉴了JMeter、RobotFramework、HttpRunner、京东接口测试平台等各种优秀自动化设计思想,小小工具,蕴含大大能量。相信它也已经影响了不少人,让初学者知道Pytest该怎么玩,让入门者知道Pytest工程化是什么样子,让熟练者可以参考对照优化代码。然而当我把tep优化到1.0.0正式版以后,为什么却选择停止维护呢? 一、 小工具的表达力不够。当我试图用tep来描绘更多自动化设计思想时,瞬间感觉到了一丝苍白,我不一定讲的清楚,别人也不一定能够理解,用代码来交流始终存在着一定门槛。二、每个人对Pytest使用方式不同 。Pytest本身是测试框架,很多人用它来做二次开发,设计”测试框架“,有好的,有差的,不管白猫黑猫能逮到耗子就是好猫,不管设计的如何,能实现接口自动化项目落地就是好框架。tep要想在这个方向上,建立一套标准,几乎是不可能的。这不并意味我会就此放弃Pytest,相反,我将致力于Pytest平台化,从做小工具改为做测试平台。 测试平台具有非常直观的强大表现力,并且具有工程化的规范性,一看就懂,一用就会,一点就通。测试平台也是能更好的做技术沉淀的,如果说写小工具是玩玩而已,那么开发测试平台就是认真搞技术了。比如,如何提高Pytest并行执行的效率,我相信测试平台会比小工具,更能给出一个比较完整的解决方案。下次使用Pytest,也许就不是从tep startproject开始了,而是docker run。
dongfanger
2022/12/31
8530
tep1.0.0正式版发布且将不再维护
基于Pytest+Requests+Allure实现接口自动化测试
1、工具层 将get、post等常用行为进行二次封装。 代码(api_key.py)如下:
测试开发技术
2023/08/21
5920
基于Pytest+Requests+Allure实现接口自动化测试
自动化-Httprunner3源码阅读-Ongoing
我现在的公司目前使用的自动化测试框架为Httprunner3 , 框架本身完备度较高, 但是在实际使用过程中发现一个bug:
打铁读书郎
2024/04/11
980
当Pytest遇上MVC分层设计自动化用例就该这么写
数据写在代码里,追求快速编写用例,是我设计tep的一个特点,这在个人编写时是一种非常良好的体验。但相比于HttpRunner、JMeter等来说,总觉得还差点意思。思考良久,总结为三个字:工程化。工程化是我近一年在学习Java并参与了2个测试平台模块开发,和写了几个小工具后,感受到的一种编程思想。而其中最明显的就是Spring的MVC分层设计。为了让tep更工程化,后续版本将以MVC模块编写用例为准,同时会兼容之前的脚本式快速编写。
dongfanger
2022/12/28
3740
当Pytest遇上MVC分层设计自动化用例就该这么写
接口自动化项目落地之HTTPBin网站
找个开源网站或开源项目,用tep实现整套pytest接口自动化项目落地,归档到电子书,作为tep完整教程的项目篇一部分。自从tep完整教程发布以后,tep被越来越多小伙伴了解。教程只是纯理论,是骡子是马,拉出来遛遛才知道。做接口自动化项目落地,一方面是为了让自己脑海中的构想实实在在的呈现出来,现实和理想存在多少差距,不断尝试去弥补和修缮;另一方面也是方便读者朋友们学习使用,借助实际项目来练习,才能在赛道中弯道超车。
dongfanger
2022/05/09
6290
接口自动化项目落地之HTTPBin网站
怎么基于Pytest+Requests+Allure实现接口自动化测试?
1、工具层 将get、post等常用行为进行二次封装。 代码(api_key.py)如下:
科技新语
2024/06/12
1800
怎么基于Pytest+Requests+Allure实现接口自动化测试?
Selenium 自动化综合实践
无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。
清风穆云
2021/08/09
3900
python+requests+excel接口自动化数据驱动
一、前言 1.环境准备: - python3.6 - requests - xlrd - openpyxl - HTMLTestRunner_api 2.目前实现的功能: - 封装requests请求方法 - 在excel填写接口请求参数 - 运行完后,重新生成一个excel报告,结果写入excel - 用unittest+ddt数据驱动模式执行 - HTMLTestRunner生成可视化的html报告 - 对于没有关联的单个接口请求是可以批量执行的,需要登录的话写到setUpclass里的session里
上海-悠悠
2018/04/08
6.8K0
python+requests+excel接口自动化数据驱动
相关推荐
python+requests接口自动化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档