烧瓶测试 - 为啥覆盖不包括导入语句和装饰器?

Posted

技术标签:

【中文标题】烧瓶测试 - 为啥覆盖不包括导入语句和装饰器?【英文标题】:Flask Testing - why does coverage exclude import statements and decorators?烧瓶测试 - 为什么覆盖不包括导入语句和装饰器? 【发布时间】:2015-06-09 13:16:01 【问题描述】:

我的测试清楚地执行了每个功能,也没有未使用的导入。然而,根据覆盖率报告,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()

【问题讨论】:

【参考方案1】:

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

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

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

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

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

$ coverage run -m unittest discover

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

【讨论】:

【参考方案2】:

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

[report]
exclude_lines =
    # Ignore imports
    from
    import

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

【讨论】:

以上是关于烧瓶测试 - 为啥覆盖不包括导入语句和装饰器?的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶装饰器:无法从 URL 传递参数

如何用 Jest 单元测试覆盖 TypeORM @Column 装饰器?

如何将装饰器应用于烧瓶中的所有蓝图 url

无效!有装饰器时不运行单元测试

我可以在包装函数之前修补 Python 装饰器吗?

我应该如何处理@jwt_required 装饰器中引发的异常? (在烧瓶-jwt-扩展中)