16

我的测试清楚地执行了每个功能,也没有未使用的导入。然而,根据覆盖率报告,62% 的代码从未在以下文件中执行:

在此处输入图像描述

有人可以指出我可能做错了什么吗?

这是我初始化测试套件和覆盖范围的方法:

    cov = coverage(branch=True, omit=['website/*', 'run_test_suite.py'])
    cov.start()

    try:
        unittest.main(argv=[sys.argv[0]])
    except:
        pass

    cov.stop()
    cov.save()

    print "\n\nCoverage Report:\n"
    cov.report()

    print "HTML version: " + os.path.join(BASEDIR, "tmp/coverage/index.html")
    cov.html_report(directory='tmp/coverage')
    cov.erase()
4

2 回答 2

12

这是coverage.py FAQ中的第三个问题:

问:为什么函数(或类)的主体显示为已执行,但 def 行没有?

发生这种情况是因为在定义函数之后才开始覆盖。定义行在没有覆盖测量的情况下执行,然后开始覆盖,然后调用函数。这意味着身体被测量,但功能本身的定义不是。

要解决此问题,请尽早开始报道。如果你使用命令行来运行你的程序,那么你的整个程序都会被监控。如果您使用 API,则需要在导入定义您的函数的模块之前调用 coverage.start()。

最简单的做法是在覆盖范围内运行测试:

$ coverage run -m unittest discover

您的自定义测试脚本并没有超出覆盖命令行的功能,仅使用命令行会更简单。

于 2015-04-05T02:23:47.403 回答
5

要排除导入语句,您可以将以下行添加到 .coveragerc

[report]
exclude_lines =
    # Ignore imports
    from
    import

但是当我尝试为装饰器添加'@'时,装饰器范围内的源代码被排除在外。覆盖率是错误的。可能还有其他一些方法可以排除装饰器。

于 2019-07-12T04:14:00.090 回答