【问题标题】:Pytest coverage return different coverage result when testing CLI applications in Travis-CI在 Travis-CI 中测试 CLI 应用程序时,Pytest 覆盖返回不同的覆盖结果
【发布时间】:2020-02-24 09:51:48
【问题描述】:

我的项目是一个 python CLI 应用程序,我使用 Travis 作为 CI。我使用脚本在本地测试它

script:
  - pytest pacco/cli/tests.py --cov=pacco --cov-config=.coveragerc
  - pytest --doctest-modules --cov=pacco --cov-append --cov-config=.coveragerc --cov-report xml
  - coverage report -m

它给了我

的结果
Name                                           Stmts   Miss  Cover   Missing
----------------------------------------------------------------------------
pacco/__init__.py                                  1      0   100%
pacco/cli/__init__.py                              0      0   100%
pacco/cli/commands/__init__.py                     0      0   100%
pacco/cli/commands/binary.py                      85      3    96%   16, 30, 53
pacco/cli/commands/pacco.py                       13      0   100%
pacco/cli/commands/registry.py                    65      1    98%   27
pacco/cli/commands/remote.py                      37      6    84%   29-34
pacco/cli/commands/utils/__init__.py               0      0   100%
pacco/cli/commands/utils/command_abstract.py      57     27    53%   21-22, 27-39, 51-63, 67-74
pacco/cli/commands/utils/output_stream.py         17      2    88%   16, 24
pacco/cli/entry_point.py                           4      0   100%
pacco/cli/test_utils.py                           54      0   100%
pacco/cli/tests.py                               115      1    99%   195
pacco/manager/__init__.py                          0      0   100%
pacco/manager/file_based/__init__.py               0      0   100%
pacco/manager/file_based/package_binary.py        30      1    97%   40
pacco/manager/file_based/package_manager.py       28      2    93%   37, 58
pacco/manager/file_based/package_registry.py     130      9    93%   65, 71, 100, 108, 145, 159, 217, 224, 226
pacco/manager/file_based/remote.py                44     10    77%   17, 20, 48, 52-57, 60
pacco/manager/interfaces/__init__.py               0      0   100%
pacco/manager/interfaces/package_binary.py         8      2    75%   21, 30
pacco/manager/interfaces/package_manager.py       13      4    69%   22, 31, 43, 56
pacco/manager/interfaces/package_registry.py      22      8    64%   23, 37, 46, 60, 66, 79, 91, 105
pacco/manager/interfaces/remote.py                14      3    79%   14, 18, 21
pacco/manager/remote_factory.py                    7      3    57%   7-10
pacco/manager/remote_manager.py                   66      4    94%   93, 127, 140, 163
pacco/manager/utils/__init__.py                    0      0   100%
pacco/manager/utils/cache.py                      28      0   100%
pacco/manager/utils/clients.py                   130     70    46%   28, 38, 47, 58, 68, 78, 117, 131-146, 150-151, 154-160, 163, 166, 169-170, 173-175, 178, 181, 184-196, 199-217, 220-222
----------------------------------------------------------------------------
TOTAL                                            968    156    84%

但是,当它在 Travis 中运行时,结果只有

