看到这里,对于httprunner已经有了一个大概的了解,现在想对于一些比较重要或者常用的功能,进行一些实践操作。

毕竟那谁说过,“纸上得来终觉浅,绝知此事要躬行。”



上一篇提到了RunTestCase,里面有2个重要的特征:

一个是在一个用例中引用另一个测试用例,另一个则是变量的导出与引用。

那就先来实践一下这2个货。

我用flask快速写了2个接口,以供在本地调用:

from flask import Flask
from flask import request app = Flask(__name__) @app.route('/')
def hello_world():
return 'Hello World!' @app.route('/getUserName', methods=['GET'])
def get_user_name():
if request.method == 'GET':
return {
"username": "wesson",
"age": "27",
"from": "China",
} @app.route('/joinStr', methods=['GET'])
def str_join():
if request.method == 'GET':
str1 = request.args.get("str1")
str2 = request.args.get("str2")
after_join = str1 + " " + str2
return {
"result": after_join
} if __name__ == '__main__':
app.run()

一共有2个接口:

  1. /getUserName,查询用户名,返回是我写死的字典。
  2. /joinStr,两个字符串拼接,返回的是拼接后的结果。

一、编写测试用例

根据之前学习过的,直接编写case,因为这个接口没有传参,cookie之类的,就省掉了,只是demo用。

1. 接口:/getUserName

from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase

class TestCaseRequestWithGetUserName(HttpRunner):
config = (
Config("test /getUserName")
.base_url("http://localhost:5000")
.verify(False)
) teststeps = [
Step(
RunRequest("getUserName")
.get("/getUserName")
.validate()
.assert_equal("body.username", "wesson")
), ] if __name__ == "__main__":
TestCaseRequestWithGetUserName().test_start()

这里呢,步骤都有了,断言是验证返回的username字段值是不是“wesson”,运行一下,可以看到测试通过。

2. 接口:/joinStr

这个接口就需要2个传参了,那么在Step里通过.with_params()来传参。

from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase

class TestCaseRequestWithJoinStr(HttpRunner):
config = (
Config("test /joinStr")
.base_url("http://localhost:5000")
.verify(False)
) teststeps = [
Step(
RunRequest("joinStr")
.get("/joinStr")
.with_params(**{"str1": "hello", "str2": "wesson"})
.validate()
.assert_equal("body.result", "hello wesson")
), ] if __name__ == "__main__":
TestCaseRequestWithJoinStr().test_start()

这里传入的参数分别是“hello”、“wesson”,这个字符串在拼接的时候是加了一个空格的,所以断言的时候我预期的值是"hello wesson"。

运行测试,可以看的测试通过。

二、testcase引用&变量传递

以上是2个分开的case,都可以分别正常运行。

假设,/joinStr接口的第二个参数,是依赖/getUserName接口的返回,那么现在这2个testcase之间就有了依赖关系。

那么在写/getUserName接口用例的时候,就需要去引用/joinStr的测试用例了,并且需要把/getUserName用例的变量导出来,/joinStr的测试用例传参时候使用。

1. 首先,先修改/getUserName接口的case:

from httprunner import HttpRunner, Config, Step, RunRequest

class TestCaseRequestWithGetUserName(HttpRunner):
config = (
Config("test /getUserName")
.base_url("http://localhost:5000")
.verify(False)
.export(*["username"])#这里定义出要导出的变量 ) teststeps = [
Step(
RunRequest("getUserName")
.get("/getUserName")
.extract()
.with_jmespath("body.username", "username")#提取出目标值,赋值给username变量
.validate()
.assert_equal("body.username", "wesson")
), ] if __name__ == "__main__":
TestCaseRequestWithGetUserName().test_start()

关注注释部分的代码,一个是config里定义了这个要导出的变量,另一个是在Step中,讲目标值提取出来,赋值给这个变量。

2. 接下来,修改/joinStr接口的测试用例:

from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
from .get_user_name_test import TestCaseRequestWithGetUserName #记得要导入引用的类 class TestCaseRequestWithJoinStr(HttpRunner):
config = (
Config("test /joinStr")
.base_url("http://localhost:5000")
.verify(False)
) teststeps = [
Step(
RunTestCase("setUp getUserName")
.call(TestCaseRequestWithGetUserName)#导入后就可以调用了
.export(*["username"])#在RunTestCase步骤中定义这个变量的导出
),
Step(
RunRequest("joinStr")
.get("/joinStr")
.with_params(**{"str1": "hello", "str2": "$username"})#在第二个传参中引用导出的变量
.validate()
.assert_equal("body.result", "hello $username")#断言的预期值也引用变量
), ] if __name__ == "__main__":
TestCaseRequestWithJoinStr().test_start()

按照直接学习的内容,case已经修改好,现在运行/joinStr接口的测试用例,可以看到运行通过。



