автоматическое тестирование python web py

У меня проблема с автоматическим тестированием в веб-среде py. Я прохожу последнее упражнение по изучению Python на трудном пути. В этом упражнении мы создаем «движок» веб-приложения, который запускает карту комнат. Я хочу иметь возможность автоматизировать тестирование каждой отдельной комнаты, но есть одна проблема: движок зависит от предыдущей комнаты, чтобы решить, в какую комнату перейти в следующую (и пользовательский ввод).

if web.config.get("_session") is None:
    store = web.session.DiskStore("sessions")
    session = web.session.Session(app, store, initializer={"room":None})
    web.config._session = session
else:
    session = web.config._session

Этот класс обрабатывает запрос GET, отправленный на /

class Index(object):
    def GET(self):
        session.room = map.START
        web.seeother("/game")

Этот класс обрабатывает запросы GET и POST к / game.

class GameEngine(object):
    def GET(self):
        if session.room:
            return render.show_room(room=session.room)
        else:
            return render.you_died()
    def POST(self):
        form = web.input(action=None)
        if session.room and form.action:
            session.room = session.room.go(form.action)

        web.seeother("/game")

В своем автоматическом тестировании я использую две вещи: сначала я использую API app.request:

app.request(localpart='/', method='GET',data=None, 
            host='0.0.0.0:8080', headers=None, https=False)

создать объект ответа, например:

resp = app.request("/game", method = "GET")

Во-вторых, я передаю объект resp этой функции, чтобы проверить некоторые вещи:

from nose.tools import *
import re

def assert_response(resp, contains=None, matches=None, headers=None,
    status="200"):

    assert status in resp.status, "Expected response %r not in %r" %  
     (status, resp.status)

    if status == "200":
        assert resp.data, "Response data is empty"
    if contains:
        assert contains in resp.data, "Response does not contain %r" %  
        contains
    if matches:
        reg = re.compile(matches)
        assert reg.matces(resp.data), "Response does not match %r" % 
          matches
    if headers:
        assert_equal(resp.headers, headers)

Мы можем передать переменные в качестве словаря в данные аргумента ключевого слова в API app.request, чтобы изменить web.input ().

у меня вопрос: как в моем автоматическом тестовом модуле «передать» значение, которое перезаписывает значение комнаты в словаре инициализатора в нашем сеансе:

session = web.session.Session(app, store, initializer={"room":None})

В модуле приложения это делается путем установки

session.room = map.START

а затем обновления session.room, используя:

if session.room and form.action:
    session.room = session.room.go(form.action)

Спасибо, что нашли время, чтобы прочитать это, и будем благодарны за любые идеи!


person Zafer Khourdaji    schedule 07.08.2015    source источник


Ответы (1)


Хорошо, я наконец нашел это! Основная проблема заключалась в том, что каждый раз, когда я делаю http-запрос через app.request, он дает мне новый идентификатор сеанса.

Уловка, которую я нашел благодаря этой публикации:

Как инициализировать данные сеанса в автоматизированный тест? (python 2.7, webpy, тесты на нос)

заключается в том, чтобы записать идентификатор сеанса запроса для повторного использования этого идентификатора в моих автоматических тестах, передав его в аргумент ключевого слова заголовков в запросе!

запишите идентификатор сеанса с помощью этой функции (которую я разместил, как предлагалось в сообщении, в tests / tools.py):

def get_session_id(resp):
    cookies_str = resp.headers['Set-Cookie']
    if cookies_str:
        for kv in cookies_str.split(';'):
            if 'webpy_session_id=' in kv:
                return kv

то в автоматических тестах что-то вроде:

def test_session():
    resp = app.request('/')
    session_id = get_session_id(resp)

    resp1 = app.request('/game', headers={'Cookie':session_id})
    assert_response(resp1, status='200', contains='Central Corridor')

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

person Zafer Khourdaji    schedule 08.08.2015