接口自动化测试:Python+Pytest+Requests+Allure

这篇具有很好参考价值的文章主要介绍了接口自动化测试:Python+Pytest+Requests+Allure。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python+pytest接口自动化,经验分享,软件测试,自动化测试,python,pytest,自动化测试,测试工程师,软件测试

本项目实现了对Daily Cost的接口测试:

  • Python+Requests 发送和处理HTTP协议的请求接口
  • Pytest 作为测试执行器
  • YAML 管理测试数据
  • Allure 来生成测试报告。

本项目是参考了pytestDemo做了自己的实现。

1. 项目结构及安装部署

项目结构

  • api: 接口封装层,如封装HTTP接口为Python接口
  • commom: 从文件中读取数据等各种工具类
  • core: requests 请求方法封装、关键字返回结果类
  • config: 环境、数据库连接等配置
  • data: 测试数据文件管理
  • operation: 关键字封装层,如把多个Python接口封装为关键字
  • pytest.ini: pytest 配置文件
  • requirements.txt: 相关依赖包文件
  • testcases: 测试用例
  • api_test: 单接口测试
  • scenario_test: 场景/业务流程测试

安装部署

  • 部署Daily Cost应用:教程
  • 下载本测试项目源代码 ,通过pip安装相应依赖pip3 install -r requirements.txt,根据实际情况修改setting.ini中的相应内容
  • 输入pytest运行测试
  • 如果想要使用Allure查看生成的测试报告,需要先安装Allure服务:brew install allure

2. 环境配置

  • 在config-setting.ini文件中定义api_root_url
  • 在common-read_data.py中实现load_ini()方法读取配置文件
  • 在需要使用api_root_url的地方调用load_ini(data_file_path),读取对应的value

3. 封装HTTP请求

  1. 封装requests请求方法:将requests中发送GET、POST、PUT、DELETE等方法封装到RestClient类中
  2. 定义被测API接口Request:在api文件夹中根据domain创建对应请求的集合类,如class User(RestClient),并定义各接口信息,如登录接口:
def login(self, **kwargs):         
    return self.post("/login", **kwargs)

4. 关键字封装

关键字应当是具有一定业务意义的。在封装关键字的时候,可以只封装一个接口,也可以调用多个接口来完成。

比如我们要测试记一笔,在接口调用成功后接口只会返回账单的ID,还需要调用查询账单明细接口,来帮助判断每个字段是否与输入时的一致,那么我们可以这样来进行测试:

  • 首先,将记一笔-查看明细的操作封装为一个关键字,在这个关键字中依次调用记一笔和查询账单明细结果,并可以自定义关键字的返回结果
  • 接着,在编写测试用例的时候,直接调用关键字来进行测试,这时就可以关键字的返回结果,断言的时候,也可以直接对关键字返回结果进行断言

再比如查询月度账单统计结果,一个接口就可以独立完成业务查询操作,我们在关键字中只调用这一个接口即可。

回到本项目,具体的代码逻辑如下:

  1. 在operation文件夹中,还是按照domain分文件来组织各关键字
  2. 在core中定义关键字返回的数据结构类 ResultBase
  3. 定义关键字,在调用对应API请求时需要明确传递接口请求参数,并定义返回结果
def bill_monthly_stat(date, token):
   header = {
       "Content-Type": "application/json",
       "Authorization": "Bearer " + token
   }
   param = {"date": date}
   res = bill_details.get_bill_monthly(params=param, headers=header)

   return ResultBase(res)

本项目中的关键字中都只封装了一个请求。

5. 单接口测试

记一笔接口为例。

  • 定义接口及关键字
// api -> bill.py : 定义接口
def create_new_bill(self, **kwargs):
    return self.post("/bill", **kwargs)

// operation -> bill.py : 定义关键字
def bill_create(category_id, type, amount, note, date, token):
    payload = {
        "categoryId": category_id,
        "type": type,
        "amount": amount,
        "note": note,
        "date": date
    }
    header = {
        "Content-Type": "application/json",
        "Authorization": "Bearer " + token
    }
    res = bill.create_new_bill(json=payload, headers=header)

    return ResultBase(res)
  • 接口测试类
