用于测试环境的http服务器

spoof的Python项目详细描述


https://img.shields.io/pypi/v/spoof.svghttps://img.shields.io/pypi/wheel/spoof.svghttps://img.shields.io/pypi/pyversions/spoof.svghttps://img.shields.io/github/license/lexsca/spoof.svghttps://codecov.io/gh/lexsca/spoof/branch/master/graph/badge.svg

spoof是一个用python编写的http服务器,用于测试环境中 模拟底层调用不是一个选项,或者在需要 在套接字上侦听的实际http服务器。你好,功能测试!

与典型的http服务器不同,其中特定的方法和路径组合是 预先配置,spoof接受all请求并发送队列 响应,如果队列为空则为默认响应,如果没有则为错误响应 已配置默认响应。请求可以在发送响应后进行检查。

兼容性

Spoof在Python2.7、3.4到3.7上运行,并且没有外部依赖项。

多个欺骗http服务器可以同时运行,默认情况下,端口 number是下一个可用的未使用端口。安装了openssl后,spoof可以 还提供一个ssl/tls http服务器。完全支持IPv6。

快速启动

将多个响应排队、验证内容和请求路径:

importrequestsimportspoofwithspoof.HTTPServer()ashttpd:responses=[[200,[('Content-Type','application/json')],'{"id": 1111}'],[200,[('Content-Type','application/json')],'{"id": 2222}'],]httpd.queueResponse(*responses)httpd.defaultResponse=[404,[],'Not found']assertrequests.get(httpd.url+'/path').json()=={'id':1111}assertrequests.get(httpd.url+'/alt/path').json()=={'id':2222}assertrequests.get(httpd.url+'/oops').status_code==404assert[r.pathforrinhttpd.requests]==['/path','/alt/path','/oops']

将回调设置为默认响应:

importrequestsimportspoofwithspoof.HTTPServer()ashttpd:httpd.defaultResponse=lambdarequest:[200,[],request.path]assertrequests.get(httpd.url+'/alt').content==b'/alt'

使用ssl测试排队响应:

importrequestsimportspoofwithspoof.SelfSignedSSLContext()asselfSigned:withspoof.HTTPServer(sslContext=selfSigned.sslContext)ashttpd:httpd.queueResponse([200,[],'No self-signed cert warning!'])response=requests.get(httpd.url+'/path',verify=selfSigned.certFile)asserthttpd.requests[-1].method=='GET'asserthttpd.requests[-1].path=='/path'assertresponse.content==b'No self-signed cert warning!'

SSL警告

有些图书馆喜欢 Requests会抱怨的 大声或拒绝使用自签名ssl连接到http服务器 证书。处理此问题的首选方法是使用验证 属性在请求会话中信任证书:

importrequestsimportspoofcert,key=spoof.SSLContext.createSelfSignedCert()sslContext=spoof.SSLContext.fromCertChain(cert,key)httpd=spoof.HTTPServer(sslContext=sslContext)httpd.queueResponse([200,[],'OK'])httpd.start()# trust self-signed certificatesession=requests.Session()session.verify=certresponse=session.get(httpd.url+'/uri/path')print(response.status_code,response.content)httpd.stop()

如果验证证书不是一个选项,则另一种解决方法 这是monkeypatch测试代码中的请求库。例如:

importrequestscertVerify=requests.adapters.HTTPAdapter.cert_verifydefcertNoVerify(self,conn,url,verify,cert):returncertVerify(self,conn,url,False,cert)requests.adapters.HTTPAdapter.cert_verify=certNoVerifyrequests.packages.urllib3.disable_warnings()

另一个常见的例子是直接利用ssl的库。单向 要解决此问题,请将默认上下文全局设置为 未经证实。例如:

importssltry:createUnverifiedHttpsContext=ssl._create_unverified_contextexceptAttributeError:# ignore if ssl context not verified by defaultpasselse:ssl._create_default_https_context=createUnverifiedHttpsContext

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android首选项相同getPreference()值的不同数据   字符串如何在Java中连接两个列表中的单词   安卓 Java Socket编程:检测客户端和服务器是否连接   使用JTextField的java无法将值转换为int   在java中,如何在不通过超级构造函数设置的情况下将消息设置为自定义异常类   用于标识属性值的java正则表达式模式   Android中的java不可见谷歌地图   java正确取消启动ExecutorService的JavaFX任务   在非活动java类中使用安卓的融合位置提供程序,并在主活动类中获取经度和纬度   spring为什么我的大摇大摆不能用springboot在java中工作?   java JSF(2.2)ViewScope在Weblogic 12.2.1.2和JDK 8上使用Spring 4.3.7(在Mac OS和Docker Oracle Linux环境上)   java如何用一个按钮提高计时器速度   java如何检查字符是否是元音?   注册表引用了不存在的Java运行时环境安装或运行时已损坏错误   来自ResultSet java的mysql getDateTime   maven LanguageTool Java API是否具有“无用”依赖关系?   twitter api身份验证的java Trycatch问题   java在Apache Struts 1.1中是否可以显式白名单?   安卓致命异常:主java。lang.RuntimeException:被问及未知片段