IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 进阶之路-从0开始学接口测试(4)--接口自动化框架搭建 -> 正文阅读

[系统运维]进阶之路-从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("测试完成")

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:13:03  更:2021-10-24 15:15:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:04:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码