Pytests в приложении web.py не охватывает код методов

Прежде всего, извините, если язык не на 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.

Сервер.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

Это очень упрощенная версия того, что я сейчас использую, и так или иначе мне удается заставить тесты работать и правильно утверждать ответы.

Я ожидаю, что код внутри методов будет покрыт тестами, но фактический вывод говорит мне, что покрыто только определение метода и ничего больше.


person ACleCas    schedule 24.05.2019    source источник
comment
Вы должны пройти --cov=Server. --cov принимает полные имена, а не файлы. --cov=Server.py будет означать поиск пакета Server и внутри него модуля py (файл py.py), которого у вас явно нет.   -  person hoefling    schedule 24.05.2019
comment
Спасибо за исправление! Попробовал то, что вы предложили, и я больше не получаю данных для отчета. Тем не менее, основная проблема сохраняется: покрытие кода составляет 23%, и код внутри методов в Server.py не покрыт :/   -  person ACleCas    schedule 24.05.2019
comment
Хм, я скопировал код из вашего вопроса и выполнил тест через pytest --cov=Server, покрытие на 100%. Пришлось добавить заголовок Content-Type, чтобы удовлетворить paste, но это не должно быть проблемой. Таким образом, с кодом, который вы разместили, нет проблем — попробуйте сократить свое приложение до минимально воспроизводимого примера и включите код в вашем вопросе.   -  person hoefling    schedule 24.05.2019
comment
Кстати, pytest-cov также может создавать отчеты, попробуйте, например. pytest --cov=Server --cov-report=term-missing --cov-report=html, это распечатает таблицу покрытия в терминале и создаст файл отчета в формате HTML.   -  person hoefling    schedule 24.05.2019
comment
Спасибо за чаевые! На самом деле я запустил его внутри методов и могу лучше видеть все строки, покрытые файлом HTML-отчета :) Мой следующий шаг - попытаться загрузить файлы для другого метода, которому нужен JSON... Но это не связано с этой проблемой больше. Я не знаю, могу ли я проголосовать за ваш ответ как за правильный, но это определенно так. Спасибо за помощь!   -  person ACleCas    schedule 27.05.2019


Ответы (1)


Благодаря @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-отчет для просмотра покрытия вашего кода).

person ACleCas    schedule 27.05.2019