快捷:通过胶水语言实现工作中测试流程并行、加速
通过胶水语言实现工作中测试流程并行、加速
- 通过胶水语言实现工作中测试流程并行、加速
- 工作场景(背景)
- 问题抽象(挑战)
- 如何做(行动)
- 获得了什么(结果)
- 后记
- 相关资源
通过胶水语言实现工作中测试流程并行、加速
尽可能自动化是计算机思维之一。一切事务尽可能pipeline化,然后再将pipeline中的环节尽可能自动化,这样在我看来就是在实践计算机思维,这种思维的养成是重要的。本篇文章是对近期工作中的一次有意思尝试的记录。
工作场景(背景)
近期遇到一个问题是工作中有一测试环节,测试周期为18个小时,且该测试动作频率较高。因此如果能够缩短测试周期,就能够更快的得到反馈和结论,为下一步动作提供数据支撑。
问题抽象(挑战)
正如优雅:从系统环境到依赖包的管理文章中提到,由于docker的便利性,开发、部署以及测试都转向了docker。此次所涉及到的测试环节,对应内涵:日常工作中docker的常用知识中的双(多)docker使用场景。
可以用下图来展示服务程序和测试程序的关系:

如何做(行动)
思想是简单的,伪代码如下:
- 将测试服务启动n个实例,测试主调也启动n个实例,测试数据也划分为n份;
- 上述操作通过胶水语言shell脚本借助tmux窗口工具实现;
基于伪代码的设计框图如下:

