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

发表于:2021-2-02 09:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:程序员--小憨    来源:博客园

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

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • ZtyTester
    2021-2-03 18:52:37

    登录有两个返回值需要别的接口调用,一个是token 一个是授权码

  • ZtyTester
    2021-2-03 18:51:49

    大佬您好,如果是多个值得话该怎么办

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号