【测试联调】如何在前后端测试联调时优雅的构造异常场景

这篇具有很好参考价值的文章主要介绍了【测试联调】如何在前后端测试联调时优雅的构造异常场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

背景

使用iptables实现

利用iptables丢弃某ip数据包

使用 -L 列出所有规则

IP 连通性 通信 测试

插入一条规则,丢弃此ip 的所有协议请求

列出所有规则

测试 丢弃规则内的IP 连通性

清除 规则列表的 限制

模拟ip进行丢包50%的处理。

mysql proxy 代理

proxy代码

直接使用pymysql 测试

Python 版本低于3.7

其他扩展

总结

资料获取方法


前景

当前的应用都使用了前后端分离的架构,前后端系统需要协同以实现各种功能。后端系统通常负责处理业务逻辑、数据存储和与其他服务的交互,而前端则负责用户界面和用户交互。而在前后端数据交互的过程中,各种异常和错误都有可能发生,确认异常发生时前后端系统的处理是否合理是测试验证中非常重要的一环。

在上一篇博客中我介绍了如何使用测试桩来隔离对环境的依赖,这次我们一起看看如何使用异常注入来应对联调中的异常场景。

使用iptables实现

在系统异常中,数据库连接失败、第三方服务不可用等都是比较典型的场景。常见的验证手段往往是前端的同学告知后台同学开启网络隔离,然后再进行验证。

利用iptables丢弃某ip数据包
使用 -L 列出所有规则

具体操作:

$  iptables     -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
IP 连通性 通信 测试
#  检查发现能 是否能正常 ping通
$  ping {数据库/后端地址IP}
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.*: icmp_seq=1 ttl=61 time=0.704 ms
64 bytes from 1.1.1.*: icmp_seq=2 ttl=61 time=0.802 ms           
^C
--- 1.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.704/0.753/0.802/0.049 ms
插入一条规则,丢弃此ip 的所有协议请求
$  iptables  -I   INPUT   -p   all   -s {数据库/后端地址IP}   -j   DROP
列出所有规则
$ iptables  -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  1.1.1.*        anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
测试 丢弃规则内的IP 连通性
$ ping 1.1.1.*
PING 1.1.1.1 (1.1.1.*) 56(84) bytes of data.
^C
--- 1.1.1.1 ping statistics ---
85 packets transmitted, 0 received, 100% packet loss, time 84312ms
清除 规则列表的 限制
$  iptables     -F
模拟ip进行丢包50%的处理。
iptables -I INPUT -s {后端IP} -m statistic --mode random --probability 0.5 -j DROP

上面这种方式能实现相关的联调,但是有两点可以改进的地方:

  • 这个方式最大的限制是会影响所有的调用这个系统的测试人员。
  • 需要人为的介入,每次都需要人为操作

那么有没有侵入更小,更优雅的异常场景验证方式呢?答案是肯定的。

mysql proxy 代理

更优雅的方式:写一个mysql proxy代理,让后端svr 直接连接这个proxy,proxy再连接真实的mysql。

  • 普通请求经过proxy时,proxy直接转发给真实mysql,并把mysql 的回包正常返回给调用端。
  • 当收到某个关键字(timeout)时,直接断开TCP连接,模拟连接DB超时场景
proxy代码
import asyncio

# 真实mysqlIP端口
mysql_host = settings.MYSQL_HOST
mysql_port = settings.MYSQL_PORT

# 处理客户端连接
async def handle_connection(client_reader, client_writer):
    # 连接到实际的 MySQL 服务器
    mysql_reader, mysql_writer = await asyncio.open_connection(mysql_host, mysql_port)

    # 转发握手包
    handshake_packet = await mysql_reader.read(4096)
    client_writer.write(handshake_packet)
    await client_writer.drain()

    # 处理客户端认证请求
    auth_packet = await client_reader.read(4096)
    mysql_writer.write(auth_packet)
    await mysql_writer.drain()

    # 转发认证响应
    auth_response = await mysql_reader.read(4096)
    client_writer.write(auth_response)
    await client_writer.drain()

    # 转发请求和响应
    while True:
        data = await client_reader.read(4096)
        if not data:
            break
        sql_query = data[5:].decode('utf-8')
        if "timeout" in sql_query:  # sql 包含timeout 关键字时,直接关闭连接
            await asyncio.sleep(1)
            break
        else:
            mysql_writer.write(data)
            await mysql_writer.drain()
            response = await mysql_reader.read(4096)
            client_writer.write(response)
            await client_writer.drain()
    # 关闭连接
    client_writer.close()
    mysql_writer.close()