基于设计图,开发的对应的脚本代码,分为测试服务端和测试主调端:
# 该脚本功能为启动多个测试服务
container_name_base=sub-service
network_name=test-network
image_name=xxx # 这里要根据实际来填写
gpu_ids=(0 1) # 该测试服务需要gpu,每一个服务对应一块gpu
ports=(30006 30007)docker network create ${network_name} # 建立一个局域网,为测试服务容器和测试主调容器使用for i in "${!gpu_ids[@]}";dogpu_id=${gpu_ids[i]}port=${ports[i]}container_name=${container_name_base}-${port}session_name=${container_name_base}-${port}tmux new-session -d -s "${session_name}"tmux send-keys -t "${session_name}" "docker run -ti --gpus al -p ${port}:${port} --name=${container_name} \-e PORT=${port} -e CUDA_VISIBLE_DEVICES=${gpu_id} --network=${network_name} --ipc=host \-v /models:/models \-v /data:/data \-v /code:/code \${image_name}" C-m
done
# 该脚本功能为启动多个测试主调服务
sub_service_name_base=sub-service # 这个要和上一个脚本中的名字对应起来
call_service_name_base=call-service
network_name=test-network # 这个要和上一个脚本中的名字对应起来
image_name=yyy # 填写对应的镜像名称test_data_root=/test_data # 测试数据路径
dst_root=/dst # 测试结果保存路径ports=(30006 30007) # 这个要和上一个脚本中的port号对应起来total_num=$(ls -l "$src_root" | wc -l)
worker_num=${#ports[@]}
worker_size=$(((total_num + worker_num - 1) / worker_num))for i in "${!ports[@]}"; doport=${ports[i]}sub_service_name=${sub_service_name_base}-${port}session_name=${call_service_name_base}-${port}tmux new-session -d -s "${session_name}"start_id=$((i * batch_size))end_id=$(((i + 1) * batch_size))if [ "$end_id" -gt "$total_num" ]; thenend_id=$total_numfitmux send-keys -t "${session_name}" "docker run -ti \-v ${test_data_root}:/test_data \--network=${network_name} \--entrypoint=/bin/bash ${image_name} \-c 'python test.py --src /test_data --dst ${dst_root} \--start_idx ${start_id} --end_idx ${end_id}'" C-m
done
获得了什么(结果)
获得n倍的测试加速比,例如在A10机器上(有16张gpu卡)将上述脚本中的worker_num设置为6,那么测试周期会从18h下降至3h。这样就可以实现当天编写代码,当天测试完毕,当天得到测试反馈。
后记
最近的一个感悟是在软件或算法开发中,应该降低编码的比重,提升需求沟通、分析、设计、建模和测试的比重。这里的比重是指重要程度,而不应简单的理解为时间。例如对于测试,其重视程度应该被重视,但应尽可能的想办法缩短测试周期。
相关资源
文章图片绘制原始drawio文件:
- https://download.csdn.net/download/u011345885/89541034
- https://download.csdn.net/download/u011345885/89541139
相关文章:
快捷:通过胶水语言实现工作中测试流程并行、加速
通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景(背景)问题抽象(挑战)如何做(行动)获得了什么(结果)后记相关资源 通过胶水语言实现工…...
MySQL 和 PostgreSQL,我到底选择哪个?
MySQL 和 PostgreSQL 是两个广泛使用的关系型数据库管理系统(RDBMS)。它们都具有强大的功能和广泛的社区支持,但在某些方面存在一些差异。本文将详细比较 MySQL 和 PostgreSQL,包括它们的特点、性能、扩展性、安全性以及适用场景等…...
Java —— 内部类
Java内部类 1.什么是内部类? 将一个类A定义在另一个类B里面,里面的类A就称为内部类(InnerClass),类B则称为外部类(OuterClass)。 2.为什么需要内部类? 具体来说,当一…...
高职院校人工智能人才培养成果导向系统构建、实施要点与评量方法
一、引言 近年来,人工智能技术在全球范围内迅速发展,对各行各业产生了深远的影响。高职院校作为培养高技能人才的重要基地,肩负着培养人工智能领域专业人才的重任。为了适应社会对人工智能人才的需求,高职院校需要构建一套科学、…...
ffmpeg中的超时控制
在FFmpeg库中,很多函数没有直接的参数可以设置超时。 那么有哪些函数可以通过设置 AVFormatContext 的 interrupt_callback 来实现超时控制? avformat_open_input: 打开输入文件或流。这个函数会阻塞,尤其是在网络流的情况下&…...
搜维尔科技:【研究】触觉技术将在5年内以8种方式改变人们的世界
触觉技术在过去几年中发展迅猛,大大提高了反馈的精确度和真实度。其应用产生了真正的影响,数百家公司和企业都集成了触觉技术来增强培训和研究模拟。 虽然触觉技术主要用于 B2B 层面,但触觉技术可能会彻底改变我们的生活,尤其是通…...
项目收获总结--MyBatis的知识收获
MyBatis的知识收获 一、概述二、获取自动生成的(主)键值三、将sql执行结果封装为目标返回对象的方式和原理四、延迟加载实现原理五、批量插入六、自带分页与分页插件原理七、Mapper(Dao)接口与XML映射文件关系八、模糊查询like语句九、#{}和${}的区别十、二级缓存案例实战 一、…...
数据库管理-第221期 Oracle的高可用-04(20240717)
数据库管理221期 2024-07-17 数据库管理-第221期 Oracle的高可用-04(20240717)1 ADG2 连接配置2.1 TNS2.2 JDBC2.3 JAVA连接池2.3.1 Oracle UCP2.3.2 应用连接池基础配置 总结 数据库管理-第221期 Oracle的高可用-04(20240717) 作…...
navicat15已连接忘记密码
1.导出链接 2.使用文本打开 connections.ncx UserName"root" PasswordXXXX 3.复制加密密码,在线解密 代码在线运行 - 在线工具 php解密代码 <?php class NavicatPassword {protected $version 0;protected $aesKey libcckeylibcckey;protected…...
企业管理必备:学会寻找客户绝佳方法。
无论是日常沟通、工作交流,还是社交娱乐,微信都扮演着重要的角色。而在微信的使用过程中,添加好友是一项基本而重要的操作,但是您真的会添加微信好友吗? 试试这个神器——微信管理系统,下面分享它快速加客…...
昇思25天学习打卡营第29天 | 文本解码原理--以MindNLP为例
今天是29天,学习了文本解码原理--以MindNLP为例。 MindNLP 是一个基于 MindSpore 的开源自然语言处理(NLP)库。它具有以下特点: 支持多种 NLP 任务:如语言模型、机器翻译、问答、情感分析、序列标记、摘要等ÿ…...
元服务体验-服务发现
服务发现,无论线上或线下的方式都可以发现元服务。 线上:基于用户意图。从精准意图的搜索、用户事件触发的推荐到主动探索等场景。用户可以在设备的负一屏、全局搜索、应用市场、桌面等场景发现元服务。 线下:用户在 HarmonyOS Connect标签…...
设计模式学习(二)工厂模式——抽象工厂模式+注册表
设计模式学习(二)工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…...
同三维T80004解码器视频使用操作说明书:高清HDMI解码器,高清SDI解码器,4K超清HDMI解码器,双路4K超高清解码器
同三维T80004解码器视频使用操作说明书:高清HDMI解码器,高清SDI解码器,4K超清HDMI解码器,双路4K超高清解码器 同三维T80004解码器系列视频使用操作说明书:高清HDMI解码器,高清SDI解码器,4K超清H…...
Flutter应用开发:掌握StatefulWidget的实用技巧
前言 随着移动应用的日益复杂,状态管理成为了 Flutter 应用开发中的一项重要挑战。 状态,即应用中的可变数据,它驱动着用户界面的渲染和交互。 在 Flutter 这样的声明式 UI 框架中,如何高效、可维护地管理状态,对于…...
SCADA系统在哪些行业中取得了不斐的成绩!
随着技术的发展,SCADA系统已经历了多代的发展。从基于专用计算机和专用操作系统的第一代SCADA系统,到基于通用计算机和通用操作系统的第二代,再到按照开放原则基于分布式计算机网络以及关系数据库技术的第三代,以及现在基于更高技…...
layui 监听弹窗关闭并刷新父级table
记录:easyadmin 监听弹窗关闭并刷新父级table 场景一:在二级页面的table中点击编辑,保存后刷新二级页面的table edit: function () {ea.listen(function (data) {return data;}, function (res) {ea.msg.success(res.msg, function () {var …...
Webpack详解
Webpack Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。它允许开发者将项目中的资源(如 JavaScript、CSS、图片等)视为模块,通过分析和处理这些模块之间的依赖关系,将它们打包…...
杰发科技AC7801 —— __attribute__指定地址存储常量
const uint8_t usFlashInitVal[] __attribute__((at(0x08002800))) {0x55,0x55,0x55,0x55,0x55};//定位在flash中,0x00030000开始的6个字节信息固定 注意7801的地址在8000000之后 如地址选0x00000800烧录时候报错 不知道是不是atclinktool的bug,使用_…...
docker pull 不下来 还是走代理好啊
docker国内镜像源配置及走代理设置_docker 镜像代理-CSDN博客 docker命令走代理 实际测试下来,就算我们修改成功了国内的镜像源,有时候由于国内镜像更新不及时,或者需要拉取的镜像比较冷门,只有域外镜像站才有,那么我…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
