Django实现接口自动化平台(五)httprunner(2.x)基本使用【持续更新中】

news2024/11/30 0:32:36

 上一章:

Django实现接口自动化平台(四)解决跨域问题【持续更新中】_做测试的喵酱的博客-CSDN博客

下一章:

一、参考地址:

使用说明_httprunner2.0 概述及使用说明

二、介绍

HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。

三、安装

# 安装稳定版本

pip install httprunner==2.5.7

 查看是否安装成功

(venv) zhaohui@zhaohuideMBP miaostudydjango % httprunner -V
2.5.7

四、创建项目

hrun --startproject apitset

或者

httprunner --startproject apitest

五、虚拟环境配置

Pycharm创建虚拟环境_做测试的喵酱的博客-CSDN博客

 1、创建虚拟环境

2、进入虚拟环境

3、在虚拟环境中,再次安装httprunner

# 安装稳定版本

pip install httprunner==2.5.7

六、执行测试demo

创建完的项目中默认有测试用例,我们可以直接运行测试并生成报告。

hrun api/demo_api.yml --report-dir=reports

注意:

case路径:使用绝对路径与相对路径都可以。相对路径,是相对于跟目录的路径

生成报告的路径: 使用绝对路径与相对路径都可以。相对路径,是相对于跟目录的路径

报告样式:

七、工程结构介绍

 

 说明:
(1)api 文件夹:存储接口定义描述
(2)testcases 文件夹:存储测试用例,文件夹也可以使用其它名称
(3)testsuites 文件夹:测试测试场景,文件夹也可以使用其它名称
(4)reports 文件夹:存储 html 测试报告
(5).env文件:存储项目环境变量,通常用于存储项目敏感信息
(6)debugtalk.py:存储项目中逻辑运算辅助函数
·该文件存在时,将作为项目根目录定位标记,其所在目录即被视为项目工程根目录
·该文件不存在时,运行测试的所在路径(CWD)将被视为项目工程根目录
·测试例文件中的相对路径(例如.csv)均需基于项目工程根目录
·运行测试后,测试报告文件夹(reports)会生成在项目工程根目录

八、编写yaml case

8.1 yaml语法

yaml语法_yaml在线语法_做测试的喵酱的博客-CSDN博客

case使用yaml编写的,所以学习yanl语法很重要

1、yaml是数据格式,不是数据类型(结构)
 2、yaml配置文件的后缀为.yml或者.yaml
 3、yaml中使用#作为注释,注释只能在某一行的前后,不能与key\value在同一行
 4、yaml中有两种结构,一种是key: value,value与冒号之间必须有空格
   另一种是 - key: value,“-”为列表结构
 5、yaml文件中嵌套的同一级条目前缩进必须一致(一般缩进2个空格)
 6、yaml中如果value使用引号(单引号或者双引号),那么该value为字符串类型
 7、如果value中只要有字母,哪怕没有添加引号,一般也会识别为字符串类型(false、true、on、off、null除外)
 8、value为false、true、on、off,是布尔类型,null为空
 9、value中为纯数字或者小数,会被识别为int或float类型 

8.2 编写case

yaml case格式,与python requests的传参一摸一样。

 api/baidu_api.yml

name: 百度接口
variables:
    var1: value1
    var2: value2
request:
    url: https://ug.baidu.com/mcp/pc/pcsearch
    method: POST
    headers:
        Content-Type: "application/json"
    json:
        invoke_info: {"pos_1":[{}],"pos_2":[{}],"pos_3":[{}]}
validate:
    - eq: ["status_code", 200]

 执行case:

hrun api/baidu_api.yml --report-dir=reports

8.3 请求体 格式json或者form或者查询字符串参数

请求体为json参数:

    headers:
        Accept: "application/json"
    json:
        size: 3
        page: 2

请求体为form表单参数:

    headers:
        Content-Type: "application/x-www-form-urlencoded"

    data:
        username: "root"
        password: "123456"

请求体为查询字符串参数(get请求):

    params:
        size: 3
        page: 2

8.4 断言

8.4.1 断言类型

断言类型可太多 了,我们这里放源码。

