运行 coverage.py 模拟单元测试

Running coverage.py over unit tests with mocking

我正在尝试 运行 代码覆盖我程序的单元测试。我在测试中使用模拟,这意味着我必须使用 python3 及更高版本。我已经使用 pip:

安装了 coverage.py
pip install coverage

安装成功,覆盖范围正常。问题是,当我尝试 运行 覆盖我的单元测试时,它 运行s 与 python2.6 并且导入模拟失败,尽管我的脚本以 #![=27 开头=]:

coverage run ./my_tests.py

回溯(最近调用最后):
文件“./my_tests.py”,第 9 行,在模块
中 来自 unittest.mock 导入补丁
ImportError: 没有名为 mock

的模块

有没有办法将 运行 的覆盖范围配置为 python3?是否有默认情况下适用于 python3 的 coverage 版本?

您的默认设置显然是 2.6 python。或者至少,您在 2.6 树中安装了 coveragepy 模块,它将 'coverage' 放入 python26/Scripts,然后 运行s coveragepy 与 2.6。但是,如果您显式 运行 模块与 2.x 和 3.x 一起使用,而不仅仅是默认值,则该模块可与 2.x 和 3.x 一起使用。

我通过将它克隆到我的 dev 目录中而恰好拥有 'installed' coveragepy。我还为我的特殊需要写了一个 cover.bat,它是在提交它们之前在我的 python 存储库克隆中测试新的和修补的 idlelib 文件。这是我的文件。与您的问题特别相关的是以 %py% 开头的行。我将其设置为我的 3.4 存储库版本,但您可以轻松地将其指向已安装的 3.4,甚至将其作为输入。

@echo off
rem Usage: cover fileName [test_ suffix] # proper case required by coveragepy
rem filename without .py, 2nd parameter if test is not test_filename
setlocal
set py=34\pcbuild\python_d
set src=idlelib.%1
if "%2" EQU "" set tst=34/Lib/idlelib/idle_test/test_%1.py
if "%2" NEQ "" set tst=34/Lib/idlelib/idle_test/test_%2.py

%py% coveragepy run --pylib --source=%src% %tst%
%py% coveragepy report --show-missing
%py% coveragepy html
htmlcov_Lib_idlelib_%1.html
rem Above opens new report; htmlcov\index.html displays report index