我在web py框架中有一个自动化测试的问题。我正在通过艰难的方式学习python的最后一个练习。在本练习中,我们创建了一个运行房间地图的web应用程序"engine“。我希望能够自动测试每个房间,但有一个问题,那就是引擎依赖于前一个房间来决定下一个房间(和用户输入)。
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")此类处理对/game的GET和POST请求
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")在我的自动化测试中,我使用了两个东西:首先,我使用了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)我们可以将变量作为字典传递给app.request接口中的关键字参数数据,以修改web.input()。
我的问题是:在我的自动测试模块中,我们如何“传递”一个值来覆盖会话中初始化器字典中的room值:
session = web.session.Session(app, store, initializer={"room":None})在app模块中,可以通过设置
session.room = map.START然后使用以下命令更新session.room:
if session.room and form.action:
session.room = session.room.go(form.action)感谢您花时间阅读这篇文章,如果您有任何见解,我们将不胜感激!
发布于 2015-08-08 10:09:59
好了,我终于找到了!这里的主要问题是,每次我通过app.request发出http请求时,它都会给我一个新的会话ID。
多亏了这篇文章,我找到了一个窍门:
How to initialize session data in automated test? (python 2.7, webpy, nosetests)
是记录请求的会话ID,以便通过将其传递给请求中的headers关键字参数在自动测试中重用该ID!
使用此函数记录会话ID (我将其放置在test/tools.py中的post中):
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')我希望这对将来遇到同样问题的程序员有所帮助!
https://stackoverflow.com/questions/31867958
复制相似问题