Flask测试 - 为什么coverage不包括import语句和装饰器?

Mar*_*yyy 15 python testing coverage.py flask

我的测试清楚地执行每个函数,也没有未使用的导入.然而,根据覆盖率报告,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()
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 12

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

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

这是因为在定义函数后启动了coverage.定义行在没有覆盖测量的情况下执行,然后启动覆盖,然后调用该函数.这意味着身体被测量,但功能本身的定义不是.

要解决此问题,请提前开始报道.如果使用命令行以覆盖范围运行程序,则将监视整个程序.如果您使用的是API,则需要在导入定义函数的模块之前调用coverage.start().

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

$ coverage run -m unittest discover
Run Code Online (Sandbox Code Playgroud)

您的自定义测试脚本除了覆盖命令行之外没有做太多工作,使用命令行会更简单.


小智 7

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

[report]
exclude_lines =
    # Ignore imports
    from
    import
Run Code Online (Sandbox Code Playgroud)

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