代码之家  ›  专栏  ›  技术社区  ›  Kimvais

如何在gunicorn中运行时从django应用程序获取覆盖率数据

  •  15
  • Kimvais  · 技术社区  · 12 年前

    如何从Django项目的视图代码(以及视图代码调用的代码)中获得代码覆盖率?

    coverage gunicorn <params> 没有显示任何被击中的线条。

    1 回复  |  直到 12 年前
        1
  •  16
  •   sk1p    12 年前

    coverage gunicorn <params> 不起作用,因为gunicorn创建工作进程,并且 coverage 模块不能跨fork工作(基本上是创建新流程)。您可以使用 the coverage API ,例如,在包含WSGI应用程序的python模块中:

    # wsgi_with_coverage.py
    import atexit
    import sys
    import coverage
    cov = coverage.coverage()
    cov.start()
    
    from wsgi import application  # adjust to python module containing your wsgi application
    
    
    def save_coverage():
        print >> sys.stderr, "saving coverage"
        cov.stop()
        cov.save()
    
    atexit.register(save_coverage)
    

    然后跑步 gunicorn -w 1 wsgi_with_coverage:application <other params> .

    问题是 atexit 如果您终止gunicorn进程,例如通过CTRL+C,则不会调用函数。但他们 被传唤 SIGHUP ,所以如果你这样做了 kill -HUP $(cat <gunicorn_pidfile_here>) ,应保存覆盖率数据(在当前目录中默认为“.coverage”)。

    一个可能的警告是,这不会适用于多个gunicorn工作人员,因为他们都会覆盖“.coverage”文件。如果你绝对需要一个以上的工人,你可以写信给 ".coverage-%d" % os.getpid() (设置文件名 via the data_file parameter to the coverage constructor )和使用 the combine() method 以合并各个测量值。

    这也应该适用于其他WSGI服务器,这取决于它们是否允许其工作进程通过 脱欧 方法