zoukankan      html  css  js  c++  java
  • 接口测试中,如何优雅的解决用例之间参数调用?

    ⬆️ 关注霍格沃兹测试学院公众号,回复「大礼包」,领取测试开发干货资料合集!

    近期一个接口测试实战小问题引发了众多测试同学的关注,本文整理了学员疑惑之处和学院老师的解答,供大家一起学习参考。


    Question by @Vantas

    在接口测试过程中,我遇到一个问题:

    如何将上一用例的返回值的某个 key 的 value 值,当作下一用例的入参进行使用呢?

    例如第一个用例是登录,后续每一个接口都需要用到登录接口返回的 token,用什么方式去传这个 token 呢?如果后面接口需要多个入参呢(即需要登录的
    token,也需要另一个接口的 id 值)?


    Answer by @Wayyt

    要看使用的是什么工具。如果是用 Java/Python 代码,那返回值转成 JSON,然后提取出来就可以了。


    Question by @Vantas

    我使用的是 Pytest,把返回值赋给了一个全局变量的字典,后面用例直接调用字典,这样可以吗?

    用 JSON 或字典返回,再后面用例怎么传入呢,一直没弄清楚,是用fixtrue调用方法名,然后用例里直接写返回的变量名吗?

    那像第三个支付用例,里面需要 token,还需要 URL 后面加 “orderids”,这种需要前面两个用例得返回值,怎么写呢?不能方法名中传入两个
    fixtrue 把?那如果需要多个参数呢?如果用例非常多的话,用例之间参数调用关联比较多,怎么样维护比较好呢?

    有没有最优方式?以下是示例代码:

    def setup():  
    self.t=globals()  
      
    #登陆  
    def test_fxLogin(self):  
        url = “http://www.xxx.com/token”  
        data = {“username”:“hffx”,“password”:“123456”,“platformType”:“NORMAL”}  
        headers = {“Content-Type”: “application/json”}  
        r = requests.post(url, data=json.dumps(data), headers=headers)  
        result = r.text  
        print(result)  
    jsr = json.loads(result)  
    fxtoken = jsr[‘data’]  
    self.t[‘fx’]=fxtoken  
    assert r.status_code==200  
      
    #下单  
    def test_buyprocedure(self):  
        url = “http://www.xxx.com/”  
        data = {“data”}]}  
        headers = {“Authorization”:self.t[‘fx’],“Content-Type”: “application/json”}  
        r=requests.post(url,data=json.dumps(data),headers=headers)  
        result = r.text  
        print(result)  
    jsr=json.loads(result)  
    orderid=jsr[data][id]  
    self.t[‘orderids’]=orderid  
    assert r.status_code == 200  
      
    #支付  
    def test_payprocedure(self):  
        url = “http://www.xxx.com/”+self.t[‘orderids’]  
        data = {"data}]}  
        headers = {“Authorization”:self.t[‘fx’],“Content-Type”: “application/json”}  
        r=requests.post(url,data,headers)  
        print(r.text)  
    assert r.status_code==200  
    

    Answer by @Wayyt

    其实这个逻辑非常简单,你不要把它想复杂。无非就是做三件事:拿到 token,存储 token,调用token。

    从返回值中提取即可,用一个列表、一个字典甚至一个文件,把它存储起来。读取你放置token的数据结构或者文件即可。

    // 可以用setup_class  
      
    @classmethod  
    def setup_class(cls):  
        cls.pass_dic = {}  
      
    // 之后在测试用例里用self.pass_dic来存取结果  
    

    Answer by @思寒

    • 全局变量可以,但是不推荐
    • 类变量可以 cls.xx,多线程容易出问题
    • 实例变量 self.xx,这种方式最好

    以下是一个没有使用 Page/API Object 模式的入门用例:

    class TestWework:  
        def setup_class(self):  
            r = requests.get(  
                'https://qyapi.weixin.qq.com/cgi-bin/gettoken',  
                params={  
                    'corpid': 'xxxxx',  
                    'corpsecret': 'xxxxxxxx'  
                }  
            )  
            self.token = r.json()['access_token']  
      
        def test_tags_list(self):  
            r = requests.post(  
                'https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_corp_tag_list',  
                params={'access_token': self.token}  
            )  
            print(json.dumps(r.json(), indent=2, ensure_ascii=False))  
            assert r.status_code == 200  
            assert r.json()['errcode'] == 0  
    

    以上,欢迎大家留言探讨。更多自动化测试进阶实战,
    来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web自动化测试 app自动化测试、接口自动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全面提升测试开发工程师的技术实力
    QQ交流群:484590337
    公众号 TestingStudio
    点击获取更多信息

  • 相关阅读:
    JAVA开发人员画图表总结(ECHARTS)
    Spring Validation 表单校验
    Java BIO、NIO、AIO 学习
    JAVA笔试题
    JAVA GC优化入门
    jstat 使用日志
    JAVA内存泄漏
    JAVA 线程池入门事例
    JAVA Semaphore
    Serializable 介绍
  • 原文地址:https://www.cnblogs.com/hogwarts/p/15817816.html
Copyright © 2011-2022 走看看