您的位置:首页 > 运维架构

OpenStack中给wsgi程序写单元測试的方法

2016-03-05 12:44 337 查看
在 OpenStack 中, 针对web应用, 有三种方法来写单元測试

1) 使用webob生成模拟的request

from __future__ import print_function
import webob
import testtools

def hello_world(env, start_response):
if env['PATH_INFO'] != '/':
start_response('404 Not Found', [('Content-Type', 'text/plain')])
return ['Not Found\r\n']

start_response('200 OK', [('Content-Type', 'text/plain')])
return ['hello world!']

class WsgiAppTestCase(testtools.TestCase):

def test_hello_world_with_webob(self):
resp = webob.Request.blank('/').get_response(hello_world)

print("resp=%s" % (resp))

self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.body, "hello world!")


2) 使用webtest生成模拟的request

from __future__ import print_function
import webtest
import testtools

def hello_world(env, start_response):
if env['PATH_INFO'] != '/':
start_response('404 Not Found', [('Content-Type', 'text/plain')])
return ['Not Found\r\n']

start_response('200 OK', [('Content-Type', 'text/plain')])
return ['hello world!']

class WsgiAppTestCase(testtools.TestCase):

def test_hello_world_with_webtest(self):
app = webtest.TestApp(hello_world)
resp = app.get('/')
print("resp=%s" % (resp))

self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.body, "hello world!")


3) 启动一个wsgi server, 并发送真实的 HTTP请求

这样的办法最复杂, 须要下面步骤

调用eventlet包, 开启monkey_patch模式
使用eventlet包, 创建一个socket, 并在127.0.0.1:8080上做监听
使用eventlet包, 创建一个wsgi server

使用httplib2包, 发送一个HTTP数据包给server

from __future__ import print_function
import httplib2
import socket
import testtools

def hello_world(env, start_response):
if env['PATH_INFO'] != '/':
start_response('404 Not Found', [('Content-Type', 'text/plain')])
return ['Not Found\r\n']

start_response('200 OK', [('Content-Type', 'text/plain')])
return ['hello world!']

class WsgiAppTestCase(testtools.TestCase):

def test_hello_world_with_eventlet(self):
import eventlet
eventlet.monkey_patch(os=False)

bind_addr = ("127.0.0.1","8080")
try:
info = socket.getaddrinfo(bind_addr[0],
bind_addr[1],
socket.AF_UNSPEC,
socket.SOCK_STREAM)[0]
family = info[0]
bind_addr = info[-1]
except Exception:
family = socket.AF_INET

sock = eventlet.listen(bind_addr, family)

wsgi_kwargs = {
'func': eventlet.wsgi.server,
'sock': sock,
'site': hello_world,
'protocol': eventlet.wsgi.HttpProtocol,
'debug': False
}

server = eventlet.spawn(**wsgi_kwargs)

client = httplib2.Http()
resp, body = client.request(
"http://127.0.0.1:8080", "get", headers=None, body=None)
print("resp=%s, body=%s" % (resp, body))

self.assertEqual(resp.status, 200)
self.assertEqual(body, "hello world!")

server.kill()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: