我正在尝试以字符串形式输出与 http 请求相关的数据:
r = requests.post(url, data, params)
assert r.status_code == 200, 'nurl - {}nresponse status - {}nrequest headers - {}nrequest body - {}nresponse headers - {}nresponse body - {}'.format(
r.url, r.status_code, r.request.headers, r.request.body, r.headers, r.text)
在我的本地机器(python 2.7.5(上运行它效果很好,所有相关数据都被呈现和格式化。
从 Jenkins 构建作业执行此操作时,它会返回异常:
assert r.status_code == 200, 'nurl - {url}nresponse status - {status}nrequest headers - {r_headers!s}nrequest body - {r_body}nresponse headers - {headers}nresponse body - {body}'.format( url=r.url, status=r.status_code, r_headers=r.request.headers, r_body=r.request.body, headers=r.headers, body=r.text) TypeError: float argument required, not dict
test_watch.py:58:类型错误
通过通过将 .format 方法更改为一次只报告一个变量来进行一些调试,我发现 Jenkins 作业在插入请求标头时字符串格式存在问题。 是的,这是一个字典,但是.format((方法应该可以很好地处理这个问题。 为什么抱怨类型?
完整的回溯并不是很有帮助:
assert r.status_code == 400, 'Negative test failure' 'nurl - {url}nresponse status - {status}nrequest headers - {r_headers!s}nrequest body - {r_body}nresponse headers - {headers}nresponse body - {body}'.format( url=r.url, status=r.status_code, r_headers=r.request.headers, r_body=r.request.body, headers=r.headers, body=r.text)
E 类型错误:需要浮点参数,而不是字典
test_watch.py:58:类型错误
总结一下:这在我的本地机器上有效,请求标头以字符串形式输出:
assert r.status_code == 400, 'Negative test failure'
'nrequest headers - {r.request.headers}'.format(r=r)
从 Jenkins 构建服务器运行相同的代码:
assert r.status_code == 400, 'Negative test failure' 'nrequest headers - {r.request.headers}'.format(r=r) TypeError: float argument required, not dict test_watch.py:58: TypeError
更新:我更改了代码以捕获TypeError,然后引发了一个自定义的断言错误,以相同的方式从相同的部分构建(我复制/粘贴(。 这非常令人困惑,为什么 .format 以一种方式工作,而另一种方式却完全失败?
try:
assert r.status_code == 400, 'Negative test failure'
'nurl - {r.url}nresponse status - {r.status_code}nrequest headers - {r.request.headers}nrequest body - {r.request.body}nresponse headers - {r.headers}nresponse body - {r.text}'.format(r=r)
except TypeError as e:
message = 'TypeError raised! {}'.format(e)
message += 'nurl - {r.url}nresponse status - {r.status_code}nrequest headers - {r.request.headers}nrequest body - {r.request.body}nresponse headers - {r.headers}nresponse body - {r.text}'.format(r=r)
raise AssertionError(message)
执行此代码时,我得到:
E AssertionError: TypeError raised! float argument required, not dict
E url - http://api4.qa.ebay.com/user/v1/watchlist/watch?listingStatus=BLARGLE&limit=25
E response status - 200
E request headers - {<good headers outputted as a dict>}
E request body - <good content here>
E response headers - {no problems}
E response body - {all my data was printed!}
我仍然不知道为什么会发生此错误,但我能够解决它:
最初的 Jenkins 实例在 Mac OS 10.9.4 上运行我的作业。 将我的作业设置为在 10.9.5 上的新从属服务器中运行,使我的代码无需更改即可成功。
OSX 10.9.4 和 10.9.5 之间是否存在已知问题?