написать юнит-тест для приложения web.py с помощью pytest - PullRequest
0 голосов
/ 03 мая 2019

Я хотел бы написать модульный тест для приложения web.py с помощью pytest. Как вызвать сервисы web.py в pytest.

Код:

import web

urls = (
    '/', 'index'
)

app = web.application(urls, globals()) 

class index:
    def GET(self):
        return "Hello, world!"

if __name__ == "__main__":    
 app.run()

Это можно сделать с помощью модуля запросов python, когда мы запустим сервисы web.py, он запустит http://localhost:8080/. Затем импортирует модуль запросов и использует метод get, а в объекте ответа вы можете проверить результат. Это нормально.

Используя Paste и nose, мы также можем добиться этого согласно официальной документации web.py. http://webpy.org/docs/0.3/tutorial.

Есть ли какое-нибудь решение в pytest, как опция для пасты и носа.

1 Ответ

1 голос
/ 03 мая 2019

Да.На самом деле код из рецепта web.py Тестирование с помощью Paste и Nose можно использовать с py.test почти как есть, просто удалив импорт nose.tools и обновив утверждения соответствующим образом.

Ноесли вы хотите знать, как писать тесты для приложений web.py в стиле py.test, они могут выглядеть следующим образом:

from paste.fixture import TestApp

# I assume the code from the question is saved in a file named app.py,
# in the same directory as the tests. From this file I'm importing the variable 'app'
from app import app

def test_index():
    middleware = []
    test_app = TestApp(app.wsgifunc(*middleware))
    r = test_app.get('/')
    assert r.status == 200
    assert 'Hello, world!' in r

Поскольку вы добавите дополнительные тесты, вы, вероятно, проведете рефакторинг созданиятестовое приложение к устройству:

from pytest import fixture # added
from paste.fixture import TestApp
from app import app

def test_index(test_app):
    r = test_app.get('/')
    assert r.status == 200
    assert 'Hello, world!' in r

@fixture()
def test_app():
    middleware = []
    return TestApp(app.wsgifunc(*middleware))
...