美文网首页工具癖程序员软件测试Python专家之路
python3测试工具开发快速入门教程10接口测试简介

python3测试工具开发快速入门教程10接口测试简介

作者: python测试开发 | 来源:发表于2018-09-05 04:59 被阅读84次

    简介

    应用程序编程接口(API Application Programming Interface)是在不同进程,程序或系统之间的通信的代码。 API通常基于客户机/服务器模型。有交互的地方都有接口。最常见的跨应用交互协议是HTTP+JSON, 其次是web service(比较笨重)。最常见的后台协议有thrift、dubbo及大量的私有协议。

    • 接口测试是保证软件产品质量的最重要的软件测试之一。
    • 接口测试是进行评估的系统或组件是否正确地传递数据及互相正确的控制。
    • 接口测试通常在测试和开发团队都进行。
    • 接口测试通常在应用或功能开发的初期检验模块间调用的正确性和友好性。

    分类

    • 范围:内部、外部、第三方等
    • 协议分类: HTTP、thrift、DUBBO、FTP、SSH、TELNET等。
    • 注意数据库、文件等也是接口

    接口在近几年快速增长。Gartner 2014年的接口使用调查

    • 超过80%的声称他们已停止使用一个或多个API,因为它们BUG太多。
    • API问题的不良影响: •开发延期 •增加客户支持服务成本 •上市时间推迟 •测试延迟 •业务损失
    • 90%的受访者表示一个或多个API未能满足其期望。
    • 68%遇到了可靠性或功能问题。
    • 42%遇到过安全问题。
    • 74%遇到的性能问题。
    • 使用API遇到的最严重的完整性问题:
    图片.png 图片.png

    •61%的可靠性 •22.2%的安全 •16.7%的性能

    某公司模块之间通信有seq,以免通信乱序。seq约定64位整数,会存入mysql数据。某工程师加班误把unit64改成了unit32。系统上线运行一定时间后,出现莫名其妙丢失一些老数据。

    如果有做接口测试,针对0,2的64次方等值进行,就不会出现这种问题。功能测试由于看不到该seq,自然无法验证,当然长时间的大容量性能测试也会发现此问题。

    某公司性能测试发现大量扣费时有不正确。经常是节假日优惠时忘记扣费。该问题在功能测试漏测。也没有进行接口测试。大量这样类似的bug堆积,导致性能测试延期。

    某公司和合作方对接话单始终无法成功,后面用tcpdump抓包及查看日志发现是对方少传了一个计量单位字段。

    常见问题

    • 错误条件处理不好
    • 无用的flag
    • 缺失或者重复的功能
    • 可靠性问题,比如有时难以连接或获取响应。
    • 安全问题
    • 多线程问题
    • 性能问题,比如用户多时响应时间很高。
    • 不合适的错误码或告警。
    • 参数处理错误
    • 响应数据格式错误

    接口测试关注的内容

    • 功能:发送和返回都符合接口文档;正确地实现了功能,比如能创建或删除用户,数据库和缓存数据处理正确等。参数的边界值和等价类划分。
    • 重复:比如重复添加或删除用户,不会对数据库和缓存等造成不良影响,提示的错误码与文档一致。
    • 通信:双向通信能否正常完成。尤其要考虑丢包,延迟、2G等差网络场景。可以使用linux的防火墙及tc命令或facebook的ATC框架模拟。
    • 业务组合:比如扣费需要综合考虑闲时、忙时、节假日、集团用户优惠等各种因素。
    • 文档:包含数据顺序,数据类型,格式,甚至大小写。
    • 易用性:是否容易调用、简洁、语法一致等
    • 测试环境:是否有专门的测试环境、沙箱。比如充值测试环境。
    • 故障管理:出现故障或无调用是否知道?系统崩溃后是否可以重新启动并可靠恢复?
    • 异步:API间通常是松耦合,乱序、丢失、重复调用如何应对?
    • 接口组合:接口的水平和垂直组合。
    • 安全:传递和存储的敏感数据加密,并且难以破解。蠕虫注入等负载攻击、无效认证、未经授权的访问控制、云上问题会更多。调用方非预期滥用等。
    • 性能: 比如局域网内单次调用在50ms内完成、在1000并发的情况下最大相应时间不超过60ms、资源占用正常等。是否有峰值,过量是否会产生不良效果。资源消耗与容量等。
    • 黑白名单:非授权的主机不能访问接口
    • 异常测试: 错误码及相关信息、乱序。
    • 其他:更多需要关注的点请参考ISO/IEC 25010:2011
    图片.png

    难点

    • 参数组合、参数选择和调用顺序
    • 没有GUI,输入有一定难度
    • 验证输出难过功能测试
    • 异常处理比功能测试更复杂
    • 需要编码。

    准备

    • API的对象是谁?
    • API的使用环境
    • 要测试哪些方面
    • 测试难点是什么
    • 测试优先级
    • 正常及异常情况
    • 通过和失败的定义及预期输出和事件流
    • 交互的API有哪些

    接口测试工具

    • 商业工具: Loadrunner(本质是性能测试工具,不推荐使用)、soapui等
    • 开源或免费工具: Jmeter(本质是性能测试工具,不推荐使用)、curl、 soapui、 POSTMAN、 HTTPie等
    • 自行开发工具:Python、ruby、perl等脚本语言因为调试方便,编写相对简单成为首选。比如Python的requests、urllib、urllib2等库。


      图片.png

    选择原则:费用、难度、协议类型、序列化、后台执行(很重要)、维护成本等。


    图片.png

    cURL

    cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。

    协议支持: cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

    环境准备:Linux和MAC一般自带curl;Windows安装git bash可以使用curl

    GET、POST

       $ curl https://curl.haxx.se
       $ curl --data "key1=value1&key2=value2" http://httpbin.org/post
    

    下载文件

    $ curl https://curl.haxx.se/download/curl-7.52.1.tar.gz
    

    HTTPie

    HTTPie是使CLI与Web服务的交互尽可能人性化的命令行HTTP客户端。它提供了简单的http命令,使用简单自然的语法发送任意HTTP请求,并显示彩色输出。 HTTPie可用于测试,调试和与HTTP服务器交互。

    特点:直观的语法;格式化和色彩化的终端输出;内置 JSON 支持;支持上传表单和文件 HTTPS、代理和认证;任意请求数据;自定义头部;持久性会话;类 Wget 下载;支持 Python 2.6, 2.7 和 3.x 支持 Linux, Mac OS X 和 Windows;插件;文档。

    环境准备: # pip install --upgrade httpie

    GET、POST

       $ http https://httpie.org/
       $ http -f POST http://httpbin.org/post key1=value1 key2=values
    

    下载文件

    $ http -d https://github.com/jakubroztocil/httpie/archive/master.tar.gz
    

    参考资料
    https://httpie.org
    https://github.com/jakubroztocil/httpie

    其他工具

    HttpRequester为Firefox插件,可以通过浏览器发送HTTP请求,并展示结果。

    安装Firefox,进入工具-附加组件-扩展,安装HttpRequester插件

    图片.png

    Postman为Firefox插件,可以通过浏览器发送HTTP请求,并展示结果。
    环境准备:安装Chrome,进入工具-扩展程序-获取更多扩展程序,安装Postman插件

    图片.png

    Requests做HTTP接口测试

    环境准备:pip install requests

    GET

    import requests
    
    r = requests.get('http://httpbin.org/get')
    result = r.json()
    print(result['origin'])
    assert('.' in result['origin'])
    

    POST

    import requests
    
    payload = {'key1': 'value1', 'key2': 'value2'}
    result = requests.post("http://httpbin.org/post", data=payload)
    assert('headers' in result.json())
    assert(result.json()["url"] == http://httpbin.org/post)
    

    后记

    这里仅仅是对接口测试做了个简单介绍.
    了解接口的开发,更容易做接口模拟和接口测试.参考:使用python3和flask构建RESTful API(接口测试服务)
    接口测试测试不仅仅只有HTTP, struct,socket等模块在接口测试的应用中也相当重要.
    用loadruner, jmeter做接口是通常属于大炮打蚊子,简单的问题复杂化的不当行为.很多培训机构的老师根本没入门,喜欢这么干.
    python很方便访问其他语言,在当今多语言开发的情况下具有得天独厚的优势,ctypes,jython都比较重要.

    相关文章

      网友评论

        本文标题:python3测试工具开发快速入门教程10接口测试简介

        本文链接:https://www.haomeiwen.com/subject/iannwftx.html