【HttpRunner v3.x】笔记—8.用例引用、变量传递

简介: 【HttpRunner v3.x】笔记—8.用例引用、变量传递

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


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


1268169-20200630194255900-1170434779.png


上一篇提到了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,查询用户名,返回是我写死的字典。


  1. /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”,运行一下,可以看到测试通过。


1268169-20200630194438350-446207998.png


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"。


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


1268169-20200630194542687-2040861289.png


二、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接口的测试用例,可以看到运行通过。


1268169-20200630194727498-1493237621.png


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

相关文章
|
7月前
|
存储 安全 Java
解释Python中的引用和赋值机制。
Python中,变量是对象引用,不存储数据,而存数据在内存的位置。赋值(=)创建变量并让其指向内存中的对象。当多个变量指向同一对象时,它们共享引用。Python使用引用计数管理对象生命周期,对象引用为0时回收。了解这些机制对优化内存使用和防止内存泄漏很重要。例如: ```markdown ```python a = 5 b = a # b引用了同一数字5 del a # 数字5的引用计数仍为1,未被回收 ``` 引用计数并非唯一机制,Python还采用其他策略处理循环引用等复杂情况。
63 2
|
7月前
|
开发者 Python
|
6月前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
51 0
|
4月前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
41 2
|
4月前
|
Python
Python中多变量赋值
【8月更文挑战第5天】
454 5
makefile 变量的替换,嵌套引用,命令行变量
makefile 变量的替换,嵌套引用,命令行变量
128 1
|
7月前
|
存储 Java Python
Python 变量?对象?引用?赋值?一个例子解释清楚
Python 变量?对象?引用?赋值?一个例子解释清楚
|
Python
学习Python语言的语法,例如函数、类、模块、循环中的类详解
学习Python语言的语法,例如函数、类、模块、循环中的类详解
70 1
#PY小贴士# 函数也是对象
这就要提到 Python 中的一个重要概念:万物皆对象。除了我们熟知的数字、字符、列表、字典是对象外,函数、模块,甚至类型本身,也是对象,只不过在功能和表现上会有所不同。
|
Python
Python 再谈变量作用域与变量引用
Python 再谈变量作用域与变量引用
103 0