OpenStack中给wsgi程序写单元測试的方法
在 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()
OpenStack中给wsgi程序写单元測试的方法的更多相关文章
- 在Eclipse中使用JUnit4进行单元測试(0基础篇)
本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...
- php单元測试
你是否在程序开发的过程中遇到下面的情况:当你花了非常长的时间开发一个应用后,你觉得应该是大功告成了,可惜在调试的时候,老是不断的发现bug,并且最可怕的是,这些bug是反复出现的,你可能发现这些bug ...
- 玩转单元測试之WireMock -- Web服务模拟器
WireMock 是一个灵活的库用于 Web 服务測试,和其它測试工具不同的是.WireMock 创建一个实际的 HTTPserver来执行你的 Web 服务以方便測试. 它支持 HTTP 响应存根. ...
- SonarQube4.4+Jenkins进行代码检查实例之三-单元測试分析
作者:张克强 作者微博:张克强-敏捷307 在 <SonarQube4.4+Jenkins进行代码检查实例之中的一个> 中介绍了不编译仅仅检查的方式. 在<SonarQube4 ...
- 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例
第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...
- maven多module项目中千万不要引入其它模块的单元測试代码
本文出处:http://blog.csdn.net/chaijunkun/article/details/35796335,转载请注明. 因为本人不定期会整理相关博文,会对对应内容作出完好. 因此强烈 ...
- Android studio及eclipse中的junit单元測试
转载请标明出处:http://blog.csdn.net/nmyangmo/article/details/51179106 前一段时间有人问我单元測试的相关内容,我稍作总结做日志例如以下: 由于我接 ...
- 单元測试中 Right-BICEP 和 CORRECT
My Blog:http://www.outflush.com/ 在单元測试中,有6个总结出的值得測试的方面,这6个方面统称为 Right-BICEP.通过这6个方面的指导.能够较全然的測试出代码中的 ...
- C语言单元測试
C语言单元測试 对于敏捷开发来说,单元測试不可缺少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的C语言开发,就没有非常好的工具可供使用,能够找到的有 ...
随机推荐
- fopen(),fclose() 打开/关闭文件
打开/关闭/刷新流 1. fopen() 打开流 功能: 1)fopen()打开由 path指定的一个文件. 2)fdopen()获取一个先有的文件描述符,并使一个标准的I/O流与该描述相结合.此函数 ...
- 关于SVN版本控制器的问题与解决方法
1.SVN Working copy is too old 有个.svn的文件夹,去掉在commit试试! 2.中文字符变乱码 尽量不要用中文命名文件,因为很多软件对中文的支持还是有不好的地方.
- Jquery:jquery中的DOM操作<一>
之前两天学习了Jquery强大的选择器,今天学习了一部分Jquery对DOM的操作,下面我将把自己今天的成果分享给大家,那些菜鸟们,你们是否需要巩固之前所学? 首先需要知道,DOM操作分为3个方面:D ...
- JS传递参数时对中文进行编码和解码
var b ="啊,我要过去"; var a = encodeURI(b);//对中文编码 ...
- FpSpread添加标注
先看效果 实现: FarPoint.Web.Spread.StyleInfo Errorcss = new FarPoint.Web.Spread.StyleInfo(); Errorcss.Bord ...
- Android-隐式Intent
隐式Intent表示不具体明确要打开的activity,利用隐式intent我们可以打开其他应用. 一个隐式intent的主要组成部分: 1.action 要执行的操作. 通常以intent类的常量表 ...
- 读取并解析properties文件
public class SysConfig { private static final Properties properties = new Properties(); static{ Reso ...
- 服务器安装VMware ESXI5.5
一.VMware ESXI5.5 vSphere5.5 VIMSetup下载http://blog.sina.com.cn/s/blog_61c07ac50101gy64.html(1)VMware安 ...
- hdu 1019 n个数的最小公倍数
The least common multiple (LCM) of a set of positive integers is the smallest positive integer which ...
- phantomjs form提交
phantomjs表单提交,其实就是对DOM就行操作(获取元素),在这里实现了动态传入各种参数 不说了 直接上代码 var page = require('webpage').create(), sy ...