Name                                           Stmts   Miss  Cover   Missing
----------------------------------------------------------------------------
pacco/__init__.py                                  1      0   100%
pacco/cli/__init__.py                              0      0   100%
pacco/cli/commands/__init__.py                     0      0   100%
pacco/cli/commands/binary.py                      85     69    19%   15-17, 20-34, 37-56, 59-69, 75-85, 88-107
pacco/cli/commands/pacco.py                       13      4    69%   9, 12, 15, 19
pacco/cli/commands/registry.py                    65     55    15%   11-15, 21-29, 35-40, 46-63, 69-76, 82-91, 97-105
pacco/cli/commands/remote.py                      37     29    22%   10-13, 19-34, 45-48, 54-57, 63-66
pacco/cli/commands/utils/__init__.py               0      0   100%
pacco/cli/commands/utils/command_abstract.py      57     45    21%   10-14, 20-41, 44-48, 51-63, 67-74, 77
pacco/cli/commands/utils/output_stream.py         17     10    41%   6-7, 10, 13-18, 21, 24
pacco/cli/entry_point.py                           4      1    75%   10
pacco/cli/test_utils.py                           54      0   100%
pacco/cli/tests.py                               115      1    99%   195
pacco/manager/__init__.py                          0      0   100%
pacco/manager/file_based/__init__.py               0      0   100%
pacco/manager/file_based/package_binary.py        30      6    80%   40, 56-60
pacco/manager/file_based/package_manager.py       28      2    93%   37, 58
pacco/manager/file_based/package_registry.py     130     12    91%   65, 71, 100, 108, 145, 159, 182, 186, 196, 217, 224, 226
pacco/manager/file_based/remote.py                44     10    77%   17, 20, 48, 52-57, 60
pacco/manager/interfaces/__init__.py               0      0   100%
pacco/manager/interfaces/package_binary.py         8      2    75%   21, 30
pacco/manager/interfaces/package_manager.py       13      4    69%   22, 31, 43, 56
pacco/manager/interfaces/package_registry.py      22      8    64%   23, 37, 46, 60, 66, 79, 91, 105
pacco/manager/interfaces/remote.py                14      3    79%   14, 18, 21
pacco/manager/remote_factory.py                    7      3    57%   7-10
pacco/manager/remote_manager.py                   66      4    94%   93, 127, 140, 163
pacco/manager/utils/__init__.py                    0      0   100%
pacco/manager/utils/cache.py                      28      5    82%   26, 34-37
pacco/manager/utils/clients.py                   130     70    46%   28, 38, 47, 58, 68, 78, 117, 131-146, 150-151, 154-160, 163, 166, 169-170, 173-175, 178, 181, 184-196, 199-217, 220-222
----------------------------------------------------------------------------
TOTAL                                            968    343    65%

你可以在travis看到完整的日志。

我相信问题的根源是因为它是一个 CLI 应用程序,所以我使用 subprocess.run(CLI_COMMAND) 对其进行测试,这样 pytest-cov 无法检测到来自子进程的跟踪。但它适用于我的本地机器。

当我检查 travis 覆盖结果中缺少的行时,看起来函数的主体都被忽略了。

我怀疑这可能是因为不同的 Python 环境(与 sys.settrace 行为有关)。

【问题讨论】:

  • 更新:我发现这可能是因为一般的Linux(我尝试使用docker时的结果与travis-ci相同)
  • 我找到了一种解决方法,即直接运行 CLI 的 main 函数,而不是使用子进程。这也使测试运行得更快。

标签: python-3.x pytest travis-ci pytest-cov


【解决方案1】:

如果正如 Kevin 所提到的,您可以调用一个函数来直接运行 CLI,这比使用子进程更可取。

我遇到了同样的问题,但是,直接调用我的代码并不是我的用例的选项。像 OP 一样,我使用 pytest-cov 通过子进程测量代码覆盖率。 pytest-cov 的文档包含这个小注释,令人讨厌的是,专门用于子进程陷阱的页面上没有提到 (https://pytest-cov.readthedocs.io/en/latest/readme.html#limitations)

对于子流程测量环境变量必须使它从主流程到子流程。子进程使用的 python 必须安装 pytest-cov。子进程必须进行正常的站点初始化,以便可以检测到环境变量并开始覆盖。

无论如何,我正在安装 pytest-cov 作为 tox 工作流程的一部分,因此它可能已安装到任何 tox 创建的环境中。同时,Travis 在 Travis 的环境中将我的包安装在 .travis.yml 中。对我的 CLI 应用程序进行炮击意味着它使用了 Travis 环境中的 Python 解释器,该环境没有安装 pytest-cov。对我有用的解决方法是将我的包作为 tox 的一部分进行 pip 安装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多