如何将Tavern测试的响应保存在JSON文件中?

时间:2018-06-28 13:25:47

标签: python json rest dictionary pytest

我正在使用Tavern工具进行API测试,并且我想在执行测试时将返回的响应保存在JSON文件中,因此我使用以下代码来响应yaml测试文件:

 response:
    status_code: 200
    save:
      $ext:
        function: tavern_utils:save_response

tavern_utils:save_response()函数:

def save_response(response):
    with open('saved.json','w') as file:
       json.dump(file,response.json())

所以在用pytest执行测试时,出现以下错误:

TypeError: The Object of type 'TextIOWrapper' is not JSON serializable

如何解决此错误或通过其他任何方法保存响应?

2 个答案:

答案 0 :(得分:2)

得到解决方案: 只需用以下命令替换save_response函数:

def save_response(response):
    filename='file4.json'
    with open(filename, 'w') as f:
        json.dump(response.json(), f)

Yaml测试文件为:

  response:
    status_code: 200
    body:
      $ext:
        function: tavern_utils:save_response            

答案 1 :(得分:0)

TextIOWrapper是一个打开的文本文件,或类似文件(在您的情况下为某种网络响应对象)的文件。您显然不能序列化(它必须存储服务器的整个状态以及您与服务器之间的网络连接才能还原同一对象)。

如果您要序列化文件中的行(作为字符串列表),那很容易。文件对象是其行上的迭代器,因此:

list(f)

…给您这些行的列表。

如果要将其序列化为一个巨型字符串,也可以这样做:

f.read()

或者,如果文件的内容已经是JSON编码的字符串,并且您希望将其解码为可以序列化的值,则可以json.load。但是,除非您这样做是为了验证它确实是有效的JSON,否则这是一种愚蠢的做法;您只需将JSON字符串读取为字符串,然后将其写回字符串即可,而无需在任何地方进行任何JSON处理。

如果您想要的东西与其他任何东西都不相同,则需要说明您要尝试做的事情,但这可能是可行的。

如果您想要其他东西