OpenStack中给wsgi程序写单元測试的方法
2016-03-05 12:44
337 查看
在 OpenStack 中, 针对web应用, 有三种方法来写单元測试
1) 使用webob生成模拟的request
2) 使用webtest生成模拟的request
3) 启动一个wsgi server, 并发送真实的 HTTP请求
这样的办法最复杂, 须要下面步骤
调用eventlet包, 开启monkey_patch模式
使用eventlet包, 创建一个socket, 并在127.0.0.1:8080上做监听
使用eventlet包, 创建一个wsgi server
使用httplib2包, 发送一个HTTP数据包给server
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()
相关文章推荐
- “Linux内核分析”实验报告二
- Linux14.04 下安装Swift
- Visual Studio 2015配置opencv开发环境
- Nginx+uwsgi+flask部署
- centos下cp -r 命令可拷贝文件夹
- linux学习之c语言swap函数
- 关于自适应网站的总结
- uva714 - Copying Books
- 查看linux下mysql版本
- 解决Linux 下 root用户删除文件提示:Operation not permitted
- 常用的linux命令
- Redhat Linux上mysql安装-binary package安装
- Apache Maven 入门篇
- openstack通用技术介绍
- centos配置虚拟主机多网站
- 学习linux决心书
- Linux系统中tr命令的基本使用教程
- Linux内核分析第二周总结
- 笔记一 VS2010+opencv 2.4.9环境搭建
- Redhat Linux上mysql安装-RPM安装