首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python web py自动化测试

python web py自动化测试
EN

Stack Overflow用户
提问于 2015-08-07 08:44:05
回答 1查看 144关注 0票数 0

我在web py框架中有一个自动化测试的问题。我正在通过艰难的方式学习python的最后一个练习。在本练习中,我们创建了一个运行房间地图的web应用程序"engine“。我希望能够自动测试每个房间,但有一个问题,那就是引擎依赖于前一个房间来决定下一个房间(和用户输入)。

代码语言:javascript
复制
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请求

代码语言:javascript
复制
class Index(object):
    def GET(self):
        session.room = map.START
        web.seeother("/game")

此类处理对/game的GET和POST请求

代码语言:javascript
复制
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应用编程接口:

代码语言:javascript
复制
app.request(localpart='/', method='GET',data=None, 
            host='0.0.0.0:8080', headers=None, https=False)

创建一个响应对象,如下所示:

代码语言:javascript
复制
resp = app.request("/game", method = "GET")

其次,我将resp对象传递给此函数以检查某些内容:

代码语言:javascript
复制
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值:

代码语言:javascript
复制
session = web.session.Session(app, store, initializer={"room":None})

在app模块中,可以通过设置

代码语言:javascript
复制
session.room = map.START

然后使用以下命令更新session.room:

代码语言:javascript
复制
if session.room and form.action:
    session.room = session.room.go(form.action)

感谢您花时间阅读这篇文章,如果您有任何见解,我们将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 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中):

代码语言:javascript
复制
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

然后在自动化测试中,如下所示:

代码语言:javascript
复制
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')

我希望这对将来遇到同样问题的程序员有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31867958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档