async def main(host, port):
    server = await asyncio.start_server(handle_connection, host, port)
    async with server:
        await server.serve_forever()

# 使用示例
if __name__ == "__main__":
    # 本地监听 3307, svr 连接到3307
    host = "0.0.0.0"
    port = 3307

    asyncio.run(main(host, port))
直接使用pymysql 测试

下面的代码会在执行到第二条select 语句时超时:

import pymysql

connection = pymysql.connect(
    host="192.168.31.76",
    port=8899,
    # 真实mysql 账户信息
    user="{user}",
    password="{password}",
    database="mydb",

)

curs = connection.cursor()
curs.execute("select * from user where name='bingo';")
print(curs.fetchall())

curs.execute("insert into user set name='bingtime';")
connection.commit()

curs.execute("select * from user where name='timeoutbingo';")
print(curs.fetchall())
curs.close()
connection.close()
Python 版本低于3.7

低版本的Python没有asyncio.run 和server.serve_forever()需要修改main函数.

# 主函数,启动服务器并监听连接
async def main(host, port):
    server = await asyncio.start_server(handle_connection, host, port)
    try:
        # Python 3.6.5 中没有 server.serve_forever() 方法,所以需要使用一个无限循环来保持服务器运行。
        # 我们使用 asyncio.sleep() 来避免阻塞事件循环,使其可以处理其他任务,如新连接。
        while True:
            await asyncio.sleep(3600)  # 1 hour
    except KeyboardInterrupt:
        pass
    finally:
        server.close()
        await server.wait_closed()


# 使用示例
if __name__ == "__main__":
    host = "0.0.0.0"
    port = 3307

    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main(host, port))
    except KeyboardInterrupt:
        pass
    finally:
        loop.close()

其他扩展

写一个proxy,监听来往的SQL 语句:

import pymysql
import socket
import threading
# 配置
SERVER_ADDRESS = (settings.MYSQL_HOST, settings.MYSQL_PORT)  # 真实MySQL 服务器地址
PROXY_ADDRESS = ('0.0.0.0', 8899)  # 监听代理服务器地址

def print_query(data):
    try:
        command = data[4]
        if command == pymysql.constants.COMMAND.COM_QUERY:
            query = data[5:].decode("utf-8")
            print(f"SQL: {query}")
    except Exception as e:
        print(f"Error parsing packet: {e}")

def forward_data(src_socket, dst_socket, parser=None):
    while True:
        try:
            data = src_socket.recv(4096)
            if not data:
                break
            if parser:
                parser(data)
            dst_socket.sendall(data)
        except OSError as e:
            if e.errno == 9:
                break
            else:
                raise

def main():
    # 创建代理服务器套接字
    proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    proxy_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    proxy_socket.bind(PROXY_ADDRESS)
    proxy_socket.listen(5)
    print(f"Proxy server listening on {PROXY_ADDRESS}")

    while True:
        client_socket, client_address = proxy_socket.accept()
        print(f"Client {client_address} connected")

        # 连接到 MySQL 服务器
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.connect(SERVER_ADDRESS)

        try:
            # 创建线程转发客户端数据到服务器
            client_to_server = threading.Thread(target=forward_data, args=(client_socket, server_socket, print_query))
            client_to_server.start()

            # 创建线程转发服务器数据到客户端
            server_to_client = threading.Thread(target=forward_data, args=(server_socket, client_socket))
            server_to_client.start()

            # 等待线程完成
            client_to_server.join()
            server_to_client.join()

        finally:
            client_socket.close()
            server_socket.close()
            print(f"Client {client_address} disconnected")

if __name__ == "__main__":
    main()

如果使用上面的pymysql测试代码执行,会打印如下的信息:

Client ('127.0.0.1', 57184) connected
SQL: SET AUTOCOMMIT = 0
SQL: select * from user where name='bingo';
SQL: insert into user set name='bing21211';
SQL: COMMIT
SQL: select * from user where name='bingo';
SQL: select * from user where name='bingo';
SQL: select * from user where name='timeoutbingo';
Client ('127.0.0.1', 57184) disconnected

总结

通过实现合适的异常处理机制,可以确保用户在遇到问题时获得有用的反馈,验证这些处理机制能提高系统的稳定性和安全性。iptables 功能强大但是需要手动操作,mysql proxy代理功能直接,但是应用场景较为有限,大家可以根据实际情况进行选择。


资料获取方法

【留言777】

【测试联调】如何在前后端测试联调时优雅的构造异常场景,软件测试,程序人生,软件测试,软件测试工程师,程序人生,安全测试

