51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 7915|回复: 1
打印 上一主题 下一主题

[转贴] 接口测试中,如何优雅的解决用例之间参数调用?

[复制链接]
  • TA的每日心情
    擦汗
    14 小时前
  • 签到天数: 1021 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-2-4 10:03:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1测试积点
    近期一个接口测试实战小问题引发了众多测试同学的关注,本文整理了学员疑惑之处和学院老师的解答,供大家一起学习参考。
      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 把?那如果需要多个参数呢?如果用例非常多的话,用例之间参数调用关联比较多,怎么样维护比较好呢?
      有没有最优方式?以下是示例代码:
    1. def setup():
    2.   self.t=globals()
    3.   #登陆
    4.   def test_fxLogin(self):
    5.       url = “http://www.xxx.com/token”
    6.       data = {“username”:“hffx”,“password”:“123456”,“platformType”:“NORMAL”}
    7.       headers = {“Content-Type”: “application/json”}
    8.       r = requests.post(url, data=json.dumps(data), headers=headers)
    9.       result = r.text
    10.       print(result)
    11.   jsr = json.loads(result)
    12.   fxtoken = jsr[‘data’]
    13.   self.t[‘fx’]=fxtoken
    14.   assert r.status_code==200
    15.   #下单
    16.   def test_buyprocedure(self):
    17.       url = “http://www.xxx.com/”
    18.       data = {“data”}]}
    19.       headers = {“Authorization”:self.t[‘fx’],“Content-Type”: “application/json”}
    20.       r=requests.post(url,data=json.dumps(data),headers=headers)
    21.       result = r.text
    22.       print(result)
    23.   jsr=json.loads(result)
    24.   orderid=jsr[data][id]
    25.   self.t[‘orderids’]=orderid
    26.   assert r.status_code == 200
    27.   #支付
    28.   def test_payprocedure(self):
    29.       url = “http://www.xxx.com/”+self.t[‘orderids’]
    30.       data = {"data}]}
    31.       headers = {“Authorization”:self.t[‘fx’],“Content-Type”: “application/json”}
    32.       r=requests.post(url,data,headers)
    33.       print(r.text)
    34.   assert r.status_code==200
    复制代码
    Answer by @Wayyt
      其实这个逻辑非常简单,你不要把它想复杂。无非就是做三件事:拿到 token,存储 token,调用token。
      从返回值中提取即可,用一个列表、一个字典甚至一个文件,把它存储起来。读取你放置token的数据结构或者文件即可。
    1. // 可以用setup_class
    2.   @classmethod
    3.   def setup_class(cls):
    4.       cls.pass_dic = {}
    5.   // 之后在测试用例里用self.pass_dic来存取结果
    复制代码
    Answer by @思寒
      ·全局变量可以,但是不推荐
      ·类变量可以 cls.xx,多线程容易出问题
      ·实例变量 self.xx,这种方式最好
      以下是一个没有使用 Page/API Object 模式的入门用例:
    1.   class TestWework:
    2.       def setup_class(self):
    3.           r = requests.get(
    4.               'https://qyapi.weixin.qq.com/cgi-bin/gettoken',
    5.               params={
    6.                   'corpid': 'xxxxx',
    7.                   'corpsecret': 'xxxxxxxx'
    8.               }
    9.           )
    10.           self.token = r.json()['access_token']
    11.       def test_tags_list(self):
    12.           r = requests.post(
    13.               'https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_corp_tag_list',
    14.               params={'access_token': self.token}
    15.           )
    16.           print(json.dumps(r.json(), indent=2, ensure_ascii=False))
    17.           assert r.status_code == 200
    18.           assert r.json()['errcode'] == 0
    复制代码





    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-19 23:41 , Processed in 0.066048 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表