def get_uniform_comparator(comparator):
    """ convert comparator alias to uniform name
    """
    if comparator in ["eq", "equals", "==", "is"]:
        return "equals"
    elif comparator in ["lt", "less_than"]:
        return "less_than"
    elif comparator in ["le", "less_than_or_equals"]:
        return "less_than_or_equals"
    elif comparator in ["gt", "greater_than"]:
        return "greater_than"
    elif comparator in ["ge", "greater_than_or_equals"]:
        return "greater_than_or_equals"
    elif comparator in ["ne", "not_equals"]:
        return "not_equals"
    elif comparator in ["str_eq", "string_equals"]:
        return "string_equals"
    elif comparator in ["len_eq", "length_equals", "count_eq"]:
        return "length_equals"
    elif comparator in ["len_gt", "count_gt", "length_greater_than", "count_greater_than"]:
        return "length_greater_than"
    elif comparator in ["len_ge", "count_ge", "length_greater_than_or_equals",
                        "count_greater_than_or_equals"]:
        return "length_greater_than_or_equals"
    elif comparator in ["len_lt", "count_lt", "length_less_than", "count_less_than"]:
        return "length_less_than"
    elif comparator in ["len_le", "count_le", "length_less_than_or_equals",
                        "count_less_than_or_equals"]:
        return "length_less_than_or_equals"
    else:
        return comparator

eq 是相等断言。

validate:
    - eq: ["status_code", 200]

contains:实际值是否包含期望值 

contains_by:期望值是否包含实际值。

注意:这里的包含,指的是返回值字典中的key,不是value。

其他断言类型,看上面的源码。  

8.4.2 断言--实际值

validate:
    - eq: ["status_code", 200]

方括号中,第一个参数为 实际值,第二个参数为期望值。

响应状态码:status_code

响应体数据:

  • content
  • text
  • json 

当返回值为json数据时,可以使用content、text、json 任意一个。获取的值都为字典格式。

获取返回值字典中的某一个key的值。直接用.

比如:获取返回值字典中的username的值。json.username

validate:
    - eq: ["json.username", "张三"]

 返回值value为列表时,用下标取值,如返回值为

{"username":["张三","李四","王武"]}

实际值,提取张三

json.username.0 

8.5 设置请求host 

在yaml文件中,设置base_url 的值,在request模块下,的url 只设置uri就可以了。

如:

base_url: "http:127.0.0.1:8000"
request:
    url: "/user/login/"

九、局部变量&环境变量(全局变量)

9.1 局部变量

设置局部变量,只在当前yml文件中生效。

1、在variables 下,以key:value的形式定义变量

2、引用变量,使用$变量名进行调用

举例:


variables:
    my_name: "zhangsan"
    my_password: "123456"

request:
    url: "/user/login/"
    method: POST
    data:
        username: "$my_name"
        password: "$my_password"

9.2 环境变量(全局变量)

环境变量(全局变量)在所有yml文件中都生效。

1、在项目的跟路径下的.env文件中,设置环境变量

定义: 环境变量名=环境变量值

注意:等号两边不需要有空格

2、引用变量

使用${ENV(环境变量名)}

3、举例,设置全局host

a、在项目的跟路径下的.env文件中,设置环境变量BASE_URL

BASE_URL=http://127.0.0.1:8000

b、在yml文件中,引用环境变量

base_url: "${ENV(BASE_URL)}"
request:
    url: "/user/login/"
    method: POST

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文带你了解MySQL之锁

目录 一、解决并发事务带来问题的两种基本方式1.1 一致性读(Consistent Reads)1.2 锁定读(Locking Reads)1.2.1 共享锁和独占锁1.2.2 锁定读的语句 1.3 写操作 二、多粒度锁三、MySQL中的行锁和表锁3.1 其他存储引擎中的锁3.2 Inn…

高通KMD框架详解

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、概览二、核心模块解析三、模块初始化四、处理UMD CSL请求 一、概览 利用了V4L2可扩展这一特性,高通在相机驱动部分实现了自有的一套KMD…

未来3年,请善待你的工作

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) “如果不是现在环境差,下家不好找,我早TM跟那个傻X老板翻桌子走人了,这破公司我真是一天都不想待…”这是一位粉丝朋友给K哥私信中的一段话。类似同款的话&#xff…

百度推出基于大模型的代码编写助手“Comate”真的好用吗?

