接口测试基础篇(史上最详细)

作者: 6780441d2bcc | 来源:发表于2019-07-10 15:02 被阅读166次
    接口测试基础篇

    有很多小伙伴想要基础版本,从0到1,今天它来了~

    用十个特别简单的案例,让你清晰的从0到1接触到接口测试

    最好自己动手去写一遍这十个案例,光看是不行的

    从刚开始特别简单的案例,到最后略有难度的接口小案例,让你快速清晰的学习接口!


    对于接口测试,很多同学可能会说接口真的有测试的必要吗?我只把功能测试好了不就ok了吗?

    答案当然是否定的,接口测试的重要性如下:

    image
    那么接口提测的标准是什么呢?
    首先对于接口文档的要求如下:
    接口名称
    接口类型
    输入参数
    1. 每个参数名;
    2. 每个参数类型;
    3. 每个参数业务含义;
    4. 每个是否可空;
    5. 每个字段长度(可选,一般需要提供,有严格要求的字段需特别注明);

    接口通用基本要求:
    1. 返回json字段信息,不可出现 关键字类型,如 object,interface,public,java等各类语言代码中关键字类型
    2. 涉及金额等信息时应采取加密方式,后端需进行校验,防止通过接口拦截造成损失
    3. HTTPS方式传输
    4. 请求方式,一般获取数据是get,提交表单是post
    5. 信息存取可采取对称加密和非对称加密的结合(可选,也可选一种)
    6. 接口进行手机号正则验证,字符串和上传文件图片等提前规划大小限制
    7. 检查数据正确性,每个接口从数据存取数据等是否正确,是否在正确的数据库表取数据等
    8. 为空等验证一定要做,正确状态码和错误状态码一定全部记录下来,状态码代表的意思等

    以上是小白自己总结和平常工作整理的,如有不对请大家指正,希望和大家一起学习进步,共同成长,谢谢


    接下来用几个特别简单的案例,来接触学习接口测试之旅吧

    如果你是第一次接触开发语言也不要紧,多写多思考,没有人天生就会写代码,都是慢慢学习出来的,在这里python环境如何搭建等就不在累述了,网上能搜到很多如何安装资料


    建议如下:
    1. 使用最新的python版本进行学习
    2. 代码一定要多写多练多思考
    3. 学习心得,两个点第一点,多去思考,第二点多敲

    准备开始吧,接口用特别简单容易理解的几种案例,带你对接口测试有一个简单的了解
    环境:python3.7版本
    系统:w7
    工具:PyCharm
    python官方文档:https://www.python.org/


    在接口测试之初呢小白也是懵懵懂懂,接下来开始和小白一起学习研究接口测试吧~

    1.第一个案例(发送一个get请求)

    # coding=utf-8
    import requests
    
    # 请求的链接
    url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
    # 发送get请求
    r = requests.post(url)
    # 请求的状态码 200代表成功
    status = r.status_code
    print(status)
    # 请求的内容
    j = r.json()
    
    print(j)
    
    

    输出结果如下:


    image

    2.第二个案例(发送一个post请求)

    # 请求的链接
    url = 'http://suggest.taobao.com/sug'
    
    # post请求以字典格式传入
    data = {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}
    
    # 发送post请求
    r = requests.post(url, data)
    
    # 请求的状态码 200代表成功
    status = r.status_code
    print(status)
    
    # 请求的内容
    print(r.content)
    

    输出结果如下:


    image

    (接口只返回了一个b,这里只需要明白遇到post接口怎么去请求就好了~)


    3.第三个案例(进行接口状态码断言)

    # coding=utf-8
    import requests
    
    # 请求的链接
    url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
    # 发送请求
    r = requests.post(url)
    
    # 请求的状态码 200代表成功
    status = r.status_code
    
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('用例测试通过')
    else:
        print('测试不通过')
    print(status)
    # 请求的内容
    j = r.json()
    print(j)
    
    

    输出结果如下:


    image

    4.第四个案例(进行接口内容断言-正常情况)

    # coding=utf-8
    import requests
    
    # 请求的链接
    url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
    # 发送请求
    r = requests.post(url)
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('用例测试通过')
    else:
        print('测试不通过')
    print(status)
    # 请求的内容
    j = r.json()
    # 判断接口返回内容里面,有没有 裤子女夏 内容
    if '裤子女夏' in str(j):
        print('存在此数据')
    else:
        print('不存在此数据')
    print(j)
    
    

    输出结果如下:


    image

    5.第五个案例(进行接口内容断言-异常情况)
    在这里修改了上面的 裤子女夏 修改为 裤子女夏1

    # coding=utf-8
    import requests
    
    # 请求的链接
    url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
    # 发送请求
    r = requests.post(url)
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    print(status)
    # 请求的内容
    j = r.json()
    # 判断接口返回内容里面,有没有 裤子女夏 内容
    # 裤子女夏  增加了一个1
    if '裤子女夏1' in str(j):
        print('存在此数据')
    else:
        print('不存在此数据')
    print(j)
    

    输出结果如下:


    image

    6.第六个案例(接口的小封装-接口和逻辑代码分开控制-~)
    增加config.py主要存放接口

    # coding=utf-8
    
    # baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
    baseurl = 'http://suggest.taobao.com'
    # 假装是登录接口 baseurl=于楼上
    url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
    
    # 假装是注冊接口
    url_register = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
    
    # 假装是首页接口
    url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
    
    

    增加testapi.py

    # coding=utf-8
    import requests
    # 引入config配置接口的文件
    import config
    
    # 发送请求 使用config.来调用想要的接口 调用首页接口
    r = requests.get(config.url_home)
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    print(status)
    # 请求的内容
    j = r.json()
    # 判断接口返回内容里面,有没有 裤子女夏 内容
    # 裤子女夏  增加了一个1
    if '裤子女夏1' in str(j):
        print('存在此数据')
    else:
        print('不存在此数据')
    print(j)
    
    

    输出结果如下:


    image

    用心的同学已经发现了,这样的话每次接口变了链接等,只需要修改config文件即可 不用去逻辑代码里面去找了


    7.第七个案例(接口的小封装-接口和逻辑代码分开控制-~)

    不知道有没有同学发现,如果是post接口的话,参数还是需要在逻辑代码单独写吗?

    接下来咱们解决这个事情~~,参数也进行分离化

    config.py进行修改如下

    # coding=utf-8
    
    # baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
    baseurl = 'http://suggest.taobao.com'
    # 假装是登录接口
    url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
    
    # 假装是注冊接口 假装是post请求 拼接成字典格式,通过吗,通过key value的形式获取
    # 注册接口是key  链接是value
    url_register = {'注册接口': baseurl + '/sug', 'parmras': {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}}
    
    # 假装是首页接口
    url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
    
    

    testapi.py 修改如下

    # coding=utf-8
    import requests
    # 引入config配置接口的文件
    import config
    
    # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
    r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    # 输出状态码
    print(status)
    # 因为展示测试的接口没有json,所以只能输出content啦~
    print(r.content)
    
    

    输出结果:


    image

    总结:用到了 字典 的小知识点,还用到了引用包的小知识点,不会的同学 可以评论区留言,或者加qq群一起学习讨论
    另外网上有很多基础知识~一搜一堆的!!


    8.第八个案例(接口的小封装-执行多个接口~)

    这次只需要修改testapi.py即可 代码如下:

    # coding=utf-8
    import requests
    # 引入config配置接口的文件
    import config
    
    
    # 测试注册接口的函数
    def test_register():
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 进行接口的状态码断言,等于200则认为通过,不是200不通过
        if status == 200:
            print('状态码校验过')
        else:
            print('状态码校验不通过')
        # 输出状态码
        print(status)
        # 因为展示测试的接口没有json,所以只能输出content啦~
        print(r.content)
    
    
    # 测试登录接口的函数
    def test_login():
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.post(config.url_login)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 进行接口的状态码断言,等于200则认为通过,不是200不通过
        if status == 200:
            print('状态码校验过')
        else:
            print('状态码校验不通过')
        # 输出状态码
        print(status)
        # 因为展示测试的接口没有json,所以只能输出content啦~
        print(r.json())
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '裤子男夏季'
        # 将接口返回的信息转为字符串类型,in 是判断接口的返回值里面 存不存在 预期结果的值,存在就通过 不存在就不通过
        if expected in str(r.json()):
            print('断言通过')
        else:
            print('断言不通过')
    
    
    # 调用执行测试接口
    test_register()
    print('执行了 测试注册接口的函数')
    # 调用执行登录接口
    test_login()
    print('执行了 测试登录接口的函数')
    
    

    总结:本次使用函数体的小知识点,和调用函数的小知识,如果感觉到自己不会学习赶紧去补充下自己的知识吧~
    输出结果如下:


    image

    9.第九个案例(接口的小封装-增加)

    本次引用unittest测试框架,进行断言

    testapi.py修改如下

    # coding=gbk
    import requests
    # 引入config配置接口的文件
    import config
    # 增加单元测试框架
    import unittest
    from applet import HMLRunner
    
    """
    注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
    """
    
    
    # 创建一个类型,执行用例的类,继承unittest的testcase类
    class Testcase(unittest.TestCase):
    
        # 测试注册接口的函数
        def test_register(self):
            # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
            r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
            # 请求的状态码 200代表成功
            status = r.status_code
            # 使用unittest的断言
            self.assertEqual(200, r.status_code)
            # 输出状态码
            print(status)
            # 因为展示测试的接口没有json,所以只能输出content啦~
            print(r.content)
            print(r.text)
    
        # 测试登录接口的函数
        def test_login(self):
            # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
            r = requests.post(config.url_login)
            # 请求的状态码 200代表成功
            status = r.status_code
            # 使用unittest的断言
            self.assertEqual(200, r.status_code)
            # 输出状态码
            print(status)
    
            print(r.json())
            # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
            expected = '裤子男夏季'
            # 获取接口的返回信息
            j = r.json()
            # 输出接口的返回信息
            print(j)
            # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
            # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
            self.assertEqual(expected, j['result'][1][0])
            print(r.text)
    
    
    if __name__ == '__main__':
        import time
    
        # 定义测试用例的目录为当前目录
        test_dir = './'
        # 加载测试用例,根据文件路径 执行test开头的py文件
        discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
        # 按照一定的格式获取当前的时间
        now = time.strftime("%Y-%m-%d %H-%M-%S")
    
        # 定义报告存放路径 目前是存在运行的当前目录
        filename = now + 'test_result.html'
        # 打开file文件流
        fp = open(filename, "wb")
        # 定义测试报告
    
        runner = HMLRunner.HTMLTestRunner(stream=fp,
                                          title=u"测试报告(史无前例)",
                                          description=u"测试用例执行情况,qq群:234922431")
        # 运行测试
        runner.run(discover)
        # 关闭报告文件
        fp.close()
    
    
    

    执行结果如下:


    image

    看到 Ran 2 tests in 0.212s
    意思是执行了两个用例,用时0.212秒


    10.第十个案例(没有测试报告是没有灵魂的~加一个测试报告)

    注意事项:本次使用HTMLTestRunner,生成测试报告,这个是需要自己安装的哦~

    HTMLTestRunner下载地址:https://pypi.org/project/HTMLTestRunner/

    如果你不想下载可以加qq群:来拿HTMLTestRunner文件哦

    也给你准备了网盘的下载链接:https://pan.baidu.com/s/1jpV98BTJ7iYutbpjJDeY6w

    提取码:u8ps

    testapi.py代码修改如下

    # coding=utf-8
    import requests
    # 引入config配置接口的文件
    import config
    # 增加单元测试框架
    import unittest
    # 引入HTMLTestRunner生成测试报告
    import HTMLTestRunner
    
    """
    注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
    """
    # coding=gbk
    import requests
    # 引入config配置接口的文件
    import config
    # 增加单元测试框架
    import unittest
    from applet import HMLRunner
    
    """
    注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
    """
    
    
    # 创建一个类型,执行用例的类,继承unittest的testcase类
    class Testcase(unittest.TestCase):
    
        # 测试注册接口的函数
        def test_register(self):
            # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
            r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
            # 请求的状态码 200代表成功
            status = r.status_code
            # 使用unittest的断言
            self.assertEqual(200, r.status_code)
            # 输出状态码
            print(status)
            # 因为展示测试的接口没有json,所以只能输出content啦~
            print(r.content)
            print(r.text)
    
        # 测试登录接口的函数
        def test_login(self):
            # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
            r = requests.post(config.url_login)
            # 请求的状态码 200代表成功
            status = r.status_code
            # 使用unittest的断言
            self.assertEqual(200, r.status_code)
            # 输出状态码
            print(status)
    
            print(r.json())
            # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
            expected = '裤子男夏季'
            # 获取接口的返回信息
            j = r.json()
            # 输出接口的返回信息
            print(j)
            # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
            # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
            self.assertEqual(expected, j['result'][1][0])
            print(r.text)
    
    
    if __name__ == '__main__':
        import time
    
        # 定义测试用例的目录为当前目录
        test_dir = './'
        # 加载测试用例,根据文件路径 执行test开头的py文件
        discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
        # 按照一定的格式获取当前的时间
        now = time.strftime("%Y-%m-%d %H-%M-%S")
    
        # 定义报告存放路径 目前是存在运行的当前目录
        filename = now + 'test_result.html'
        # 打开file文件流
        fp = open(filename, "wb")
        # 定义测试报告
    
        runner = HMLRunner.HTMLTestRunner(stream=fp,
                                          title=u"测试报告(史无前例)",
                                          description=u"测试用例执行情况,qq群:234922431")
        # 运行测试
        runner.run(discover)
        # 关闭报告文件
        fp.close()
    

    展示效果如下:

    image
    image
    总结:可能会遇到的小问题:如果是unittest运行的话,不会执行if name == 'main':下面的代码,所以要执行当前整个类才行,alt+shift+f10 选择当前py文件执行就能生成测试报告了~

    qq群:234922431
    欢迎热爱学习进步的同学,共同成长进步


    如果你感觉很简单没有难度,接下来我准备了接口测试实战

    框架支持如下功能:

    • 支持成千上万条接口用例进行测试(经过测试中配电脑,3分钟执行完成5000条接口测试)
    • 详细的Excel测试报告和美观的allure报告输出(这里能让你掌握自定义allure报告)
    • 支持不同类型上传文件(base64,file)上传文件格式
    • 本框架采用多线程和单例等设计模式,代码简单而简约适合初中级学者,使用学习
    • 摆脱普通的测试框架和断言框架的约束,他们能做到的我们一样也可以,学习简单~

    接口自动化测试实战

    这是一个从0到1的过程,一步一步搭建的测试接口框架,本教程从开始写框架的思路,和实现过程深入解析,并且深入到了每个相关的的各个细节,不论你是刚入门的菜鸟,还是一个懂编码经验的工程师,相信本系列的文章都会对你有所帮助。
    你即可以学到从0到1搭建自动化的编码思想,也可以改变成一个接口自动化工具,在需要的时候可以自己更改代码和维护。

    你可以收获什么?

    1.完善python基础和编程思
    2.有一个设计测试框架思维
    3.提升自己能力,在也不怕面试没有编码经验
    4.一个可以拿出手的项目,简历中的一个亮点
    5.干货分享相比搜索到各种知识,这篇文章或许略有难度,但收获一定是你想不到的

    快来学习吧,点击开启新的学习篇章:https://www.jianshu.com/p/57e4d0750e87
    公众号:关注我为你分享更多测试干货,原创干货,和自动化实战等项目开源

    image
    快来学习吧,点击开启新的学习篇章:https://www.jianshu.com/p/57e4d0750e87

    转载注明出处

    相关文章

      网友评论

        本文标题:接口测试基础篇(史上最详细)

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