// testcases -> api_test -> bill -> test_bill_create.py
class TestBillCreate():
    @mark.smoke
    @mark.parametrize('category_id, type, amount, note, date, status_code, message', 
                    [
        ("5442d3b8-9d4a-4654-bf0b-d2249efef190", "EXPENSE", 100.01, "note1111test", "2021-12-01", 200, "操作成功"),
        ("66c22fad-be9d-481d-a445-c57d266bf938", "INCOME", 1000.01, "note1111test", "2021-12-01", 200, "操作成功")
        ])
    def test_bill_create_success(self, category_id, type, amount, note, date, status_code, message, token):
        result = bill_create(category_id, type, amount, note, date, token)
        assert result.response.status_code == status_code
        assert result.message == message
        assert result.response.json()["data"]["id"]
  • @mark.smoke是使用了pytest的mark标记功能,运行时使用命令pytest -m smoke只运行标记为smoke的用例
  • @mark.parametrize是pytest的变量参数化功能,可以实现数据驱动测试,如上所示有两条参数化数据,则该用例会应用这两条数据共执行两次
  • 调用bill_create时有一个token参数,它实际上是在conftest.py文件中定义的
  • pytest中的assert使用的是python内置的断言库

6. YAML文件管理测试数据

在上面的例子中我们在使用@mark.parametrize时直接将具体的测试数据写在了用例上方。为了后期修改维护效率更高,我们通常会将测试数据和用例分离,即可以采用yaml文件来单独管理测试数据,conftest.py可以帮助数据的读取。

  • 定义yaml文件:data -> api_test_data.yml
test_bill_create_success:
  # category_id, type, amount, note, date, status_code, message
  - ["5442d3b8-9d4a-4654-bf0b-d2249efef190", "EXPENSE", 100.01, "note1111test", "2021-12-01", 200, "操作成功"]
  - ["66c22fad-be9d-481d-a445-c57d266bf938", "INCOME", 1000.01, "note1111test", "2021-12-01", 200, "操作成功"]
  • key为测试用例对应的函数名test_bill_create_success
  • -表示value是数组
  • conftest.py中读取对应的测试数据
import pytest
import os
from common.read_data import data 

BASE_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
def get_data(yaml_file_name):
    try:
        data_file_path = os.path.join(BASE_PATH, "data", yaml_file_name)
        yaml_data = data.load_yaml(data_file_path)
    except Exception as ex:
        pytest.skip(str(ex))
    else:
        return yaml_data

api_data = get_data("api_test_data.yml")
  • 参数化时从yaml文件中读取数据
@mark.parametrize('category_id, type, amount, note, date, status_code, message', 
                    api_data["test_bill_create_success"])

7. API场景测试

在做API测试时,除了单个接口输入输出的校验,由多个接口串联成的业务场景的测试也是必不可少的。

简单的,我们以登录后进入首页为例,接口调用为:登录 -> 查询当月账单明细列表 -> 查询当月账单统计值。

  • 定义场景测试类
// testcases -> scenario_test -> test_get_one_month_bill.py
import allure
import pytest
from operation.user import login_user
from operation.bill import one_month_bill_list_get_by_date, bill_monthly_stat

@pytest.mark.core
class TestGetOneMonthBill:

    @allure.title("01: user[yuxiaomeng] login")
    @allure.story('story_1')
    def test_user_login(self, core_env):
        result = login_user('yuxiaomeng', '20211030.y')
        assert result.status_code == 200
        assert result.data["token"]
        core_env["token"] = result.data["token"]

    @allure.title("02: get homepage info - bill details list")
    @allure.story('story_1')
    def test_get_current_month_monthly_bill_list(self, core_env):
        result = one_month_bill_list_get_by_date(core_env["date"], core_env["token"])
        assert result.status_code == 200
        assert len(result.data) == 2
        assert result.data[0]["date"] == "2021-11-11"
        assert result.data[0]["expense"] == 510.5

    @allure.title("03: get homepage info - bill monthly statistics ")
    @allure.story('story_1')
    def test_get_current_month_bill(self, core_env):
        result = bill_monthly_stat(core_env["date"], core_env["token"])
        assert result.status_code == 200
        assert result.data["expense"]
  • 其中core_env用于在接口间传递测试数据
// testcases -> scenario_test -> conftest.py
import pytest

@pytest.fixture(scope='session')
def core_env():
    return {"date": "2021-11"}

8. Allure生成测试报告

allure-pytest的详细使用方法可以参考官方文档。在这里只做简单介绍。

  • 运行测试时加上--alluredir参数可以生存报告到指定的文件夹:pytest --alluredir=/tmp/my_allure_results
  • 运行完后查看报告:allure serve /tmp/my_allure_results

END配套学习资源分享

最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】

python+pytest接口自动化,经验分享,软件测试,自动化测试,python,pytest,自动化测试,测试工程师,软件测试

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

