У меня проблема с автоматическим тестированием в веб-среде 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)
Спасибо, что нашли время, чтобы прочитать это, и будем благодарны за любые идеи!