接口自动化测试思路和实战(3):测试库框架

测试库框架

  与模块化测试脚本框架很类似,并且具有同样的优点。不同的是测试库框架把待测应用程序分解为过程和函数而不是脚本(而测试脚本中只是包含调用函数的用例即可)。这个框架需要创建描述模块、片断以及待测应用程序的功能库文件。

场景: 在模块化框架中,我们发现常用的获取 token过程由于调用频繁,经常改动导致不好维护,所以做成一个函数进行调用,而其它所有的接口都可能会进行变更;

比如: 用例如下:

获取token---创建标签。

获取token---创建标签---删除刚创建的标签

获取token---创建标签---查询标签进行查询

下面通过测试库框架修改代码,改动的比较大,建议把上方写的项目重新复制一份,做个备份

步骤1、在common文件夹下新建common_api_info.py文件,把所有的api接口做个封装

方法封装,类封装都可以

 

 编写代码:

# encoding: utf-8
# @author: Jeffrey
# @file: common_api_info.py
# @time: 2022/7/26 22:05
# @desc: 测试库封装

import json

#该模块存放所有的接口定义及接口信息
class CommonApiInfo:

    def __init__(self,session,hosts):
        self.session = session
        self.hosts = hosts

    def get_access_token_api(self,grant_type,appid,secret):
        """获取token接口信息"""
        url_params = {"grant_type": grant_type,
                      "appid": appid,
                      "secret": secret}
        response = self.session.get(url="https://%s/cgi-bin/token" % self.hosts,
                                    params=url_params)
        return response

    def create_user_tag_info(self,token_value,tag_name):
        '''创建标签接口信息'''
        url_params = {"access_token": token_value}
        tag_info = { "tag": { "name": tag_name } }
        
        tag_str = json.dumps(tag_info, ensure_ascii=False)
        response = self.session.post(url="https://%s/cgi-bin/tags/create" % self.hosts,
                                     params = url_params,
                                     data=tag_str.encode('utf-8'))
        return response

    # 修改标签接口信息
    # 查询标签接口信息

步骤2、修改common_function.py文件

 

 编写代码:

# encoding: utf-8
# @author: Jeffrey
# @file: common_function.py
# @time: 2022/7/26 21:01
# @desc: 模块化框架
import jsonpath
from common.common_api_info import CommonApiInfo

def get_access_token_value(session_obj,hosts):
    """获取access_token的值"""
    response = CommonApiInfo(session_obj,hosts).get_access_token_api('client_credential',
                                                          'wxf14419077f707856',
                                                          '92a113bd4b5ffdc72144740dc7123c99')
    # 获取响应json中的access_token的值
    token_value = jsonpath.jsonpath(response.json(), "$.access_token")[0]
    return token_value

步骤3、修改test_get_access_token_api.py文件

 

 编写代码:

# encoding: utf-8
# @author: Jeffrey
# @file: test_get_access_token_api.py
# @time: 2022/7/24 18:08
# @desc:

# 导入模块顺序:内置模块、第三方模块、自定义模块
import unittest
import requests
import jsonpath
from common import local_config
from common.common_api_info import CommonApiInfo

class TestGetAccessTokenApi(unittest.TestCase):

    def setUp(self) -> None:
        self.session = requests.session()
        self.hosts = local_config.HOSTS
    def tearDown(self) -> None:
        self.session.close()

    def test_case_01(self):
        '''[api_case_01] 测试获取access_token能否正常调用'''

        response = CommonApiInfo(self.session,self.hosts).get_access_token_api(
            'client_credential','wxf14419077f707856','92a113bd4b5ffdc72144740dc7123c99'
        )
        # 获取响应json中的access_token的值
        actual_result = jsonpath.jsonpath(response.json(), "$.access_token")


        self.assertTrue(actual_result, "api_case_01 执行失败")  #非空,非0 都返回True为真

    def test_case_02(self):
        '''[api_case_02] 测试获取access_token接口在appid错误时,能否正常处理错误'''

        response = CommonApiInfo(self.session,self.hosts).get_access_token_api(
            'client_credential','wxf14419077f707','92a113bd4b5ffdc72144740dc7123c99'
        )
        # 获取响应json中的errcode的值,因为jsonpath返回的是列表,故加上下标0
        actual_result = jsonpath.jsonpath(response.json(), "$.errcode")[0]

        self.assertEqual(actual_result,40013,  "api_case_02 执行失败")



if __name__ == '__main__':
    unittest.main(verbosity=2)

查看执行结果:

 

 

步骤4、修改test_create_user_tag_api.py文件代码;

 

 编写代码:

# encoding: utf-8
# @author: Jeffrey
# @file: test_create_user_tag_api.py
# @time: 2022/7/24 19:02
# @desc:
import unittest
import requests
import jsonpath
import json
from common import common_function
from common import local_config
from common.common_api_info import CommonApiInfo


class TestCreateUserTagApi(unittest.TestCase):

    def setUp(self) -> None:
        self.session = requests.session()
        self.hosts = local_config.HOSTS
    def tearDown(self) -> None:
        self.session.close()

    def test_case_01(self):
        '''[api_case_03] 测试正常进行创建标签接口调用'''
        #获 取access_token
        token_value = common_function.get_access_token_value(self.session,self.hosts)


        # 解决中文乱码问题;模拟post请求时,携带json 数据包含中文发送给服务器会转码
        # 方式一:json.dumps()
        # 获取创建标签接口
        response = CommonApiInfo(self.session,self.hosts).create_user_tag_info(
            token_value,'深圳人5'
        )

        # # 方式二:修改requests中的models.py中的源码,修改完后
        # response = self.session.post(url="https://api.weixin.qq.com/cgi-bin/tags/create",
        #                              params=tag_url_params,
        #                              json=tag_boby)
        # print(response.json())


        # 获取响应json的tag的name值,因为jsonpath返回的是列表,故加上下标0
        actual_result = jsonpath.jsonpath(response.json(), "$.tag.name")[0]


        self.assertEqual(actual_result,"深圳人5", "api_case_03 执行失败")


if __name__ == '__main__':
    unittest.main(verbosity=2)

查看执行结果:

 

 

步骤5、再执行run_api_tests.py文件,执行所有用例;

 

 

 

 

好处: 1、易于维护2、测试用例脚本更多的去关注测试过程而淡化接口细节3、减少代码冗余

 

posted @ 2023-02-18 09:19  奔跑在路上you  阅读(149)  评论(0编辑  收藏  举报