python+pytest接口自动化,经验分享,软件测试,自动化测试,python,pytest,自动化测试,测试工程师,软件测试

全套资料获取方式:

python+pytest接口自动化,经验分享,软件测试,自动化测试,python,pytest,自动化测试,测试工程师,软件测试文章来源地址https://www.toymoban.com/news/detail-708747.html

到了这里,关于接口自动化测试:Python+Pytest+Requests+Allure的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 接口自动化测试-Python+Requests+Pytest+YAML+Allure配套撸码(详细)

    接口自动化框架:Python+Requests+Pytest+YAML+Allure 通过 Python+Requests 来发送和处理HTTP协议的请求接口,使用 Pytest 作为测试执行器,使用 YAML 来管理测试数据,使用 Allure 来生成测试报告。 框架结构 api ==== 接口封装层,如封装HTTP接口为Python接口 common ==== 各种工具类 core ==== reques

    2024年02月15日
    浏览(62)
  • Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】

            --------UnitTest框架和PyTest框架的简单认识对比与项目实战-------- 定义: Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Pytest是Python的另一个第三方单元测

    2024年02月09日
    浏览(59)
  • Python+Requests+Pytest+YAML+Allure实现接口自动化

    本项目实现接口自动化的技术选型:Python+Requests+Pytest+YAML+Allure ,主要是针对之前开发的一个接口项目来进行学习,通过 Python+Requests 来发送和处理HTTP协议的请求接口,使用 Pytest 作为测试执行器,使用 YAML 来管理测试数据,使用 Allure 来生成测试报告 本项目在实现过程中,把

    2024年02月11日
    浏览(153)
  • Python+requests+pytest+allure封装接口自动化1-项目结构目录创建,requests库封装

    api: 这是一个package,用来各个接口的类封装,按照你的业务可以将其分为多个package common: 这是一个package,用来封装底层公共方法,比如requests库封装、文件操作封 装、加解密封装、redis封装、数据库封装、随机数据封装、日志封装 testcases: 这是一个package,用来编写封装我们

    2024年02月12日
    浏览(65)
  • pytest+requests+Python3.7+yaml+Allure+Jenkins+docker实现接口自动化

    目录 接口自动化测试框架(用例自动生成) 项目说明 技术栈 环境部署 框架流程图与目录结构图及相关说明 1、框架流程图如下 2、代码目录结构图如下 关联详解 函数助手详解 代码设计与功能说明 1、定义运行配置文件 runConfig.yml 2、接口配置文件 apiConfig.ini 3、测试用例的设

    2024年02月09日
    浏览(152)
  • Python+Requests实现接口自动化测试

    一般对于自动化的理解,有两种方式的自动化。 第一,不需要写代码,完全由工具实现,这种方式的工具一般是公司自己研发的,方便黑盒测试人员使用。这种工具的特点是学习成本低,方便使用,但是通用性不强,也就是换了一家公司,就很有可能无法使用之前的工具。

    2024年01月16日
    浏览(77)
  • python3+requests+unittest接口自动化测试

    python3 + pycharm编辑器 (该套代码只是简单入门,有兴趣的可以不断后期完善) (1)run.py主运行文件,运行之后可以生成相应的测试报告,并以邮件形式发送; (2)report文件夹存放测试结果报告; (3)unit_test文件夹是存放测试用例(demo.py和test_unittest.py用例用法介绍,实际

    2024年02月09日
    浏览(64)
  • python接口自动化测试 requests库的基础使用

    目录 简单介绍 Get请求 Post请求 其他类型请求 自定义headers和cookies SSL 证书验证 响应内容 获取header 获取cookies requests库简单易用的HTTP库   格式:  requests.get(url)  注意: 若需要传请求参数,可直接在 url 最后的 ? 后面,也可以调用 get() 时多加一个参数 params ,传入请求

    2023年04月26日
    浏览(58)
  • python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

    经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路。 我们在百度搜索 天气查询 ,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接口测试用例脚本。 针对某个功能做接口测试,首先我们需

    2024年02月04日
    浏览(55)
  • python pytest 最简单的接口自动化测试框架

    最近由于工作的原因,需要开发一个接口自动化测试框架,使用pytest框架、数据驱动,并展示直观的测试报告。 具体的开发过程如下: 安装必要的库: pytest:用于编写和运行测试用例。 requests:用于发送 HTTP 请求。 pytest-html:用于生成 HTML 格式的测试报告。 可以使用以下命

    2024年03月19日
    浏览(101)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包