web.py应用程序上的pytest不涵盖方法代码

时间:2019-05-24 13:40:30

标签: python python-3.x pytest web.py pytest-cov

首先,很抱歉,如果行话不是100%正确或某些事情没有100%的意义,那么我对Web应用程序开发和堆栈溢出一般都是陌生的。

我有一个web.py应用程序,需要使用pytest测试其功能,并使用pytest-cov生成代码覆盖率报告。我可以测试并根据响应进行断言,但是当我生成代码报告时,方法内的所有代码行都被覆盖,因此测试覆盖率非常低(23%)

我已通过cmd在我的存储库中成功运行pytest --cov,并在其中获取覆盖率结果。但是后来我尝试使用coverage run -m pytest test_Server.py并运行coverage report来获得更多细节。

在此报告中,我可以看到缺少的代码行,除了每个方法/类的定义之外,我都丢失了所有代码行。

我尝试的另一件事是pytest --cov=Server.py,然后出现错误

Coverage.py warning: Module Server.py was never imported. (module-not-imported)
Coverage.py warning: No data was collected. (no-data-collected)
WARNING: Failed to generate report: No data to report.

Server.py

import os

import web


URLS = ("/", "Index")

APP = web.application(URLS, globals())


class Index:
    """
    Just a test echo server.
    """

    def POST(self):
        web.header("Access-Control-Allow-Origin", "*")
        data = web.data()

        return data

test_Server.py


from paste.fixture import TestApp
import pytest
import os
import sys

sys.path.insert(1,(os.path.join(sys.path[0],'..'))) #adding parent path to import server script
import Server as lm
from Server import APP as app, Index

host = "localHost:9999"


class TestRig():
    def test_server_setup(self):
        middleware = []
        testApp = TestApp(app.wsgifunc(*middleware))
        try:
            r = testApp.post("http://%s/" %host)
            print ("request:", r.status)
            assert r.status ==  200

        except TypeError:
            print ("Request failed. Status:"+ r.status)
            raise

这是我当前正在运行的程序的非常简化的版本,我设法以某种方式使测试正常工作并正确确定响应。

我希望测试中包含方法内部的代码,但是实际输出告诉我仅包含方法的定义,而没有其他内容。

1 个答案:

答案 0 :(得分:0)

由于@hoefling,我弄清楚了两件事:

  1. 使用Web.py时,您需要使用paste.fixture库来测试代码,requests库不会覆盖您的代码,即使您可以断言并使用get / post方法(这就是为什么一开始我会得到如此糟糕的代码覆盖的原因)。

  2. 使用pytest-cov(或coverage.py)时,请像这样进行调用:pytest --cov=name_of_your_script_to_cover --cov-report=term-missing --cov-report=html避免出现Failed to generate report: No data to report.错误(并获得一个漂亮的HTML报告来查看您的代码覆盖率)。