这就是我想要测试的代码:
class AbstractWrapper(ABC):
@abstractmethod
def func(self) -> None:
raise NotImplementedError # *
class Wrapper(AbstractWrapper):
def func(self) -> None:
print(1) # *
我编写了 pytest 测试并运行了命令pytest --cov --cov-report=html
。但由于某种原因,报告显示*
测试未涵盖 的行。但测试工作正常并检查代码(如果输入数据不正确,则测试不会通过,如果输入正确,则测试会通过)。
我该如何解决这个问题,也许我使用了错误的命令?
首先,您标有一个星号,表明
print(1)
它没有为您覆盖,但这个问题不会为我重现:如果代码在测试执行期间实际执行,那么它会被考虑到覆盖范围中。进一步来说,关于抽象方法。如果您只测试
Wrapper
,那么原始的非重写方法将保持未被覆盖,因为 实际上原始方法没有被调用:在这种情况下,我将所有内容写入一个文件中
test.py
,我使用以下命令运行测试涂层:
您需要使该方法成为非抽象方法,以便您可以继承并调用该方法的原始版本(检查它是否确实抛出
NotImplementedError
):涂层:
或者在抽象方法上添加注释
# pragma: no cover
,则不考虑其覆盖率:exclude_also
您还可以在配置中添加抽象方法装饰器.coveragerc
(您需要将配置放在调用 pytest 的文件夹中) - 在我看来,这是最方便的选项:模块文档中的完整示例
coverage.py
(不包括coverage.py中的代码):结果: