接口测试 请问一下大家,用 Python 写接口自动化的时候,如果作参数传递呢?

时光走散了故人。 · 2018年06月29日 · 最后由 时光走散了故人。 回复于 2018年06月30日 · 2047 次阅读

本人对 Python 一直处在入门阶段,简单的方法能写出来,复杂的就不行了,现在想做一个接口自动化,单个用例已经能够写出来,但是考虑到之后的流程性测试,就必须要攻破参数化传递这一关,因为之前都没怎么写过,所以脑子里面没什么方案。
举例:如图,一个登陆的测试用例,登陆成功后,后面的接口需要传入该用户的 sessionid 作为参数,我自己写了个提取器,能够把返回的 response 中的 sessionid 提取出来,但是在后面的用例中不知道怎么调用;还有就是,比如第一次需要用 sessionid 作为下一个接口的入参,第二次却需要 response 中的 userid 作为入参,那这种情况该如何实现呢?最好能说详细一点,加一些封装思路就更好了,谢谢大家~
最后在阐述一下我的想法:需要获取上一个接口的 response 中的某个字段的值,并能够作为下一个接口的参数,如果能封装成方法就更好了。我现在有两个想法,第一个是每次 setup 方法请求前一个接口,获取对应的值。第二个是每一个请求的返回数据我都存到一个 json 文件里面,在写用例的时候再去解析 json 文件中对应的数据作为参数,不知道这两种方法那种方法可行性更高,或者有没有更好更简单的方法和思路,本人小白一个,如果用第二种方法的话,可能在能力上还需要进一步提高,但是第一种方法又感觉太冗余了,毕竟每次需要传递参数时,都需要在 setup 里面请求一下之前的接口,并单独提取某个值作为参数

  • ----------------------------------------------------------------------------------------------------------------

昨晚研究了一下,用了 setup 试了一下,但是发现有如下几个问题:
1.调用后,控制台报一个不知道是啥的错误,见后面的报错
2.因为我调用的 sessionid 参数是需要在第二个接口作为参数传进去的,但是这样的话,原有的参数是不是就不能传了,我们公司的接口都有公共参数,也就是代码中的 params=self.QUERY,但是我传了公共参数后,又需要继续传 sessionid,也就是代码中的 self.j_1,这种情况该怎么办呢?

代码和报错如下:

class TestXjxHTTP(unittest.TestCase):
    URL = Config().get('URL')
    logger.info('请求的URL为:{0}'.format(URL))
    LOGIN_URL = Config().get('login_url')
    INDEX_URL = Config().get('index_url')
    RISK_URL = Config().get('risk_url')


    QUERY = Config().get('PARAMS')
    LOGIN = URL + LOGIN_URL
    INDEX = URL + INDEX_URL
    RISK = URL + RISK_URL

    def setUp(self):
        self.j = JMESPathExtractor()
        self.client = HTTPClient(url=self.LOGIN, method='POST')
        logger.info('请求的api路径为:{0}'.format(self.LOGIN_URL))
        logger.info('拼接后的请求路径为:{0}'.format(self.LOGIN))
        res = self.client.send(data=self.QUERY)
        logger.info('接口入参为:{0}'.format(self.QUERY))
        # self.assertIn('登录成功', res.text)
        self.j_1 = self.j.extract(query='data.item.sessionid', body=res.text)
        logger.debug('该用户的sessionid为:{0}'.format(self.j_1))
        print('该用户的sessionid为:{0}'.format(self.j_1))
        return self.j_1


    def test_xjx_http_risk1(self):
        self.client = HTTPClient(url=self.INDEX, method='GET')
        logger.info('请求的api路径为:{0}'.format(self.RISK_URL))
        logger.info('拼接后的请求路径为:{0}'.format(self.RISK))
        res = self.client.send(params=self.QUERY, data=self.j_1)
        logger.info('返回的参数为:{0}'.format(res.text))
        logger.info('接口入参为:query--{0}\ndata--{1}'.format(self.QUERY, self.j_1))

if __name__ == '__main__':
    unittest.main()

执行以上代码会报错,报错如下:

"D:\Program Files\python3\python.exe" C:/Users/Administrator/PycharmProjects/PythonApitest/testCase/case1.py
该用户的sessionid为:FE2C7DF176A44E4A91FF687135A13641
C:/Users/Administrator/PycharmProjects/PythonApitest/testCase/case1.py:87: ResourceWarning: unclosed <socket.socket fd=888, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.1.5', 62705), raddr=('47.96.31.154', 26000)>
  self.client = HTTPClient(url=self.INDEX, method='GET')
.D:\Program Files\python3\lib\unittest\suite.py:84: ResourceWarning: unclosed <socket.socket fd=888, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.1.5', 62706), raddr=('47.96.31.154', 26000)>
  return self.run(*args, **kwds)

----------------------------------------------------------------------
Ran 1 test in 0.607s

OK

Process finished with exit code 0

共收到 4 条回复 时间 点赞

麻烦知道的朋友告诉一下我这个小白,真心感谢

你把登录的 case 返回的 sessionid 等返回值序列化存储起来。后面的 case 需要用的时候先判断传的值是否存在,再使用

xuxu 回复

那我既需要传公共参数,又需要额外传上一个接口返回的某个值,该怎么传呢?我的第二个接口是一个 get 请求,我的做法是:res = self.client.send(params=self.QUERY, data=self.j_1),但是这样应该行不通吧,get 请求不能传 body 参数吧?

xuxu 回复

是需要重新封装一下 client 方法才能实现这种传递吗?

5楼 已删除
时光走散了故人。 关闭了讨论 06月30日 16:08
需要 登录 後方可回應,如果你還沒有帳號按這裡 注册