刚接触httprunner的这个pytest格式的语法时候,感觉还不习惯,但是你跟着实践走下来,发现习惯的还是很快的,快动手试试吧。

【HttpRunner v3.x】笔记—8.用例引用、变量传递的更多相关文章

  1. 【转】shell学习笔记(三)——引用变量、内部变量、条件测试、字符串比较、整数比较等

    1.env显示当前的环境变量 2.PS1='[\u@\h \w \A] \$' 可以设置bash的命令与提示符. 3.echo $$ 显示当前bash的PID号 4.echo $?显示上一条指令的回传 ...

  2. 【HttpRunner v3.x】笔记 ——5. 测试用例-config

    上一篇中,我们了解到了config,在配置中,我们可以配置测试用例级级别的一些设置,比如基础url.验证.变量.导出. 我们一起来看,官方给出的一个例子: from httprunner import ...

  3. 【HttpRunner v3.x】笔记 ——3. 录制生成测试用例

    在正式手动编写case之前,我们可以先来熟悉下httprunner的录制生成用例功能. 用postman的童鞋都知道,里面有个功能可以将接口转换成代码,可以直接copy过来使用,提升case编写效率. ...

  4. C++学习笔记29,引用变量(1)

    引用变量在创建的时候就必须初始化.无法创建一个未被初始化的引用. #include <iostream> using namespace std; int main() { int x=1 ...

  5. Java学习笔记之---单例模型

    Java学习笔记之---单例模型 单例模型分为:饿汉式,懒汉式 (一)要点 1.某个类只能有一个实例 2.必须自行创建实例 3.必须自行向整个系统提供这个实例 (二)实现 1.只提供私有的构造方法 2 ...

  6. Java学习笔记之深入理解引用

    引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解 ...

  7. c++学习笔记(c++中的引用)

    1.c++中的bool类型:     其实c语言中也有bool类型,如果是遵守c90标准的编译器(其实现在大量编译器都是c90标准的),对于bool类型的使用除了要使用头文件 stdbool.h外,与 ...

  8. Swift 学习笔记 (三) 之循环引用浅析

    原创:转载请注明出处 110.自动引用计数实践 下面的例子展示了自动引用计数的工作机制.例子以一个简单的Person类开始,并定义了一个叫name的常量属性: class Person {     l ...

  9. C语言学习笔记 (002) - C++中引用和指针的区别(转载)

    下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图 ...

随机推荐

  1. 对Word2Vec的理解

    1. word embedding 在NLP领域,首先要把文字或者语言转化为计算机能处理的形式.一般来说计算机只能处理数值型的数据,所以,在NLP的开始,有一个很重要的工作,就是将文字转化为数字,把这 ...

  2. 【av68676164(p48-p50】虚拟内存管理(1)

    7.3.1 页式虚拟内存管理概念 物理内存(即实内存)管理 特点 缺点 1 源程序直接使用内存的物理地址 程序间容易访问冲突 2 程序必须全部装入内存才能运行 内存太小程序无法运行 3 程序占用连续的 ...

  3. 14、Cahin of Responsibility 责任链 COR设计模式

    1.责任链模式 chain of responsibility 责任链模式 责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某 ...

  4. eclipse中启动tomcat出现错误的解决方法

    前段时间跟着老师做课设,各方面调试都没有问题.近段时间想起来,看看之前写过的代码,翻着翻着就发现启动tomcat出现了错误 错误如下: 错误原因:tomcat路径配置有问题,之前可能配置好了然后由于种 ...

  5. C#设计模式之6-适配器模式

    适配器模式(Adapter Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/399 访问. 适配器模式属 ...

  6. C#LeetCode刷题之#695-岛屿的最大面积( Max Area of Island)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3736 访问. 给定一个包含了一些 0 和 1的非空二维数组 gr ...

  7. 【译】gRPC-Web for .NET now available

    .NET 的 gRPC-Web 现在正式发布了.我们在一月份发布了实验版,从那时起,我们就根据早期的用户反馈进行着改进. 有了这个版本,gRPC-Web 就变成了 grpc-dotnet 项目的一个完 ...

  8. K均值聚类和DBSCAN介绍

    K均值(K-means)聚类 问题定义:给定数据$\vec{x}_1,\vec{x}_2,\cdots,\vec{x}_n$,将它们分到不同的$K$个簇(cluster)中.定义$\vec{c}=(c ...

  9. vue-cli 安装教程(转)

    vue-cli这个构建工具大大降低了webpack的使用难度,支持热更新,有webpack-dev-server的支持,相当于启动了一个请求服务器,给你搭建了一个测试环境,只关注开发就OK. 1.安装 ...

  10. Mybatis-08-动态SQL

    动态SQL 什么是动态SQL? 根据不同的条件生成不同的SQL语句. if choose(where,otherwise) trim(where,set) foreach 搭建环境 create ta ...