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

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()

        

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115795.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Spring概述

    部分转载来自:w3cschool一、程序间的依赖关系1、程序的耦合:调用者或被调用者的依赖关系2、耦合的缺点:      1、维护不方便      

    2021年11月30日
    35
  • 详解数据仓库和数据库的区别「建议收藏」

    详解数据仓库和数据库的区别「建议收藏」一、数据仓库什么是数据仓库?数据仓库(DataWarehouse),可简写为DW或DWH,数据仓库,是为了企业所有级别的决策制定计划过程,提供所有类型数据类型的战略集合。它出于分析性报告和决策支持的目的而创建。为需要业务智能的企业,为需要指导业务流程改进、监视时间,成本,质量以及控制等;数据仓库能干什么?(举几个栗子)年度销售目标的制定,需要根据以往的历史报表进行决策,不能随便…

    2022年10月21日
    0
  • 了解的近义词_draw calls

    了解的近义词_draw calls一、什么是DrawCallDrawCall的含义就是CPU调用图像编程接口,以命令GPU进行渲染的操作。CPU和GPU通过使用一个命令缓冲区实现并行工作。命令缓冲区包含一个命令队列,CPU向其中添加命令,GPU从中读取命令,添加和读取是相互独立的,因此使得CPU和GPU可以独立工作。命令缓冲区中的命令有很多种类,DrawCall就是其中一种。二、为什么Dr…

    2022年9月19日
    0
  • 电脑屏幕录制gif_windows录屏快捷键

    电脑屏幕录制gif_windows录屏快捷键有读者在后台问,有没有好用的Windows电脑制作gif工具,那必须有,今天软件工具侠给大家推荐一款非常好用的录屏制作gif软件。主页主页第一个选项就是录屏制作gif:可以设置每秒录制的帧数(1-60),默认是每秒15帧,也可以设置录屏的宽高,也可以直接拖动录屏框调整大小。设置页面:也可以设置捕获屏幕的方式:手动,通过按“捕获”按钮或等效的屏幕快捷键来手动捕获每一帧用户交互,每次单击或键…

    2022年9月16日
    0
  • android线程间通信的几种方法_Android线程间通信机制

    android线程间通信的几种方法_Android线程间通信机制讲解Handler机制的博文很多,我也看了很多,但说实话,在我对Handler几乎不怎么了解的情况下,每一篇文章我都没太看懂,看完之后脑子里还是充满了疑问。究其原因,是因为几乎每一篇文章一上来就开始深入Handler源码,使得在一些宏观的问题上还是充满疑问,如果你从来没接触过Handler,对一些基础的问题还充满疑问,那深入源码去探究根源肯定会有些吃力。下面,我就从一个初学者思考的角度,来讲一讲H…

    2022年10月7日
    0
  • 内核NFS-V4部署服务,挂载,ACL使用

    内核NFS-V4部署服务,挂载,ACL使用

    2022年4月2日
    165

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号