【测试联调】如何在前后端测试联调时优雅的构造异常场景,软件测试,程序人生,软件测试,软件测试工程师,程序人生,安全测试

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~文章来源地址https://www.toymoban.com/news/detail-626193.html

到了这里,关于【测试联调】如何在前后端测试联调时优雅的构造异常场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【软件构造】黑盒测试与白盒测试

    按照 是否需要知道程序内部是如何实现 的,将测试分为 黑盒测试 与 白盒测试 。 需要知道程序内部是如何实现的—— 白盒测试 不需要知道程序内部是如何实现的—— 黑盒测试 白盒测试一般是 内部人员 即程序员进行测试 黑盒测试一般是 外部人员 如专门的测试人员和用户

    2023年04月15日
    浏览(44)
  • HIT 软件构造期末复习二 软件测试与测试优先的编程

    首先 需要明确一个关系,即设计者(工程师)与使用者(客户),在工程师实际开始软件设计时,需要先与使用者进行沟通交流,目的是根据使用者的需求开发出符合第一章中介绍的特性的高质量软件,如何判断我们的软件是符合需求的,最简单的办法就是检测(test),测

    2023年04月13日
    浏览(41)
  • [软件测试] 07 黑盒 场景法 习题

    软件测试期末复习系列 课件知识点整合 : 软件测试基础 白盒测试 黑盒测试 PTA习题汇总 : 软件测试基础 白盒测试-逻辑覆盖测试 白盒测试-基本路径测试 白盒测试-静态测试 黑盒测试-等价类划分 黑盒测试-边界值测试 黑盒测试-场景法 提示 : 篇幅较长,可以使用 Ctrl+F ,在

    2024年02月04日
    浏览(48)
  • 软件测试|Selenium StaleElementReferenceException 异常分析与解决

    简介 Selenium 是一个流行的自动化测试工具,用于模拟用户与网页交互。然而,当我们在使用 Selenium 时,可能会遇到一个常见的异常,即 StaleElementReferenceException 。这个异常通常在我们尝试与网页上的元素交互时抛出,可能会导致我们的自动化测试脚本运行失败。本文将深入探

    2024年01月17日
    浏览(53)
  • 如何优雅的处理异常

    作者:京东零售  秦浩然 Java 语言按照错误严重性,从 throwale 根类衍生出 Error 和 Exception 两大派系。 Error(错误): 程序在执行过程中所遇到的硬件或操作系统的错误。错误对程序而言是致命的,将导致程序无法运行。常见的错误有内存溢出,jvm 虚拟机自身的非正常运行,

    2023年04月25日
    浏览(78)
  • 软件测试|Selenium 元素不可交互异常ElementNotInteractableException问题分析与解决

    简介 在使用 Selenium 进行 Web 自动化测试时,我们可能会遇到各种异常情况。其中之一就是 ElementNotInteractableException 异常,这通常意味着在尝试与页面元素交互时出现了问题。本文将详细介绍这个异常的原因、可能的解决方法,并提供示例代码来帮助你更好地理解和处理这种情

    2024年02月08日
    浏览(62)
  • 浪花 - 搜索标签前后端联调

    前传:浪花 - 根据标签搜索用户-CSDN博客 目录 一、完善后端搜索标签接口 二、前后端搜索标签接口的对接 1. 使用 Axios 发送请求 2. 解决跨域问题 3. Axios 请求传参序列化 4. 接收后端响应数据 5. 处理后端响应数据格式 6. 搜索结果为空的页面展示  附:解决跨域问题的几种方式

    2024年01月17日
    浏览(36)
  • vue框架前后端联调流程

    什么是前后端联调 定义 在我们开发的过程中,发送请求的ajax数据都不是后端返回的真数据,而是我们自己通过接口mock模拟的假数据,当前端的代码编写完成后,后端的接口也写好后,我们就需要把mock数据换点,尝试使用后端提供的数据,进行一个前后端的调试,我们会把

    2024年02月06日
    浏览(33)
  • 前后台协议联调&拦截器

    目标 能够完成前后台功能整合开发 掌握拦截器的编写 创建一个Web的Maven项目 pom.xml添加SSM整合所需jar包 创建对应的配置类 编写Controller、Service接口、Service实现类、Dao接口和模型类 resources下提供jdbc.properties配置文件 内容参考前面的项目或者直接使用前面的项目进行本节内容

    2023年04月14日
    浏览(44)
  • 阿里云对象存储服务OSS前后联调

    申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址 全文共计11577字,阅读大概需要3分钟 在分布式集群系统中,前端通过浏览器上传图片给服务器存储时存在分库分表的情况,这就涉及到 文件存储 的情况,在高并发的情况下,考虑到服务器的性能和利用率

    2023年04月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包