• Python接口测试入门


    接口测试基础篇

    用几个简单的案例,带你轻松了解接口测试

    首先了解一下接口测试的重要性:

    接口测试有什么要求呢?

    首先需要清晰的接口文档,标准如下:

    • 接口名称
    • 接口类型
    • 输入参数
    1. 每个参数名;
    2. 每个参数类型;
    3. 每个参数业务含义;
    4. 每个是否可空;
    5. 每个字段长度(可选,一般需要提供,有严格要求的字段需特别注明);
    • 输出参数

      状态码;

      提示信息;

      每个参数名,每个参数类型;

      每个参数业务含义;

      每个字段长度;

    接口通用基本要求:(借鉴别人的总结)

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

    接下来用几个简单的案例开始接口测试之旅

    准备工作:

    案例一:发送一个get请求

    import requests
    
    # 请求的链接
    url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?postId=0'
    # 发送get请求
    r = requests.get(url)
    # 请求的状态码 200代表成功
    status = r.status_code
    print(status)
    # 请求的内容
    j = r.json()
    
    print(j)
    

    输出结果:

    案例二:发送一个post请求

    import requests
    # 请求的链接
    url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/level/list'
    
    # post请求以字典格式传入
    data = {
        "pageInfo": {
            "page": 1,
            "size": 3
        },
        "query": {
            "postId": ""
        }
    }
    
    # 发送post请求
    r = requests.post(url, data)
    
    # 请求的状态码 200代表成功
    status = r.status_code
    print(status)
    

    输出结果:

    import requests
    # 请求的链接
    url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/level/list'
    
    # post请求以字典格式传入
    headers = {"Content-Type": "application/json"}
    data = {
        "pageInfo": {
            "page": 1,
            "size": 3
        },
        "query": {
            "postId": ""
        }
    }
    
    # 发送post请求
    r = requests.post(url, data=json.dumps(data), headers=headers)
    
    # 请求的状态码 200代表成功
    status = r.status_code
    print(status)
    
    # 请求的内容
    print(r.content)
    

    输出结果:

    思考:对requests获取的原始数据,有几种形式?

    https://www.jianshu.com/p/0e0336b370f3

    案例三:接口状态码断言

    import requests
    
    # 请求的链接
    url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?postId=0'
    # 发送请求
    r = requests.get(url)
    
    # 请求的状态码 200代表成功
    status = r.status_code
    
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('用例测试通过')
    else:
        print('测试不通过')
        
    print(status)
    # 请求的内容
    j = r.json()
    print(j)
    

    输出结果:

    案例四:接口内容断言-正常情况

    import requests
    
    # 请求的链接
    url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?postId=0'
    # 发送请求
    r = requests.get(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)
    

    输出结果:

    案例五:接口内容断言-异常情况

    判断接口返回内容里面,有没有 ‘权证部测试’ 内容

    import requests
    
    # 请求的链接
    url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?postId=0'
    # 发送请求
    r = requests.get(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)
    

    输出结果:

    讲到这里已经知道如何发送请求,如何使用断言;学习完大家还需要多敲多练。
    思考:当url、path、data发生变化每次都需要更改代码是不是很麻烦!有什么办法可以解决吗?
    案例六:封装接口-将接口和逻辑代码分开控制**

    • 增加config.py存放接口
    # baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
    baseurl = 'https://dgateway.allhome.com.cn'
    
    # 职级字典表接口
    url_dictionaryList = baseurl + '/organization/v1/basic/people/position/dictionaryList?postId=0'
    
    • 增加testapi.py
    # 发送请求 使用config.来调用想要的接口 调用职级字典表
    r = requests.get(config.url_dictionaryList)
    
    # 请求的状态码 200代表成功
    status = r.status_code
    
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    print(status)
    
    # 请求的内容
    j = r.json()
    
    # 判断接口返回内容里面,有没有 权证部 内容
    # 权证部  增加了一个1
    if '权证部' in str(j):
        print('存在此数据')
    else:
        print('不存在此数据')
    print(j)
    

    输出结果:

    练习到这个案例,会发现将接口封装后,每次接口链接变了,只需要修改config文件即可

    案例七:封装接口-将接口和逻辑代码分开控制

    上面讲到了如何将url与逻辑代码分开控制,但如果是post接口的话,参数也要进行分离

    下面我们要对config.py进行修改

    # baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
    baseurl = 'https://dgateway.allhome.com.cn'
    
    # 职级字典表接口
    url_dictionaryList = baseurl + '/organization/v1/basic/people/position/dictionaryList?postId=0'
    
    # 查询职级列表接口
    url_list = {
        '接口': baseurl + '/organization/v1/basic/people/level/list',
        'headers': {"Content-Type": "application/json"},
        'data': {
            "pageInfo": {
                "page": 1,
                "size": 3
            },
            "query": {
                "postId": ""
            }
        }
    }
    

    testapi.py修改

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

    输出结果:

    总结:用到了 字典  的小知识点,还用到了 引用包 的小知识点(网上资料特别多,不懂的可以自己查阅资料)

    这个案例讲完已经学会了使用 config 分开控制接口和逻辑代码,本次课程也就结束了!大家课后要先复习本次课程讲解的内容,查阅相关的资料进行巩固。感谢大家的捧场,希望大家共同学习共同进步!

    温馨提示:下一节我们将会学到如何对接口进行封装、引用unittest测试框架进行断言、生成测试报告

    接口测试基础篇(二)

    上一讲学会了使用 config 分开控制接口和逻辑代码,下面继续学习接口封装

    案例八:封装接口-执行多个接口

    修改testapi.py即可

    import json
    import requests
    # 引入config配置接口的文件
    import config as j
    
    
    # 测试查询职级列表接口的函数
    def test_list():
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(url=j.url_list['接口'], data=json.dumps(j.url_list['data']), headers=j.url_list['headers'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 进行接口的状态码断言,等于200则认为通过,不是200不通过
        if status == 200:
            print('状态码校验过')
        else:
            print('状态码校验不通过')
        # 输出状态码
        print(status)
        print(r.json())
    
    
    # 测试接口的函数
    def test_dictionaryList():
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.get(url=j.url_dictionaryList)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 进行接口的状态码断言,等于200则认为通过,不是200不通过
        if status == 200:
            print('状态码校验过')
        else:
            print('状态码校验不通过')
        # 输出状态码
        print(status)
        print(r.json())
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '权证部'
        # 将接口返回的信息转为字符串类型,in 是判断接口的返回值里面 存不存在 预期结果的值,存在就通过 不存在就不通过
        if expected in str(r.json()):
            print('断言通过')
        else:
            print('断言不通过')
    
    
    # 调用执行测试接口
    test_list()
    print('执行了 测试列表接口的函数')
    # 调用执行测试接口
    test_dictionaryList()
    print('执行了 测试字典接口的函数')
    

    输出结果:

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

    案例九:封装接口-引用unittest测试框架,进行断言

    # coding=gbk
    import json
    import requests
    # 引入config配置接口的文件
    import config
    # 增加单元测试框架
    import unittest
    """
    注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
    """
    
    # 创建一个类型,执行用例的类,继承unittest的testcase类
    class Testcase(unittest.TestCase):
    
        # 测试注册接口的函数
        def test_list(self):
            print('开始执行测试用例!')
            # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
            r = requests.post(url=config.url_list['接口'], data=json.dumps(config.url_list['data']),
                              headers=config.url_list['headers'])
            # 请求的状态码 200代表成功
            status = r.status_code
            # 使用unittest的断言
            self.assertEqual(200, r.status_code)
            # 输出状态码
            print(status)
            print(r.json())
            print(r.text)
            print('测试结束!')
    
        # 测试登录接口的函数
        def test_dictionaryList(self):
            print('开始执行测试用例!')
            # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
            r = requests.get(config.url_dictionaryList)
            # 请求的状态码 200代表成功
            status = r.status_code
            # 使用unittest的断言
            self.assertEqual(200, r.status_code)
            # 输出状态码
            print(status)
            # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
            expected = '权证部'
            # 获取接口的返回信息
            j = r.json()
            # 输出接口的返回信息
            print(j)
            # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
            self.assertEqual(expected, j['result'][0]['label'])
            print(r.text)
            print('测试结束!')
    
    if __name__ == '__main__':
    
    	# 定义测试用例的目录为当前目录
        test_dir = './'
    
        # 加载测试用例,根据文件路径 执行test开头的py文件
        discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
    

    输出结果:

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

    案例十:增加测试报告

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

    testapi.py修改如下:

    # coding=gbk
    import HTMLTestReportCN
    import json
    import time
    import unittest
    import requests
    # 引入config配置接口的文件
    import config
    
    # 创建一个类型,执行用例的类,继承unittest的testcase类
    
    
    class Testcase(unittest.TestCase):
    
        # 测试注册接口的函数
        def test_list(self):
            print(u'开始执行测试用例!')
            # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
            r = requests.post(url=config.url_list['接口'], data=json.dumps(config.url_list['data']),
                              headers=config.url_list['headers'])
            # 请求的状态码 200代表成功
            status = r.status_code
            # 使用unittest的断言
            self.assertEqual(200, r.status_code)
            # 输出状态码
            print(status)
            print(r.json())
            print(r.text)
            print(u'测试结束!')
    
        # 测试登录接口的函数
        def test_dictionaryList(self):
            print(u'开始执行测试用例!')
            # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
            r = requests.get(config.url_dictionaryList)
            # 请求的状态码 200代表成功
            status = r.status_code
            # 使用unittest的断言
            self.assertEqual(200, r.status_code)
            # 输出状态码
            print(status)
            # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
            expected = '权证部'
            # 获取接口的返回信息
            j = r.json()
            # 输出接口的返回信息
            print(j)
            # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
            # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
            self.assertEqual(expected, j['result'][0]['label'])
            print(u'测试结束!')
    
    
    if __name__ == '__main__':
    
        # 定义测试用例的目录为当前目录
        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('./test_result.html', "wb")
        # 定义测试报告
    
        runner = HTMLTestReportCN.HTMLTestRunner(stream=fp, title=u"测试报告", description=u"测试用例执行情况")
        # 运行测试
        runner.run(discover)
        # 关闭报告文件
        fp.close()
    

    测试报告:

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

  • 相关阅读:
    JRE、JDK和JVM之间的关系
    操作系统——CPU、计算机的构成
    为什么要用Java泛型
    【docker】 centos7 下 使用docker 安装 LNMP
    【docker】 centos7 安装docker
    【laravel5.6】 IlluminateDatabaseQueryException : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
    【truffle】Error: `truffle init` no longer accepts a project template name as an argument.
    【宝塔面板】pm2 安装没反应问题
    【node.js】】MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。
    【git】 linux 环境安装git
  • 原文地址:https://www.cnblogs.com/wyunuo/p/11442217.html
Copyright © 2020-2023  润新知