‍ 点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID|计算机视觉研究院 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 Column of Computer Vision Institute 6月6日,在文心大模型技术交流会(成都&…

从业务出发,K8S环境自建和非自建整体架构设计比较

新钛云服已累计为您分享751篇技术干货 随着数字化转型的大潮到来,越来越多的企业开始上云,同时也纷纷加入到微服务和K8S队伍中。但在K8S整体环境究竟应该用自建的还是非自建?以及他们需要用到的服务,究竟应该自建还是直接用PAAS服…

02.加载GDT表,进入保护模式

加载GDT表,进入保护模式 加载GDT表,实现操作系统从实模式进入保护模式 参考 操作系统学习 — 启动操作系统:进入保护模式 保护模式与实模式 GDT、GDTR、LDT、LDTR 调用门与特权级 趣谈 Linux 操作系统 在01.硬盘启动盘,加载操作系…

要能力、要稳定也要降本——百度多媒体技术回顾

摘要:多媒体技术生态进入到存量市场,客户既要又要还要成为常态。如何将能力、质量与稳定性、成本不断优化,就是各个多媒体技术平台的必修课。本文以百度智能视频云为例,纵览了其在RTC、边缘计算、视频编码等关键能力与用户体验和成…

腾讯搜索的系统架构是如何达到99.994%高可用的?

👉腾小云导读 本文主要是搜索在稳定性治理实践的经验总结,讲述了搜狗搜索在技术债治理基础上如何将可用性提升一个量级,事故级 MTTD(平均故障检测时间)、MTTR(平均响应时间)优化一个量级&#x…

chatgpt赋能python:Python的IDLE运行方式

Python的IDLE运行方式 Python是一种非常流行的编程语言,其优雅简洁的语法和丰富的库资源,使得Python在很多领域都得到广泛应用。在Python的开发过程中,IDLE是一种常用的Python集成开发环境(IDE),对于初学者…

关于操作系统调度器的三篇论文

【引子】没有忘记,目前从事的是DingOS 操作系统相关工作,没有因为LLM 而迷失。LLM 会成为基础设施,LLM 会为操作系统赋能,但是操作系统的价值是客观存在的,除非,计算机体系结构发生了翻天覆地的变化。 在任…

Java面试都只是背答案吗

Java 八股文面试当然要背,不背很难通过面试的 Java基础 Java基础面试题 Java的特点Java 与 C 的区别JDK/JRE/JVM三者的关系Java程序是编译执行还是解释执行?面向对象和面向过程的区别?面向对象有哪些特性?数组到底是不是对象&a…

编写Python程序求数组中最长的字符串

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 移船相近邀相见,添酒回灯重开宴。 大家好,我是皮皮。 一、前言 前几天在Python白银群【王子】问了一个Python基础的问题&#x…

Ubuntu离线安装docker与nvidia-docker

Ubuntu离线安装docker与nvidia-docker 安装 docker 20.10.17安装 nvidia-docker 和 nvidia-container-toolkit docker与nvidia-docker离线安装包 安装 docker 20.10.17 查看Ubuntu操作系统版本的详细信息,不同的版本所依赖的deb不同。 lsb_release -aCodename为&a…

一文带你读懂:TCP连接的三次握手和四次挥手(上篇)

TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。 天下没有不散的宴席,对于 TCP 连接也是这样, TCP 断开连接是通过四次挥手方式。 下面我们通过实操,来彻底理解三次握手和四次…

linux ubi文件系统更新失败问题分析2

昨天打包了一个ubi根文件系统,打包成功,写板子flash成功,但系统运行后还是老的文件系统,具体过程如下: 使用脚本1,打包rootfs系统: 打包后的文件系统,下载到板子后,查看…

01_MySQL索引简介

影响性能下降、SQL慢体现在:执行时间长或者等待时间长 影响sql性能的常见情况: 数据过多:分库分表(根据微服务划分库、按照地域或时间分表存储、按照数据的特定字段对分库数量求余)关联了太多的表,太多join:允许表出现…

在口袋妖怪世界中理解ChatGPT的思维

深度学习自然语言处理 原创作者:Winni 今天为大家分享一篇研究,当ChatGPT穿越到口袋妖怪世界,是否会理解并应用这个虚构世界的知识呢? 熟悉口袋妖怪的朋友们一定知道,这些可爱的生物们有着各种不同的属性、类别和技能。…

TypeScript Vs JavaScript 区别

一、观察 1. JS 平常的复制类型 let val; val 123; val "123"; val true; val [1, 3, 5]; 注意点: 由于JS是弱类型的, 所以只要定义了一个变量, 就可以往这个变量中存储任意类型的数据 也正是因为如此, 所以会给我们带来一个问题 2. 假设a是一个数组, b是一个数值…

java+SSM+vue停车场管理系统

家家户户对于汽车的需求日益的增长。在促进了汽车行业的发展的同时,也对我国的交通造成了较大的压力。首先在日常的出行中,老旧城区道路狭窄,容易造成车辆的堵塞,每天早晚,接送孩子的车辆数密集,会造成相应…

【工业控制系统安全】深入了解 ICS612:ICS 网络安全:第 1 部分

ICS 从业者可以立即在实际情况中使用他们的 ICS612 培训。 降落飞机 我认识一家生产工厂的首席执行官,我们就叫他比尔吧,他希望他的关键团队成员真正了解他的运营团队每天为实现生产目标而承受的压力。比尔还希望他的经理和支持人员能够理解“让它发生”…