精华内容
下载资源
问答
  • 接口自动化测试工具

    2018-12-13 20:01:53
    学习接口自动化文档,提供C++接口自动化知识,学习接口自动化文档,提供C++接口自动化知识
  • soapui 自动化测试工具,目前市场上测试接口的最好的工具,本工具非标准版
  • 当你准备给自己所负责的项目搭建接口自动化测试时,面对市面上多种多样的工具或者框架,是否遇到不知该选哪个工具的困惑?本片文章通过对时下使用广泛的接口自动化工具进行对比来介绍自动化工具或者框架选择策略,...

    当你准备给自己所负责的项目搭建接口自动化测试时,面对市面上多种多样的工具或者框架,是否遇到不知该选哪个工具的困惑?本片文章通过对时下使用广泛的接口自动化工具进行对比来介绍自动化工具或者框架选择策略,协助处于困惑中的小伙伴选择适合项目的接口自动化工具。

    在讲工具选择策略前,我们先思考一下这三个问题

    搭建自动化的价值是什么?

    覆盖接口的哪些内容?

    如何降低接口自动化测试维护成本?

    对于以上三个问题,你有自己的答案了么?以下是笔者对以上三个问题的思考。

    搭建自动化的价值

    搭建自动化的目的是覆盖全面且能快速反馈被测应用质量。想像一下对于一个功能复杂的系统,开发在上线前刚刚修复了几个bug,测试问开发影响范围,开发可能会说“不好说,都测试一遍吧”。如果你遇到这样的答案是不是要抓狂,实际项目中这样的情况不仅存在,而且可能还比较频繁。此时如果有个覆盖全面的自动化脚本该多好,让自动化脚本跑起来,茶水间喝杯咖啡回来就知道质量结果了。

    接口覆盖策略

    1. 系统自己使用的接口覆盖测试场景而不是单个接口的response。

    比如一个更新用户个人信息的接口,试想一下如果是手动测试,你会如何做?肯定是在页面上更新某个信息或某几个信息,然后查看对应的数据字段是否更新或者页面是否显示新的内容。你会单独查看接口的response是否和需求文档一致么?大部分情况下都不会。所以在搭建接口自动化测试时建议覆盖测试场景以此保证业务功能是否正确。

    2. 对外提供的接口重点检查接口的response body和response schema。

    有些小伙伴读到这里是否会犯迷糊,第二点似乎和第一点矛盾了呢?实际不矛盾,对于对外的接口,因为接口使用方是第三方,对于第三方在哪些业务场景下如何使用该接口不是接口提供方的测试范畴,故接口提供方只需保证接口返回的内容与格式与之前定义的一致即可。

    3. 只要提供接口的地方就尝试进行覆盖,保证接口测试足够全面。

    降低维护成本策略

    1.管理测试数据,保证测试case独立性。即每一个测试案例需要的测试数据在案例运行前自动准备,案例运行完后自动清理。任何用例的执行不依赖其他用例是否执行成功。

    2.管理配置信息,保证多环境运行无障碍。即当测试环境切换后,能通过环境变量简单快速切换到所测环境,无需任何手动介入,相同的一套测试脚本DEV环境能运行,切换到UAT环境同样能全部正常运行。

    3.已实现的自动化脚本能快速重用。例如一个系统有3个角色,已经完成了“初始化用户为系统任意角色”的测试脚本,假设此时新增了一个功能,此功能只有系统某个角色才能操作,那么在准备测试数据时就可以调用之前的代码快速初始化所需用户。

    4.清晰的代码分层。让新上项目的人也能快速上手开始自动化脚本编写。

    5.默认等待机制,解决数据延迟问题。例如调用一个接口到数据全部落入数据库需要时间,如果没有默认等待机制,调用接口后立刻查询数据库数据可能出现错误假象。对于微服务,这类问题可能更突出。

    6.Retry机制,对于部分不稳定的接口,适当的retry机制可以保证自动化用例成功率。

    7.管理接口reqeust body,接口的request body修改频繁,要尽量引入其他工具协助更好的维护接口的request body,否则接口body的任何修改可能都会引起自动化的大面积修改。

    8.集成到CICD平台,定时运行持续优化。

    9.详细的日志打印,流水线上清晰知道错误原因。

    10.测试工具是否支持脚本语言,是否有完善的帮助文档,github上start数量,是否还在持续维护。

    在思考和回答了上面的问题后我们再来看目前市面上使用较广泛的能实现接口自动化的工具或者语言。

    接口测试工具对比

    Postman/SoapUI/Jmeter:

    这三个工具放在一起的原因是都属于配置类工具,简单易上手,利用该工具可以很快调通一个接口,后续再学习一下如何配置测试集、如何进行断言、如何配置全局变量等,基本就可以实现接口的半自动化了。但如果要搭建覆盖全面且较低维护成本的接口自动化脚本,有太多理由否定采用postman或者soapUI。比如:无法连接数据库准备测试数据,即无法实施“降低维护成本”中第一条策略,一旦测试环境中测试数据遭破坏,case就会运行失败。再比如接口的request body都是写死在用例里面,即无法实施“降低维护成本”的第七条策略,开发修改任何一个接口,都可能需要修改多个测试用例的reqeust body。

    Groovy+Rest-Assured

    Rest-assured是一款测试REST api的自动化测试工具,除支持接口调用外,还提供了接口校验、日志打印、错误显示等功能,非常适合接口自动化脚本。Rest-assured配合脚本语言groovy前面提到的10点降低维护成本策略都能实施。例如利用脚本语言groovy可以方便连接数据库准备测试数据,可以用csv文件管理测试数据,yaml文件管理配置信息,轻松对接口返回的json格式或者xml格式数据进行解析处理等等。

    Java+Httpclient

    Httpclient是apache common下的一个子项目,引入该jar包即可完成接口调用,相比与rest-assured这类专门的接口测试工具,httpClient不提供接口response校验、接口request、response打印、错误信息显示等功能,这些都需要自己单独写代码实现。

    Python+Request

    Request是python下的一个包,引入该包后即可完成接口调用,和httpclient一样该包仅仅完成接口调用,如果需要接口response的校验、日志打印等都需要自己单独写代码实现。相比与java+httpClient组合,这个组合使用了脚本语言python,就实现接口测试而言,学习python的成本要远低于学习java的成本。相比groovy+rest-assured组合,python语言官网没有提供配套的BDD一类的框架,所以选用该组合还需要配合其他测试框架一起服用才行。

    Python+Pyresttest

    Pyresttest是一款rest api测试工具,和groovy+rest-assured的组合很像,都选用脚本语言作为编程语言,选用专门的接口测试框架调用接口。Pyresttest在github上的start是900+,rest-asssured在github上的star是4000+,要相信群众的眼睛是雪亮的,所以一定要选择,那肯定还是选择groovy+rest-assured组合。当然如果你一定要用python语言,那可以深入研究下pyresttest是否可实施前面“降低维护成本”的十个策略,如果可以,那选它也是ok的。

    结束语

    对比上述工具旨在告诉大家在选择工具或者框架时,首先需要明确你的项目需要完成怎样的自动化,然后再查看市面上的工具,看看这些工具以及支持的语言是否满足你的需求,只要有了明确的目标,选择就不再困难。比如要搭建覆盖全面且较低维护成本的接口自动化,选择工具时首先需要考虑是否能轻松获取到接口response body和校验response schema,另外还需考虑能否实施“降低维护成本”中提到的10个策略,如果都能实施,那就用它了。

    如果对如何使用rest-assured+groovy编写接口自动化脚本感兴趣的小伙伴可以订阅gitchat上“接口自动化实战” 专栏约。https://gitbook.cn/gitchat/column/5dbbe297e29af65d1d01b8fc

    展开全文
  • 个人觉得这个工具比任何自动化测试框架都好使,使用关键字和数据双驱动,不需要写一行代码,无需维护脚本,只需要维护用例数据。Web元素只需要在Chrome中复制xPath即可,定位非常高效。 工具安全无木马,目的只为...
  • 2019 Python接口自动化测试框架实战开发(一)

    万次阅读 多人点赞 2019-06-28 15:55:25
    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!...整个项目分为四个部分:接口基础丶接口开发丶Unittest与接口测试结合以及接口自动化框架从设计到开发 接口基础包括:H...

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

    项目源码下载

    目录

    一丶叙述

    二丶接口基础知识

    三丶接口测试工具

    四丶Fiddler的使用

    五丶unittest使用

    六丶mock服务入门到实战

    七丶接口自动化框架设计到开发


    一丶叙述

    1.项目介绍

    整个项目分为四个部分:接口基础丶接口开发丶Unittest与接口测试结合以及接口自动化框架从设计到开发

    接口基础包括:HTTP接口 / 常见接口 / 接口工具 / 接口基础知识

    接口开发:通过Django来开发get/post接口

    Unittest与接口测试结合:unittest应用 / 断言 / requests引入 / HTMLTestRunner / case的管理

    接口自动化框架从设计到开发:如何设计框架 / 封装工具类 / 重构基类 / 错误调试 / 结果收集以及处理 / 解决数据依赖 / 结果统计及报告发送

    项目整体思路:通过对接口数据文档的读写操作,来获取文档中case的所有数据,然后通过requests模块来发送请求获取的响应数据,通过返回的响应数据中的某个标志性字段的值来判断是否测试成功或者失败,最后将测试的结果数据写入到测试文档或者是html页面又或者是将结果以邮件的形式发送到指定邮箱,这是整个大框架思路,要完成这一系列自动化的测试框架,则需要有一定的python代码基础,博主这里只是粗略的叙述了思路,有很多地方就不细说了比如数据依赖等就请大家慢慢的阅读吧

    2.测试报告效果预览

    • unittest和HTMLTestRunner结合生成报告(新版本的)

    •  unittest和HTMLTestRunner结合生成报告(经典版本的)

    •  测试报告邮件通知

    二丶接口基础知识

    1.什么是接口

    连接前后端以及移动端,通俗来说就是前端和后端之间的桥梁,比如网站需要去调用银行丶微信及支付宝的接口来完成业务需求

    2.接口的种类

    外部接口和内部接口;内部接口又分为上层服务与下层服务以及同级服务

    3.接口的分类

    请求方式:post丶get丶delete丶put

    4.为什么要做接口测试

    原因:不同端的工作进度肯定是不一致的,那么就需要对最开始开发出来的接口进行测试;对于项目来说缩短项目周期,提高开发效率以及提高系统的健壮性

    5.接口测试流程

    需求讨论——需求评审——场景设计——用例设计——数据准备——执行

    6.为什么要设计测试用例

    • 理清思路,避免侧漏
    • 提高测试效率
    • 跟进测试进度
    • 告诉领导做过
    • 跟进重复重复性工作

    7.用例设计分类

    功能用例测试:测试功能是否正常丶测试功能是否按照接口文档实现

    逻辑用例设计:是否存在依赖业务,例如有些操作是需要用户登录成功的状态下才能进行的操作

    异常测试用例设计:参数异常以及数据异常;参数异常包括关键字参数丶参数为空丶多参数丶少参数丶错误参数,数据异常包括关键字数据丶数据为空丶长度不一致丶错误数据

    安全测试用例设计:cookie丶header丶唯一识别码

    三丶接口测试工具

    1.接口测试工具分类

    • 抓取接口工具

    httpwatch:集成于IE和Firefox浏览器中,在其他浏览器中无法使用,查看数据也比较麻烦

    wireshark:只要是经过电脑的所有请求都会去抓取,导致数据量比较庞大,看数据也比较麻烦

    fiddler:轻量级抓包工具,功能比较全,只会记录http请求不会像wireshark工具记录tcp和udp等请求

    • 测试接口工具:

    loadrunner:不仅仅是性能测试工具,由于该工具几乎都是基于http请求,所以也可以用来测试接口

    fiddler:它除了可以抓包还可以向接口发送各种请求

    soapui:接口和自动化测试工具,功能也比较强大

    jmeter:跟loadrunner一样不仅仅是做性能测试,也可以对接口进行测试

    postman:谷歌旗下的接口测试工具

    四丶Fiddler的使用

    1.抓取不同类型接口数据(http以及https)

    • 查看windows本机的IP

    • 配置fiddler

    • 需要保证要抓取的手机与电脑保持同一网段,博主这里使用逍遥模拟器模拟安卓手机,修改手机网络

    • 在高级选项中设置手动代理IP为windows本机IP地址,端口设置与fiddler抓取端口保持一致

    • 再安卓手机中打开知乎app,抓取知乎app的http服务的数据

    • 现在的移动app都是基于https请求的,所以需要在fiddler中设置https请求

    • 然后在手机端浏览器中访问windows电脑IP+port,进行网络安全证书的下载安装

    • 点击下面一个下载证书

    • 然后设置密码即可

    • 证书安装成功后,重新打开知乎app,则成功抓取https请求的数据

    • 在知乎app中随便对一文章进行评论,抓取该app评论接口

    2.数据模拟以及过滤规则

    • 如下图进行选择要过滤的hosts类型,并在输入框添加要过滤的hosts即可

    • 对知乎上的一篇文章进行回答后,获取https://api.zhihu.com/answers接口,查看发送的post请求数据中的content字段内容也就是博主回答的内容

    • 然后进行数据模拟,也就是点击fiddler软件上的replay对https://api.zhihu.com/answers接口进行post请求数据的而二次发送,由于知乎这边设定对一个问题只能进行一次回答,所以知乎服务器返回的json数据提示我们失败,同时也说明对接口进行二次数据发送成功,只是规则逻辑失败

    3.如何模拟接口响应数据

    • 首先第一步,访问知乎app热榜,在fiddler软件中获取接口查看服务器响应的json格式数据,从服务器返回的json数据看出热榜标题字段名为title_area

    • 然后选择服务器返回的数据类型为TextView,点击.View in Notepad即打开数据记事本,如下图在记事本中找到title_area字段的内容,该字段内容进行了将中文转换为一串字符串

    • 将记事本中的title_area字段的数据修改为this is a test for cdtaogang

    • 点击文件——另存为保存到桌面 

    • 回到fiddler中,左侧选中热榜接口,右侧选中AutoResponder,在此窗口下点击Add Rule将左侧的接口添加进去,在右侧下方导入保存在桌面的zhihu_hot.htm文件,最后点击sava保存

    • 回到知乎app中刷新当前热榜页面,则成功返回修改的热榜标题

    4.使用fiddler进行评论接口测试

    • 对一篇文章进行评论,抓取评论接口,因为get请求的接口测试太简单,所以博主这里选择评论接口即POST请求方式

    • 右击评论接口选择copy复制接口的url地址

    • 右侧选择Composer,将复制的评论接口url粘贴到地址栏,并选择POST请求方式

    • 因为评论接口涉及到用户身份验证也就是登录后才能进行评论的,所以需要将comments接口中request headers请求头中的所有请求数据以及请求数据中的TextView的值进行复制

    请求头数据

    请求体数据

    • 将上面复制的请求头和请求体数据分别粘贴到如下输入框中,点击Execute执行发送,然后在左侧则出现了另一个comments接口数据

    • 查看该comments接口,服务器返回的响应数据中与第一个comments接口一致,说明接口测试成功

    五丶unittest使用

    1.unittest简单使用

    • 在IDE中使用python的环境随便创建个py文件,需要注意的是该py文件的名字不能是test.py,否在运行时会出错,unittest包是python自带的不需要下载安装,代码如下
    # -*- coding: utf-8 -*-
    __author__ = 'cdtaogang'
    __date__ = '2019/6/17 13:10'
    
    import unittest
    
    
    class TestMethod(unittest.TestCase):
    
        @classmethod
        def setUpClass(cls):
            print("Method before class execution")
    
        @classmethod
        def tearDownClass(cls):
            print("Method after class execution")
    
        def setUp(self):
            print("------setUp------")
    
        def tearDown(self):
            print("------tearDown------")
    
        def test_01(self):
            print("First test method")
    
        def test_02(self):
            print("The second test method")
    
    
    if __name__ == '__main__':
        unittest.main()
    • 直接run运行以上代码

    2.unittest和request重构封装

    说明:使用requests模块对接口url地址发送请求,通过unittest测试框架进行case测试

    • 首先博主在逍遥安卓模拟器中下载了一个看书app,通过fiddler对app上的某一接口进行获取,之所以选择对此app进行接口测试,是因为该app的所有接口全是POST请求

    • 在PyCharm下新建工程目录,目录下创建base包,在包下创建一个demo.py文件以及test_method.py文件,用于使用unittest框架来测试以上app接口

    • 在demo.py文件中,使用requests get以及post方法进行了封装,主要是根据传递的参数method来对get以及post方法进行分别调用而已,具体实现如下
    import requests
    
    
    class RunMain:
    	def send_get(self,url,data):
    		res = requests.get(url=url,data=data).json()
    		return res
    		
    	def send_post(self,url,data):
    		res = requests.post(url=url,data=data).json()
    		return res
    
    	def run_main(self,url,method,data=None):
    		res = None
    		if method == 'GET':
    			res = self.send_get(url,data)
    		else:
    			res = self.send_post(url,data)
    		return res
    • 在test_method.py文件中则创建测试类以及test方法,在test方法中调用demo.py中的run_main方法,即使用requests模块向传递的接口url地址和请求方式以及请求体发送对应的请求,这里使用setUp方法则是利用其优先调用而对RunMain类进行实例化
    import unittest
    import json
    import HtmlTestRunner
    from .demo import RunMain
    
    
    class TestMethod(unittest.TestCase):
        def setUp(self):
            self.run = RunMain()
    
        def test_01(self):
            url = 'http://api.ishugui.com/asg/portal/call/265.do'
            data = {
                "sstoken":"eyJleHAiOjE1Njg1MzgyNTczMzUsImlhdCI6MTU2MDc2MjI1NzMzNSwicHAiOiIxMTQwNTQ1Njg5MDYwMDQ0ODAwQHNvaHUuY29tIiwidGsiOiIwZkNYSHpjTUZzR0dFMEswbVdvUVFCNWVCanpXa0hmWiIsInYiOjB9.SDYkT9FpWrBbko6xRrESN74IXJhzkqQLtijKjGiVrqA",
                "gidinf":"x011060802ff0fd40695d68140002799751474c540b3",
                "ppinf":"2|1560762257|1561971857|bG9naW5pZDowOnx1c2VyaWQ6Mjg6MTE0MDU0NTY4OTA2MDA0NDgwMEBzb2h1LmNvbXxzZXJ2aWNldXNlOjMwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMHxjcnQ6MTA6MjAxOS0wNi0xN3xlbXQ6MTowfGFwcGlkOjY6MTEwNjA4fHRydXN0OjE6MXxwYXJ0bmVyaWQ6MTowfHJlbGF0aW9uOjA6fHV1aWQ6MTY6czk1YWIwNDk5NjE3YmJhNnx1aWQ6MTY6czk1YWIwNDk5NjE3YmJhNnx1bmlxbmFtZTowOnw",
                "pprdig":"kaKPdU0WwIdzL58CqxNz5pgMyv23P0-Y5GRnd5ufPlXIGzrk7_7TlIK5XFQiuoqAHNqGVXHCVd4cB1DIkR5yFZ_nExnSjIZbBJWYlMkrsiIjDYqWCvedZRLm8sZqS0WqA0FcKXuSn3Z0gVRus9YpEonNz5wyuWdUqxaSmzlzygY",
                "ppsmu":"1|1560762257|1561971857|dXNlcmlkOjI4OjExNDA1NDU2ODkwNjAwNDQ4MDBAc29odS5jb218dWlkOjA6fHV1aWQ6MDo|byWcaoPqy02s2_9GHLhZFAQ6Ov_GazMPFLrq115HiSTBS9Ijr33a55quRq2Mr1_6ZMruKEk-BYFpShUaMtwRYA"
            }
            res1 = self.run.run_main(url, "POST", json.dumps(data))
            print(res1)
    
    
        def test_02(self):
            url = 'http://api.ishugui.com/asg/portal/call/265.do'
            data = {
    
            }
            res2 = self.run.run_main(url, 'POST', data)
    
            print(res2)
    
    
    if __name__ == '__main__':
        unittest.main()
    • 运行test_method模块,查看测试接口,test_02则是错误测试

    3.unittest中assert的使用

    • 首先根据返回的结果字典dict数据中的status状态值来判断测试是否通过或者失败,逻辑很基础就不细说了
    class TestMethod(unittest.TestCase):
        def setUp(self):
            self.run = RunMain()
    
        def test_01(self):
            url = 'http://api.ishugui.com/asg/portal/call/265.do'
            data = {
                "sstoken":"eyJleHAiOjE1Njg1MzgyNTczMzUsImlhdCI6MTU2MDc2MjI1NzMzNSwicHAiOiIxMTQwNTQ1Njg5MDYwMDQ0ODAwQHNvaHUuY29tIiwidGsiOiIwZkNYSHpjTUZzR0dFMEswbVdvUVFCNWVCanpXa0hmWiIsInYiOjB9.SDYkT9FpWrBbko6xRrESN74IXJhzkqQLtijKjGiVrqA",
                "gidinf":"x011060802ff0fd40695d68140002799751474c540b3",
                "ppinf":"2|1560762257|1561971857|bG9naW5pZDowOnx1c2VyaWQ6Mjg6MTE0MDU0NTY4OTA2MDA0NDgwMEBzb2h1LmNvbXxzZXJ2aWNldXNlOjMwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMHxjcnQ6MTA6MjAxOS0wNi0xN3xlbXQ6MTowfGFwcGlkOjY6MTEwNjA4fHRydXN0OjE6MXxwYXJ0bmVyaWQ6MTowfHJlbGF0aW9uOjA6fHV1aWQ6MTY6czk1YWIwNDk5NjE3YmJhNnx1aWQ6MTY6czk1YWIwNDk5NjE3YmJhNnx1bmlxbmFtZTowOnw",
                "pprdig":"kaKPdU0WwIdzL58CqxNz5pgMyv23P0-Y5GRnd5ufPlXIGzrk7_7TlIK5XFQiuoqAHNqGVXHCVd4cB1DIkR5yFZ_nExnSjIZbBJWYlMkrsiIjDYqWCvedZRLm8sZqS0WqA0FcKXuSn3Z0gVRus9YpEonNz5wyuWdUqxaSmzlzygY",
                "ppsmu":"1|1560762257|1561971857|dXNlcmlkOjI4OjExNDA1NDU2ODkwNjAwNDQ4MDBAc29odS5jb218dWlkOjA6fHV1aWQ6MDo|byWcaoPqy02s2_9GHLhZFAQ6Ov_GazMPFLrq115HiSTBS9Ijr33a55quRq2Mr1_6ZMruKEk-BYFpShUaMtwRYA"
            }
            res1 = self.run.run_main(url, "POST", json.dumps(data))
            # print(type(res1))
            # print(res1['pub'])
            # print(type(res1['pub']))
            if res1['pub']['status'] == 0:
                print("测试通过")
            else:
                print("测试失败")
            print(res1)
    
    
        def test_02(self):
            url = 'http://api.ishugui.com/asg/portal/call/265.do'
            data = {
    
            }
            res2 = self.run.run_main(url, 'POST', data)
            if res2['pub']['status'] == 0:
                print("测试通过")
            else:
                print("测试失败")
            print(res2)
    
    
    if __name__ == '__main__':
        unittest.main()
    • 运行以上代码,查看结果与预期一样

    • 将if判断代码更换成unittest模块中的assert断言进行判断,这里使用assertEqual方法来判断两个值是否相等,当两个值相等则返回OK,当不相同时返回assertEqual方法msg变量自定义的值
    class TestMethod(unittest.TestCase):
        def setUp(self):
            self.run = RunMain()
    
        def test_01(self):
            url = 'http://api.ishugui.com/asg/portal/call/265.do'
            data = {
                "sstoken":"eyJleHAiOjE1Njg1MzgyNTczMzUsImlhdCI6MTU2MDc2MjI1NzMzNSwicHAiOiIxMTQwNTQ1Njg5MDYwMDQ0ODAwQHNvaHUuY29tIiwidGsiOiIwZkNYSHpjTUZzR0dFMEswbVdvUVFCNWVCanpXa0hmWiIsInYiOjB9.SDYkT9FpWrBbko6xRrESN74IXJhzkqQLtijKjGiVrqA",
                "gidinf":"x011060802ff0fd40695d68140002799751474c540b3",
                "ppinf":"2|1560762257|1561971857|bG9naW5pZDowOnx1c2VyaWQ6Mjg6MTE0MDU0NTY4OTA2MDA0NDgwMEBzb2h1LmNvbXxzZXJ2aWNldXNlOjMwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMHxjcnQ6MTA6MjAxOS0wNi0xN3xlbXQ6MTowfGFwcGlkOjY6MTEwNjA4fHRydXN0OjE6MXxwYXJ0bmVyaWQ6MTowfHJlbGF0aW9uOjA6fHV1aWQ6MTY6czk1YWIwNDk5NjE3YmJhNnx1aWQ6MTY6czk1YWIwNDk5NjE3YmJhNnx1bmlxbmFtZTowOnw",
                "pprdig":"kaKPdU0WwIdzL58CqxNz5pgMyv23P0-Y5GRnd5ufPlXIGzrk7_7TlIK5XFQiuoqAHNqGVXHCVd4cB1DIkR5yFZ_nExnSjIZbBJWYlMkrsiIjDYqWCvedZRLm8sZqS0WqA0FcKXuSn3Z0gVRus9YpEonNz5wyuWdUqxaSmzlzygY",
                "ppsmu":"1|1560762257|1561971857|dXNlcmlkOjI4OjExNDA1NDU2ODkwNjAwNDQ4MDBAc29odS5jb218dWlkOjA6fHV1aWQ6MDo|byWcaoPqy02s2_9GHLhZFAQ6Ov_GazMPFLrq115HiSTBS9Ijr33a55quRq2Mr1_6ZMruKEk-BYFpShUaMtwRYA"
            }
            res1 = self.run.run_main(url, "POST", json.dumps(data))
            # print(type(res1))
            # print(res1['pub'])
            # print(type(res1['pub']))
            # if res1['pub']['status'] == 0:
            #     print("测试通过")
            # else:
            #     print("测试失败")
            self.assertEqual(res1['pub']['status'], 0, "测试失败")
            print(res1)
    
    
        def test_02(self):
            url = 'http://api.ishugui.com/asg/portal/call/265.do'
            data = {
    
            }
            res2 = self.run.run_main(url, 'POST', data)
            # if res2['pub']['status'] == 0:
            #     print("测试通过")
            # else:
            #     print("测试失败")
            self.assertEqual(res2['pub']['status'], 0, "测试失败")
            print(res2)
    
    
    if __name__ == '__main__':
        unittest.main()
    • 测试查看结果,断言失败,测试结果如下很清晰

    4.unittest中case的管理及运用

    • 在测试一些接口时,有些接口的返回数据需要在下一个接口进行使用,所以需要定义全局变量,方便每个case都能够得着,当在test_01中定义全局变量userid,然后在test_02中进行打印

    • 在unittest中,是按照字母数字来进行case先后执行顺序的,将test_01改为test_03后,运行代码后,会提示test_02中的userid未定义,原因是程序先去执行了test_02这个case,所以出现该提示是正常的

    • 当在测试代码中有很多case时,我想跳过某个case,则在该case方法上定义unittest的skip方法装饰器,并需要传递此方法名作为实参进行传递

    • 除了在if __name__ == '__main__'中使用unittest.main方法执行所有的case以外,还可以将要测试的case添加到unittest.TestSuite集合中执行想要执行的case,若想要全部都执行则需要一个一个的添加

    5.unittest和HTMLTestRunner结合生成报告(博主这里给大家展现两种)

    第一种:比较新版本的htmltestrunner报告

    • 然后将下载好的whl文件放在你的项目环境的Scripts目录下

    • 最后在Terminal终端或者cmd终端中进入以上目录,执行如下命令即可

    • 安装成功后,即在以下路径中可以找到安装的HTMLTestRunner的包了

    • 在if __name__ == '__main__'中只需要调用HtmlTestRunner模块中的HtmlTestRunner类,向该类传递报告标题参数值即可,其他均默认,需要注意的时启动文件run为当前的py文件,如果是Unittests开头的启动文件,则不会运行if __name__ == '__main__'下的代码,只会执行unittest框架的setUp以及test开头的case代码

    • 运行test_method.py文件,成功在base目录下创建reports目录,并在该目录下生成对应时间的测试报告

    • 打开reports目录下生成的html测试报告,查看测试内容,与预期设定一样,test_02失败test_03成功,说明一下报告中的乱码为中文

    第二种:比较经典版本的htmltestrunner报告

    • 为了方便演示效果,博主在testItems项目目录下,创建base2的模块,将base模块下的demo.py和test_method.py文件拷贝到base2目录下并将test_method.py命令为test_method2.py免得搞混淆,然后在base2目录下新建HTMLTestRunner.py文件用于存放其源码,目录结构如下

    第94行, 将import StringIO修改成import io
    第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO()
    第642行,将if not rmap.has_key(cls):修改成if not cls in rmap:
    第631行,将print >> sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)修改成print(sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime))
    第766行,将uo = o.decode('latin-1')修改成uo = e
    第775行,将ue = e.decode('latin-1')修改成ue = e
    • 在test_method2模块中首先需要从base2模块中去导入HTMLTestRunner文件,然后if __name__ == '__main__'中,需要创建一个文件源,同样是调用HTMLTestRunner模块中的HTMLTestRunner类,不同的是需要将创建的文件源传递给实例属性stream变量

    • 运行test_method2.py,成功在上一级report目录下生成html_report.html报告文件

    • 打开html_report.html测试报告,测试结果与代码设定一致

    六丶mock服务入门到实战

    1.mock简介

    mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为即就是模拟fiddler返回接口响应数据的一个过程。

    2.mock安装

    • 在终端使用pip进行安装即可

    3.在case中通过底层函数实现mock

    • 在test_method模块中导入mock,然后在test_03函数中通过以下代码设置返回的return_value的值为请求的data数据
    mock_data = mock.Mock(return_value=data)
    print(mock_data)
    • run运行Unittests in test_method.py,打印出Mock id的值

    • 将调用run_main方法的值设定为mock_data,即print(res1)则表示打印请求的data数据的值,因为res1的数据不再是接口返回的响应数据,则arrest断言是会提示报错的,这是正常的

    4.重构封装mock服务

    • 在base目录下创建mock_demo.py文件,构造一个mock_test方法,该方法就是将test_03方法中self.run.run_main = mock.Mock(return_value=data) 和 res1 = self.run.run_main(url, "POST", json.dumps(data))方法的调用进行了封装成为test_02和test_03方法通用的一个方法,上一步骤中的代码mock_data = mock.Mock(return_value=data) 和self.run.run_main = mock_data,即就相当于self.run.run_main = mock.Mock(return_value=data)而已,都是python基本的调用封装基础知识,mock_demo.py中的代码如下
    # -*- coding: utf-8 -*-
    __author__ = 'cdtaogang'
    __date__ = '2019/6/20 16:26'
    from mock import mock
    import json
    
    def mock_test(mock_method, request_data, url, method, response_data):
        """
        :param mock_method:
        :param request_data:
        :param url:
        :param method:
        :param response_data:
        :return: res
        """
        mock_method = mock.Mock(return_value=response_data)
        print('mock_method:', mock_method)
        res = mock_method(url, method, json.dumps(request_data))
        return res
    • 那么在test_03方法中,如下进行调用即可
    res1 = mock_test(self.run.run_main, data, url, 'POST', 'ssssssss')
    print('res1:', res1)
    • 运行Unittests in test_method.py,查看运行结果和博主设定一样成功返回自定义的response_data数据

    七丶接口自动化框架设计到开发

    1.如何设计一个接口自动化测试框架

    根据接口地址丶接口类型丶请求数据丶预期结果来进行设计,对于需要登录后才能进行操作的接口那么则需要进行header cookie等数据的传递,自动化测试的难点就是数据依赖。

    2.python操作excel获得内容

    • 首先python操作excel,需要安装两个包,分别是xlrd和xlwt这两个库,xlrd这个库是负责读取excel数据的,而xlwt库是负责向excel写入数据的

    • 在项目目录下创建utils工具包,在该包下创建op_excel.py文件,在该文件中通过导入xlrd包,对excel表的数据进行读取操作

    3.重构操作excel函数

    • 根据上一步骤读取excel表的内容代码后,进行了一个简单的封装,提高代码的通用性,过程相当的简单,实现代码如下
    # -*- coding: utf-8 -*-
    __author__ = 'cdtaogang'
    __date__ = '2019/6/20 17:33'
    import xlrd
    
    data = xlrd.open_workbook("../test_data/rs.xls")
    tables = data.sheets()[0]  # 获取表格数据对象
    print(tables.nrows) # 打印表格行数
    print(tables.cell_value(0,0))  # 打印excel表格数据,需要传递数据所在的坐标(x,y)
    print(tables.cell_value(0,1))
    print("*"*50+"封装前后数据对比"+"*"*50)
    
    
    class operationExcel(object):
        def __init__(self, file_path="../test_data/rs.xls", sheet_id=0):
            self.file_path = file_path
            self.sheet_id = sheet_id
            self.data = self.get_data()
    
        def get_data(self):
            data = xlrd.open_workbook(self.file_path)
            tables = data.sheets()[self.sheet_id]
            return tables
    
        def get_rows(self):
            """获取单元格的排数"""
            return self.data.nrows
    
        def get_cell_value(self, x=0, y=0):
            """获取某个单元格的数据"""
            return self.data.cell_value(x, y)
    
    
    if __name__ == '__main__':
        print(operationExcel().get_rows())
        print(operationExcel().get_cell_value())
        print(operationExcel().get_cell_value(0,1))
    • 运行op_excel.py文件后,结果与封装之前代码结果一致,表示重构封装代码成功

    4.学习操作json文件

    • 自定义一个登录的json文件名为login.json,文件内容如下,存放在test_data目录下

    • 在utils工具包下创建op_json.py文件,在文件中对login.json文件内容进行读取操作,代码如下

    5.重构json工具类

    • 将上一步操作json的代码进行封装
    class operationJson(object):
        def __init__(self, file_path="../test_data/login.json"):
            self.file_path = file_path
            self.data = self.get_data()
    
        def get_data(self):
            with open(self.file_path) as f:
                data = json.load(f)
                return data
    
        def get_key_words(self, key=None):
            if key:
                return self.data[key]
            else:
                return self.data
    
    
    if __name__ == '__main__':
        print(operationJson().get_key_words())
        print(operationJson().get_key_words("login"))
        print(operationJson().get_key_words("login")['username'])
    • 运行op_json.py文件,结果与封装之前代码结果一致,表示重构封装代码成功

    6.封装获取常量方法

    • 首先打开excel表格,查看需要获取的字段有哪些

    • 对excel表的字段进行获取,在项目目录下创建名为data的python包,在该包下创建data_conf.py,代码就是简单的获取对应的变量值,具体如下
    # -*- coding: utf-8 -*-
    __author__ = 'cdtaogang'
    __date__ = '2019/6/21 9:29'
    
    
    class global_var:
        id = '0'  # id
        module = '1'  # 模块
        url = '2'  # url
        run = '3'  # 是否运行
        request_type = '4'  # 请求类型
        request_header = '5'  # 是否携带header
        case_depend = '6'  # case依赖
        response_data_depend = '7'  # 依赖的返回数据
        data_depend = '8'  #  数据依赖
        request_data = '9'  # 请求数据
        expect_result = '10'  # 预期结果
        reality_result = '11'  # 实际结果
    
    
    def get_id():
        return global_var.id
    
    def get_module():
        return global_var.module
    
    def get_url():
        return global_var.url
    
    def get_run():
        return global_var.run
    
    def get_request_type():
        return global_var.request_type
    
    def get_request_header():
        return global_var.request_header
    
    def get_case_depend():
        return global_var.case_depend
    
    def get_response_data_depend():
        return global_var.response_data_depend
    
    def get_data_depend():
        return global_var.data_depend
    
    def get_request_data():
        return global_var.request_data
    
    def get_expect_result():
        return global_var.expect_result
    
    def get_reality_result():
        return global_var.reality_result

    7.封装获取接口数据

    • 在data目录下创建data_get.py文件,在该文件中对excel表数据以及json数据结合上一步封装的常量方法整合后的实现,代码如下
    # -*- coding: utf-8 -*-
    __author__ = 'cdtaogang'
    __date__ = '2019/6/21 10:01'
    from utils.op_excel import operationExcel
    from utils.op_json import operationJson
    from data import data_conf
    
    class getData(object):
        def __init__(self):
            self.op_excel = operationExcel()
    
        def get_case_lines(self):
            """获取表格行数"""
            return self.op_excel.get_rows()
    
        def get_is_run(self, x):
            """获取case是否运行"""
            flag = None
            y = data_conf.get_run()
            run_value = self.op_excel.get_cell_value(x, y)
            if run_value == 'yes':
                flag = True
            else:
                flag = False
            return flag
    
        def get_is_header(self, x):
            """是否携带header"""
            y = data_conf.get_request_header()
            header = self.op_excel.get_cell_value(x, y)
            if header == 'yes':
                return data_conf.get_header_value()
            else:
                return None
    
        def get_request_method(self, x):
            """获取请求方式"""
            y = data_conf.get_request_type()
            request_method = self.op_excel.get_cell_value(x, y)
            return request_method
    
        def get_request_url(self, x):
            """获取请求地址"""
            y = data_conf.get_url()
            request_url = self.op_excel.get_cell_value(x, y)
            return request_url
    
        def get_request_data(self, x):
            """获取请求数据"""
            y = data_conf.get_request_data()
            request_data = self.op_excel.get_cell_value(x, y)
            if request_data == '':
                return None
            return request_data
    
        def get_data_for_json(self, x):
            """通过excel中的关键字去获取json数据"""
            op_json = operationJson()
            data = op_json.get_key_words(self.get_request_data(x))
            return data
    
        def get_expect_data(self, x):
            """获取预期结果数据"""
            y = data_conf.get_expect_result()
            expect_data = self.op_excel.get_cell_value(x, y)
            if expect_data == '':
                return None
            return expect_data

    8.post、get基类的封装

    • 在base包下创建run_method.py文件,在文件中重新编写对get丶post请求方式的代码封装,具体如下
    # -*- coding: utf-8 -*-
    __author__ = 'cdtaogang'
    __date__ = '2019/6/21 11:19'
    import requests
    
    
    class RunMain(object):
    
        def get_main(self, url, data=None, header=None):
            res = None
            if header is not None:
                res = requests.get(url=url, data=data, headers=header).json()
            else:
                res = requests.get(url=url, data=data).json()
            return res
    
        def post_main(self, url, data, header=None):
            res = None
            if header is not None:
                res = requests.post(url=url, data=data, headers=header).json()
            else:
                res = requests.post(url=url, data=data).json()
            return res
    
    
        def run_main(self, url, method, data=None, header=None):
            res = None
            if method.lower() == 'post':
                res = self.post_main(url, data, header)
            elif method.lower() == 'get':
                res = self.get_main(url, data, header)
            else:
                return "what ?????"
            return res

    9.主流程封装及错误解决调试

    • 首先在testItems项目目录下新建一个名为main的python包,在该包下创建名为run_test的py文件,该文件为主程序启动文件,代码的逻辑就是将前面封装的方法进行了调用核心就是读取excel表的数据,通过读取到的数据,发送请求,其中包括某一些变量的判断,根据该判断然后到json数据中获取请求的数据,最后就这么的简单,代码如下
    # -*- coding: utf-8 -*-
    __author__ = 'cdtaogang'
    __date__ = '2019/6/21 11:57'
    from base.run_method import RunMain
    from data.data_get import getData
    
    
    class RunTest(object):
        def __init__(self):
            self.runmain = RunMain()
            self.data = getData()
    
        def run(self):
            res = None
            row_counts = self.data.get_case_lines()  # 获取excel表格行数
            # print(row_counts) 5
            for row_count in range(1, row_counts):
                # print(row_count) 1,2,3,4
                url = self.data.get_request_url(row_count)  # y行不变遍历获取x列的请求地址
                method = self.data.get_request_method(row_count)  # y行不变遍历获取x列的请求方式
                is_run = self.data.get_is_run(row_count)  # y行不变遍历获取x列的是否运行
                data = self.data.get_data_for_json(row_count)  # y行不变遍历获取x列的请求数据,这里面时三次调用,依次分别是get_data_for_json丶get_key_words丶get_request_data
                header = self.data.get_is_header(row_count)
                print('url:', url)
                print('method:', method)
                print('is_run:', is_run)
                print('data:', data)
                print('header:', header)
    
                if is_run:
                    res = self.runmain.run_main(url,method,data,header)
                    print("*"*60+"分割线"+"*"*60)
            return res
    
    
    if __name__ == '__main__':
        print('res:', RunTest().run())
    • 运行run_test,成功的将excel以及json数据正确打印出来,返回res服务器返回结果,需要说明的是excel表中的所有数据都不是真实存在的,包括json文档数据也是,这里主要是测试整个框架的正确性读取excel以及json文档数据,并正确的发送请求获得相应数据

    • 运行结果出现红色的内容,是由requests模块发送请求的安全请求警告,如不想显示此警告,可以在run_method.py发送请求核心代码进行禁用,禁用代码如下

    • 重新运行run_test,安全请求警告不再显示

    • 根据代码运行结果,对比excel表以及json数据文档内容,数据正确无误

    10. 返回数据格式处理以及调错

    • 为了测试返回的接口的响应数据,博主这里在excel文档以及json文档中添加了一条数据

    • 因为在excel文档中小说的接口不携带header所以在向接口发送请求数据核心代码块,进行了如下修改,因为在excel文档中的最后一个接口时真实的,所以只需要对最后一个接口url返回的字典类型的响应数据进行转换成json格式的数据,并按照关键字进行排序

    • 运行run_test,在最后一个接口中成功打印出我们想要的数据

    11.获取接口返回状态

    • 在发送请求数据核心代码中,进行打印返回的状态码status_code即可,最后一个接口比较特殊,返回的响应数据中没有status_code,所以需要对返回的json数据中的status进行判断,并向其返回数据中添加我们所要的status_code的值

    • 运行代码,当返回的状态码为404表示接口不存在,只要是存在响应数据,则status_code为200,必须说明一点的就是status_code为200不一定表示接口存在,有些大型网站会对其域名下不存在的接口返回200的错误页面显示,所以在测试文档中会体现预期结果和实际结果两项数据需要一致才能表示测试通过

    12.通过预期结果判断case是否执行成功

    • 进行接下来的测试,博主这里重新准备了另一个excel表来进行测试,需要对json文件中的数据进行添加,在excel表Book-05中的请求数据book5关键字对应的json文件的数据故意为空,可以对测试结果有一个对比

    • 在数据获取核心类中定义了一个方法来获取excel表模块字段的数据

    • 回过头在启动文件中获取模块名预期结果并进行打印

    • 运行启动文件,查看运行结果

    • 在utils目录下,创建common_util.py文件,在该文件代码中通过启动文件传递过来的数据来判断excel表预期结果数据的status状态码与res结果中的status状态码是否一致,一致表示测试通过,不一致则失败,代码如下
    # -*- coding: utf-8 -*-
    __author__ = 'cdtaogang'
    __date__ = '2019/6/21 18:43'
    import json
    
    class CommonUtil(object):
        def is_contains(self, expect, reality):
            flag = None
            reality = json.loads(reality)
            expect = json.loads(expect)
            if expect['status'] == reality['pub']['status']:
                flag = True
            else:
                flag = False
            return flag
    • 在启动文件中需要注释掉res响应数据,利于查看测试结果,还需要在启动文件调用is_contains方法来根据其返回值判断测试是否通过

    • 运行启动文件,查看测试结果

    13.将测试结果写入到excel中

    • 首先在op_excel.py中定义一个方法,该方法实现读取excel的数据,并进行copy复制,然后再write方法将数据写入到坐标位置

    • 然后在data_get.py中需要定义一个方法,在该方法中核心逻辑为获取y坐标的值

    • 最后在启动文件中,调用data_get模块中的write_reality_data方法,并将剩余的x坐标的值以及data数据传递给最终的核心方法write_reality_result_data来完成对excel表中的实际结果数据的写入

    • 将excel表进行关闭后,运行启动文件,再次打开excel表,实际结果数据写入正确,之所以需要关闭excel是避免提示提示错误,无法写入保存数据

     

    展开全文
  • Wisdom RESTClient https://github.com/Wisdom-Projects/rest-client
  • Appium 是一个移动端自动化测试开源工具,支持iOS 和Android 平台,支持Python、Java 等语言,即同一套Java 或Python 脚本可以同时运行在iOS 和Android平台, Appium 是一个C/S 架构,核心是一个 Web 服务器,它提供...

    1:Appium

    AppUI自动化测试
    Appium 是一个移动端自动化测试开源工具,支持iOS 和Android 平台,支持Python、Java 等语言,即同一套Java 或Python 脚本可以同时运行在iOS 和Android平台,
    Appium 是一个C/S 架构,核心是一个 Web 服务器,它提供了一套 REST 的接口。当收到客户端的连接后,就会监听到命令,然后在移动设备上执行这些命令,最后将执行结果放在 HTTP 响应中返还给客户端。

    2: Selenium

    WebUI自动化测试
    Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。
    这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。
    支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具。其升级版本为Webdriver。

    3: Jmeter

    接口测试,性能测试
    JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现
    JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、
    网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。你可以用JMeter提供的图形化界面分析性能指标或者在高负载情况下测试服务器/脚本/对象的行为。

    4:Postman

    接口测试
    Postman 提供功能强大的 Web API 和 HTTP 请求的调试,它能够发送任何类型的HTTP 请求 (GET, POST, PUT, DELETE…),并且能附带任何数量的参数和 Headers。不仅如此,
    它还提供测试数据和环境配置数据的导入导出,付费的 Post Cloud 用户还能够创建自己的 Team Library 用来团队协作式的测试,并能够将自己的测试收藏夹和用例数据分享给团队。

    5: Monkey

    稳定性测试
    软件附带在sdk中,适用于android和ios,通过adb shell,生成用户或系统的伪随机事件,
    压力测试结果:崩溃crash,无响应anr,
    基本命令:adb shell monkey 300。

    6: Robot

    WebUI 自动化测试,接口测试
    Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发。

    7: Loadrunner

    性能测试
    LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。
    企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。 LoadRunner可适用于各种体系架构的自动负载测试,能预测系统行为并评估系统性能。

    展开全文
  • 说到接口自动化测试工具,想必做web测试的TX们肯定不会陌生,接口自动化测试是产品测试走向成熟之路的必经阶段,因此,现在有很多开源或者商业的工具供大家选择,那么如何选择适合自己或者是自己团队的工具呢?...

    导读

    上一篇已经跟大家讨论了自动化测试的分层理论,这一篇给大家换换胃口。老说理论大家肯定会想睡觉,天天实战大家也会觉得吃不饱。因此,这个系列后边会理论和实践穿插,把鄙人自己肚子的那点东西拿出来,跟大家一块讨论吧,欢迎留言!
    说到接口自动化测试工具,想必做web测试的TX们肯定不会陌生,接口自动化测试是产品测试走向成熟之路的必经阶段,因此,现在有很多开源或者商业的工具供大家选择,那么如何选择适合自己或者是自己团队的工具呢?这一篇咱们就来掰扯掰扯吧。

    适合自己的才是最好的

    经常看到有些文章要评出哪一个接口自动化测试工具是最好用的。首先,我很感激有这些小伙伴能把这些经验总结出来分享给大家,这对正在选工具的TX来说是极好的,可以帮助有需求的小伙伴走出混沌之潭,走向光明之路。但是,对不同的读者来讲,我还是要告诫大家,你走的路虽然是光明之路,但也有可能比较坎坷。为什么这么说呢?不是说这个工具不好,而是说你需要根据你所处的情形去选择工具,而不是茫然的根据工具哪个最潮流、最好用去决断我是不是要去用它。适合自己的才是最好的,下面我会跟大家从两个维度去讨论如何选择自动化测试工具。

    • 工具的门槛级别
      这里指的门槛主要是指编程能力,因为很多工具用例的实现需要小伙伴们具备编程能力。要选择接口自动化测试工具,我们首先应该确认我们现在的能力以及我们的团队能力。下面一块来看一下吧:
    1. 不需要编程经验,纯工具类(此处不含二次开发):Postman、Swagger等。像这两类工具用起来比较简单,可以说是手动的自动化测试工具。Postman不用多说,想必大家会经常去用。Swagger其实主要是用来写接口文档的工具,但是小伙伴可以直接通过接口所在的页面触发,比较方便,适合开发调试接口。总的来说,这类工具主要适用系统端测试人员或者是开发人员做简单的接口积累、校验和调试,上手很快,适合测试团队大都不具备编程能力,刚引入接口测试或者只是作为日常的接口校验。这类工具本身的灵活性不够强,适合单一场景测试,无法通过处理返回结果引入业务场景。比如说我要查看网站的个人信息需要先调用登录接口拿到token,再调用查看个人信息接口并带上token,而且token是每次需要重新获取的,因为有时效性。像类似的场景,使用此类工具就力不从心。
    2. 需要一定的编程经验:Jmeter、Roberframework等。我所说的一定的编程经验实际上是相对于两类职责。对开发自动化测试用例的TX来讲,其实不需要具备高水平的编程能力,只需要有一定的编程基础即可,比如变量的定义、变量类型的转换等等,因为这一部分在编写测试用例的过程当中是常用的。另一类就是指自动化测试架构师,也可以说是自动化测试工具的支持人员,这类职责就需要有较高水平的编程能力,因为涉及到一些通用功能的实现,对于RF来说就是关键字,对于Jmeter可能涉及到一些插件。总体来说,这类工具用的团队比较多,就是因为它们具备较高的灵活性,而且对开发用例的人来说门槛相对也不是很高。因此,追捧的人就比较多。但是,对一些特殊的业务或者产品来讲,它们的灵活度还是达不到团队的要求。比如说一种通信产品中模拟打电话,整个流程需要开启多个终端启动相关的测试设备,并且整个功能需要在不同的终端中按顺序执行不同的命令并查看命令执行的结果。类似这种特殊的需求,如果用RF实现起来可能就没那么简单,但是用贝尔实验室开发的EXPECT脚本就比较方便。
    3. 纯撸代码:此类工具不用多说,需要开发用例的小伙伴具备较高的编程能力,通过集成不同的工具包或者是使用原生工具完成接口自动化测试用例的开发。比如说TestNG、Python+Unittest+Request等等。但是,虽然门槛高,框架的灵活性也相对来讲是最高的,像现在很多大厂以及技术型的公司采用自研工具的比较多,因为他们不缺牛人 😃
    • 根据引入接口自动化测试工具的场景
    1. 初次引入自动化测试:如果是初次引入自动化测试,那么除了要考虑上面提到的工具的门槛级别,还要考虑领导对自动化测试的期望程度,个人能力的发展(毕竟这是你拓宽自己职业领域的好机会)等等。
    2. 公司已有自动化测试工具:此类情形下,适合刚跳槽到公司或者公司别的部门已有自动化工具可用,建议调查当前工具的使用程度及优缺点,在满足当前使用的情况下还是选择已有工具比较好,一是团队人员已熟悉工具,换工具毕竟容易引起“民愤”;二来是团队有一定的基础,效率比较高。当然,如果在使用过程中发现已有工具已经不适合使用,就可以考虑自动化测试工具改进或替换。
    • 扩展性
    1. 引入持续集成的难易度:如果研发团队计划或已经引入持续集成,此时要引入接口自动化测试,就需要考虑你所选的工具是否会比较容易的接入持续集成工具。总的来说,如果自动化测试工具具备命令行的形式执行都不难集成到持续集成工具。另外,除了考虑自动化测试工具的执行方式还要考虑是否能够拿到详实的报告。因为,持续集成的结果主要是给非自动测试的人员看的。比如说持续集成工具Jenkins,如果自动化工具具备Jenkins对应的插件,那自然是极好的,报告的事一般就解决了。
    2. 工具是否适用于其他自动化测试:根据团队对自动化测试发展方向的预设,可以考虑工具是否适合多类自动化测试使用,包括UI自动化测试、单元测试等等。学习一种工具所花的时间肯定要比多种工具所用的时间少,而且在后续与其他平台集成的过程中也比较容易,因此,如果决定要做多种自动化测试可以考虑是否某一种工具可以胜任,比如RF既可以做接口自动化也可以做UI自动化。

    总结

    这一篇没有介绍怎么去使用一套接口自动化测试工具,因为已经有很多前辈同仁分享了,而且分享的肯定比我好 😃,我只是根据我自己的经验跟大家笼统地,定性地讨论怎么去选择一套适合自己的接口自动化测试工具,有什么考虑不周的地方欢迎各位讨论哈。

    展开全文
  • 开源接口自动化测试工具 HttpRunner

    千次阅读 2018-07-27 10:42:45
    开源接口自动化测试工具 HttpRunner 优点 1、只要熟悉http协议,有一定的python基础,就可以很简单上手使用。 2、支持js、yaml等格式,结构清晰。 3、测试用例与python完美结合,使代码和数据分离,可复用性和可...
  • 工具设计初衷是配合 python接口自动化测试框架 而设计的 reader.py 用来读取excel文档,掉用writer中拼接字符串的方法,来生成一个个测试脚本,_init_.py的作用是用来运行HTMLTestRunner,以生成测试报告。比较...
  • 常见自动化测试工具汇总

    千次阅读 2019-08-13 10:32:09
    自动化测试领域,自动化工具的核心地位毋庸置疑。这篇博客总结了最顶尖的自动化测试工具和框架,这些工具和框架可以帮助组织更好地定位自己,跟上软件测试的趋势。这份清单包含了开源和商业的自动化测试解决方案。...
  • 常见功能自动化测试工具汇总

    万次阅读 2012-01-17 21:45:36
    最近因要写一些关于自动化测试及自动化框架方面的东西,所以需要学习和补充很多自动化工具和框架方面的知识,以期能获取第一手资料来完成自己的写作所需。因为之前常见的和使用的自动化工具只有QTP、selenuim,其它...
  • 互联网服务端接口自动化是各个公司都需要一部分业务,如何快速高效地完成接口测试呢? 以帮助大家实现高效的接口测试为出发点,本文包含了我在互联网接口测试领域的一些方法和心得,希望大家一起讨论和分享,内容...
  • 接口自动化测试框架 一、接口测试工具 1. jmeter jmeter 是一个非常流行的性能测试工具,优点 开源、小巧、易于安装。 2. postman postman常用于开发中,可将请求的链接直接复制,然后构造自己所想要的入参进而...
  • 接口自动化测试

    千次阅读 2018-12-29 21:31:31
    昨晚在某个测试交流群,听了一个测试老司机分享接口自动化测试的内容,对接口自动化有了更深的一些认识,也为接下来公司的接口自动化实施,提供了更多的思路。 这篇博客,就说说功能测试到接口自动化的进阶,以及...
  • 所以,测试也越来越强调自动化测试,在自动化测试当中,接口自动化测试收益比最大,我们以前一直基于robotframework框架,开发自己的测试库, 来做接口自动化,但是交互界面不是特别人性化,而且受制于运行环境,...
  • 接口自动化测试之接口测试基础

    万次阅读 多人点赞 2020-02-11 13:29:38
    分层自动化测试二、接口测试基础知识1.接口的含义2.接口的分类3.接口测试3.1 接口测试的含义3.2 接口测试的意义3.2.1 为什么测试接口3.2.2 接口测试的意义3.3 协议接口的分类3.3.1 按系统不同的调用方式进行分类...
  • ITP自动化接口集成测试工具介绍
  • 基于java开发工具包的接口自动化测试.pdf
  • 工具: DOClever (http://doclever.cn) Github: https://github.com/sx1989827/DOClever  码云: https://git.oschina.net/sx1989827/SBDoc  文档: http://doclever.cn/help/help.html QQ 群:...
  • 利用工具进行接口测试,能够提供测试效率。例如,假 入让你一天完成100个接口测试任务,你觉得你加班能完成,那么1000个、10000个........。如果有工具,可以大大提高你的效率,可以达到事半功倍,但是不是所有工具...
  • E:\最全面的Java接口自动化测试实战\第4章 企业级代码管理工具git的应用 E:\最全面的Java接口自动化测试实战\第5章 测试框架TestNG E:\最全面的Java接口自动化测试实战\第6章 测试报告 E:\最全面的Java接口自动化...
  • postman工具下载,自动化接口测试,简单容易上手,下载后直接打开解压到任意位置即可,点击后将自动安装需要的工具,安装完成后打开就可以进行接口测试
  • 最近,工作中涉及到需要对接口进行自动化测试,因而在网上找一些相关的资料进行学习一下。 接下来,通过他山之石,以解目前困惑,也方便大家都学习一下。 随着云计算、SOA、敏捷开发的热火朝天,对于测试工程师的...
  • 对于接口自动化这方面断断续续也研究了好久了,从最开始自己写小框架+excel数据来驱动;然后到基于flask前后端结合在一起弄平台,最后到现在的前后端分离开发出的这平台,感触颇深啊,额额额,开源啦,代码写得糟糕...
  • YAPI接口自动化测试工具---使用记录

    千次阅读 2020-03-19 17:03:12
    YApi变量参数设置有两种方式: 1.使用YApi自带的高级参数设置功能,如下图所示:
  • Python实现http接口自动化测试

    万次阅读 多人点赞 2018-09-16 17:07:42
    网上http接口自动化测试Python实现有很多,我也是在慕课网上学习了相关课程,并实际操作了一遍,于是进行一些总结,便于以后回顾温习,有许多不完善的地方,希望大神们多多指教! 接口测试常用的工具有fiddler,...
  • YAPI的使用文档,使用时记录的心得教程,包括如何创建接口,设置断言以及上下游接口的数据依赖等,以供大家参考,欢迎指教补充
  • 【接口测试】接口自动化测试

    千次阅读 2016-04-18 18:59:50
    ----接口自动化测试概述 1、接口自动化到底关注哪些点? a.关注函数、类(方法)所提供的接口的可靠性; b.关注接口之间衔接的可靠性; c.关注接口参数的校验 2、接口有哪几种类型? a.http协议中:GET/POST/PUT...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 329,566
精华内容 131,826
关键字:

常见的接口自动化测试工具