Python3.xWSGi测试框架
鉴于webtest似乎没有3.x版本(或任何开发计划),是否有任何解决方案可用于WSGI应用程序的自动化系统测试?我了解单元测试中的单元测试——我现在更感兴趣的是整个系统测试Python3.xWSGi测试框架,python,testing,python-3.x,integration-testing,wsgi,Python,Testing,Python 3.x,Integration Testing,Wsgi,鉴于webtest似乎没有3.x版本(或任何开发计划),是否有任何解决方案可用于WSGI应用程序的自动化系统测试?我了解单元测试中的单元测试——我现在更感兴趣的是整个系统测试 我不是在寻找帮助开发应用程序的工具,只是测试一下而已。如果其他人遇到这个问题,我最终自己编写了一个解决方案这里有一个我使用的非常简单的类-我只是从WSGIBaseTest继承而不是TestCase,并获得一个方法self.request(),我可以将请求传递到该方法中它存储cookies,并在以后的请求中自动将它们发送到应
我不是在寻找帮助开发应用程序的工具,只是测试一下而已。如果其他人遇到这个问题,我最终自己编写了一个解决方案
这里有一个我使用的非常简单的类-我只是从
WSGIBaseTest
继承而不是TestCase
,并获得一个方法self.request()
,我可以将请求传递到该方法中它存储
cookies
,并在以后的请求中自动将它们发送到应用程序中(直到调用self.new\u session()
)
只是想让你知道现在的情况。webtest依赖于webob。目前正在webob上进行工作,以使其在Python3上工作。想象一下,当webob的工作完成后,webtest应该只在Python3上工作,或者应该只需要很少的努力。所以说“或任何开发计划”都不完全正确,但现在你知道了情况。这很好。这可能是WebTestWiki的好信息。我发现的唯一一个部分相关的帖子是,其中有人提到了Python 3的支持,但从来没有收到回复。这个问题已经问了几年了,同时事情可能已经改变了。不需要指出任何变更日志或其他内容,我只需告诉您我正在将
webtest
成功地用于python3.4应用程序(基于Falcon
框架)。
import unittest
from wsgiref import util
import io
class WSGIBaseTest(unittest.TestCase):
'''Base class for unit-tests. Provides up a simple interface to make requests
as though they came through a wsgi interface from a user.'''
def setUp(self):
'''Set up a fresh testing environment before each test.'''
self.cookies = []
def request(self, application, url, post_data = None):
'''Hand a request to the application as if sent by a client.
@param application: The callable wsgi application to test.
@param url: The URL to make the request against.
@param post_data: A string.'''
self.response_started = False
temp = io.StringIO(post)
environ = {
'PATH_INFO': url,
'REQUEST_METHOD': 'POST' if post_data else 'GET',
'CONTENT_LENGTH': len(post),
'wsgi.input': temp,
}
util.setup_testing_defaults(environ)
if self.cookies:
environ['HTTP_COOKIE'] = ';'.join(self.cookies)
self.response = ''
for ret in application(environ, self._start_response):
assert self.response_started
self.response += str(ret)
temp.close()
return response
def _start_response(self, status, headers):
'''A callback passed into the application, to simulate a wsgi
environment.
@param status: The response status of the application ("200", "404", etc)
@param headers: Any headers to begin the response with.
'''
assert not self.response_started
self.response_started = True
self.status = status
self.headers = headers
for header in headers:
# Parse out any cookies and save them to send with later requests.
if header[0] == 'Set-Cookie':
var = header[1].split(';', 1)
if len(var) > 1 and var[1][0:9] == ' Max-Age=':
if int(var[1][9:]) > 0:
# An approximation, since our cookies never expire unless
# explicitly deleted (by setting Max-Age=0).
self.cookies.append(var[0])
else:
index = self.cookies.index(var[0])
self.cookies.pop(index)
def new_session(self):
'''Start a new session (or pretend to be a different user) by deleting
all current cookies.'''
self.cookies = []