加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

OpenStack中给wsgi程序写单元测试的技巧

发布时间:2021-11-20 13:46:58 所属栏目:教程 来源:互联网
导读:在 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 Fou

在 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 Foundrn']
 
    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 httplib2
import socket
import webob
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 Foundrn']
 
    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 Foundrn']
 
    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() 

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读