栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

进阶之路-从0开始学接口测试(4)--接口自动化框架搭建

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

进阶之路-从0开始学接口测试(4)--接口自动化框架搭建

自动化测试流程

自动化测试主要执行阶段:

  1. 冒烟测试(主流程是否能正常运行)
  2. 回归测试(修复bug之后,测试功能是否正常,是否会影响其他模块)
  3. 持续集成

要在进行过1次以上的手工测试,熟悉业务流程和模块功能之后,才进行自动化测试

需求分析

一个项目接到手之后,我们需要进行需求分析

  1. 需求文档,功能展示以及交互
  2. 接口文档,后端数据是怎么跟前端进行传输

        -纸质(电子)

        -open api(网站)

        -抓包(没有接口文档的时候,需要自己抓包查看请求需要的参数)

项目前缀:一个服务器/端口下,有多个子项目

接口文档会说明响应体的一些字段,还有请求头必须的参数,请求体传入参数的格式

还会对每一个接口进行详细的说明

        3.数据库账号,地址,数据结构能熟悉整个项目的轮廓,字段,数据表之间的关联

        4.测试环境,环境搭建

        5.原型图,逻辑图

 测试计划

主要由项目经理完成

-可行分析

-风险因素

-时间管控

-技术

-测试优先级

-是否需要自动化(哪些场景,功能)

测试用例 

这里的测试用例是指自动化测试需要的数据,需要手工提取

任何一个项目或者是新功能,会先进行手工测试,也是要进行全量的用例编写,然后用工具手工执行一遍

如:每一条接口,每一组测试数据,都手工用postman进行访问,然后把数据记录在excel当中

 

用例数据可以根据需求文档,接口文档的要求,用等价类,边界值等测试方法获取.如:

 得到数据后,通过手工测试得到用例,写入excel

 或者通过抓包,postman等调试工具,得到用例数据和预期结果,写入测试用例

 

json数据一定要符合规范.使用双引号

接口用例:最好一个接口一个表单,不要把多个接口都写入同一个表单,方便管理

手工测试告一段落,目前为止还没开始自动化

手工测试完一遍,收集完用例之后,就开始准备编写自动化脚本

执行:编写自动化测试用例

-首先验证自动化测试程序是否能正常运行,先把功能实现

-写一个单独的自动化测试用例函数.test_,需要有请求发送,得到相应结果.断言,生成报告

  1. 准备测试数据
  2. 发送请求接口,得到实际结果
  3. 断言,预期结果和实际结果

 

import unittest
import requests

class TestRegister(unittest.TestCase):

    def test_register_1(self):
        #准备测试数据
        method = "POST"
        url = r"http://api.lemonban.com:8766/futureloan/member/register"
        headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
        json_data = {"mobile_phone": "", "pwd": "123"}
        expected = {
                        "code": 1,
                        "msg": "手机号为空",
                        "data": None,
                        "copyright": "Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"
                    }

        #访问接口,得到实际结果
        response = requests.request(url=url,method=method,headers=headers,json=json_data)
        actual = response.json()
        #断言
        self.assertEqual(expected,actual)

    def test_register_2(self):
        # 准备测试数据
        method = "POST"
        url = r"http://api.lemonban.com:8766/futureloan/member/register"
        headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
        json_data = {"mobile_phone": "151", "pwd": "123"}
        expected = {
                        "code": 2,
                        "msg": "密码格式为8到16位",
                        "data": None,
                        "copyright": "Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"
                    }


        # 访问接口,得到实际结果
        response = requests.request(url=url, method=method, headers=headers, json=json_data)
        actual = response.json()
        # 断言
        self.assertEqual(expected, actual)

 脚本的基本功能能够实现,运行能够成功之后,才开始引入ddt,ddt适用场景:数据不同,测试步骤一样,接口测试比较吻合

优化代码,实现DDT

1.准备框架需要的文件夹和包,把相应的文件放入

 

 2.导入相应的模块和函数

--导入unittest,requests(单元测试框架,接口框架)

import unittest
import requests

-导入所需的函数,read_excel(读取excel数据),ddt,list_data(参数化),get_log(日志)

from common.read_excel import read_excel
from unittestreport import ddt,list_data
from common.get_logging import get_log

-导入函数所需要的文件路径(动态路径)

from config.config import case_file,host,log_1_file

-导入json转换字典(反序列化)所需要的库

import json

3.得到测试数据(读取excel)

通过config里得到excel的动态路径,还有表单名称

#获取测试数据
data1 = read_excel(case_file,"register")

4.实现参数化

#参数化
@ddt
class TestRegister(unittest.TestCase):

    @list_data(data1)
    def test_register(self,test_data):

变量名称不要冲突

5.获取数据

@ddt
class TestRegister(unittest.TestCase):

    @list_data(data1)
    def test_register(self,test_data):
        #准备测试数据
        my_logger.info(f"正在测试{test_data['title']}")
        method = test_data["method"]
        url_address = test_data["url"]
        #将json格式的字符串转换成字典
        headers = json.loads(test_data["headers"])
        json_data = json.loads(test_data["json"])
        expected = json.loads(test_data["expected"])

        #访问接口,得到实际结果
        response = requests.request(url=f"{host}{url_address}",method=method,headers=headers,json=json_data)
        actual = response.json()

注意:

从excel读取的headers,json,expected的数据格式都是json格式的字符串,所以要通过反序列化转换成字典,才能传入访问接口的参数

我们还需要把域名(host)单独存放到配置文件中,因为测试环境有可能会改变,比如域名和端口改变,而接口地址基本不会变,如果以后端口或者域名改变,我们只需要修改配置文件就可以了

 

6.断言

#断言
        try:
            self.assertEqual(expected,actual)
            my_logger.info("测试用例通过")
        except AssertionError as e:
            my_logger.error("测试用例不通过")
            raise e
        finally:
            my_logger.info("测试完成")

我们在设计框架的时候,难免会遇到各种各样的问题,导入数据失败,函数运行失败等报错,要熟练运用断点来查看问题的原因

-程序报错,从报错信息中查看error message

-找到报错行,报错信息中自己写的文件,点击链接定位到报错行号

-断点打在可能报错的行数或者早于该行

完整的项目代码:

import unittest
import requests
from config.config import case_file,host,log_1_file
from common.read_excel import read_excel
from unittestreport import ddt,list_data
from common.get_logging import get_log
import json

#获取测试数据
data1 = read_excel(case_file,"register")
#获取log
my_logger = get_log(log_1_file)
#参数化
@ddt
class TestRegister(unittest.TestCase):

    @list_data(data1)
    def test_register(self,test_data):
        #准备测试数据
        my_logger.info(f"正在测试{test_data['title']}")
        method = test_data["method"]
        url_address = test_data["url"]
        #将json格式的字符串转换成字典
        headers = json.loads(test_data["headers"])
        json_data = json.loads(test_data["json"])
        expected = json.loads(test_data["expected"])

        #访问接口,得到实际结果
        response = requests.request(url=f"{host}{url_address}",method=method,headers=headers,json=json_data)
        actual = response.json()
        #断言
        try:
            self.assertEqual(expected,actual)
            my_logger.info("测试用例通过")
        except AssertionError as e:
            my_logger.error("测试用例不通过")
            raise e
        finally:
            my_logger.info("测试完成")

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/343974.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号