以下代码路径:
def _get_token(url, data):
print('will show covered')
response = requests.post(url, data=data)
print('will not show covered but will still print')
access_token = response.json().get('access_token')
return 'Bearer {0}'.format(access_token)
运行时导致覆盖错误地为我们报告其行requests_mock
:
import requests_mock
def test_parse_response(self):
with requests_mock.mock() as rm:
rm.post(token_url, status_code=200, json={'access_token': 'ACCESSTOKEN'})
self.assertEqual( _get_token(token_url, {}), 'Bearer ACCESSTOKEN')
在某些机器上,该行之后的requests.post
行被错误地报告(因为它们没有报告覆盖那些被覆盖的行的行)。但是,关闭 wifi 会导致这些线路用于覆盖 (?)。
测试正在使用 tox 和 repo 根目录中的 tox.ini 文件运行,该文件将测试命令设置为:
[testenv]
nosetests --exclude-dir=mypackage/test/donttestme --cover-xml --cover-xml-file=coverage_file.xml
使用 setup.cfg 包含:
[nosetests]
with-coverage=true
cover-erase=true
cover-package=mypackage
cover-min-percentage=100
cover-branches=true
with-xunit=true
[coverage:report]
exclude_lines =
if __name__ == .__main__.:
pragma: no cover
我缩小了范围:
- 正在执行代码路径(否则测试将失败,必须命中代码路径)
- 更改 requests_mock 返回未通过测试
- 安装的所有版本的python/包(虚拟环境和全局)都是相同的
- codecov==2.0.5,coverage==4.2,nose==1.3.7,nose-exclude==0.4.1,requests==2.11.0,requests-mock==1.3.0,
- OSX 的版本是相同的(10.11.6 - 尽管其他版本的人也看到了这一点)
- 验证etc/hosts正常
- 在 macbook pro 上,视网膜(所以 wifi 禁用是通过使用菜单选项禁用)
- 问题发生在之后
requests.post
-post
不报告除该行之外的所有未来行 - 对于 27、3.5 和 3.6 python,tox 中的行为相同
- Python 已与 brew 一起安装
- 当从 pyenv/virtualenvs 运行 tox 时,两者都显示相同的行为
对于我们大约 50% 的团队,无论有/没有 wifi,完全相同的代码库都可以正常工作,但另外 50% 的团队看到了仅覆盖率在没有 wifi 的情况下正确报告的问题行为。
对于这里可能出现的问题,我完全没有想法。为什么会发生这种情况?