【问题标题】: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()

【问题讨论】:

    标签: python testing flask coverage.py


    【解决方案1】:

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

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

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

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

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

    $ coverage run -m unittest discover
    

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

    【讨论】:

      【解决方案2】:

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

      [report]
      exclude_lines =
          # Ignore imports
          from
          import
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        相关资源
        最近更新 更多