Pytests в приложении web.py не покрывает код методов - PullRequest
1 голос
/ 24 мая 2019

Прежде всего, извините, если язык не на 100% правильный или что-то не имеет смысла на 100%, я совершенно новичок в разработке веб-приложений и публикации в целом о переполнении стека.

У меня есть приложение web.py, и мне нужно проверить его функциональность с помощью pytest и сгенерировать отчет о покрытии кода с помощью pytest-cov. Я заставляю тесты работать и утверждать ответы, но когда я генерирую отчет о коде, все строки кода внутри методов раскрываются и, следовательно, получают очень низкий охват тестами (23%)

Я успешно запускаю pytest --cov в своем хранилище через cmd и получаю в результате результат покрытия. Но затем я попытался использовать 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 голосов
/ 27 мая 2019

Благодаря @hoefling я понял две вещи:

  1. При использовании Web.py, вам необходимо использовать библиотеку paste.fixture для проверки кода, библиотека requests НЕ покроет ваш код, даже если вы можете утверждать и использовать методы get / post (вот почему Я получил плохое покрытие кода в начале).

  2. При использовании pytest-cov (или cover.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 для просмотра покрытия кода).

...