2

以下代码路径:

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 的情况下正确报告的问题行为。

对于这里可能出现的问题,我完全没有想法。为什么会发生这种情况?

4

0 回答 0