当前位置: 首页 > news >正文

快捷:通过胶水语言实现工作中测试流程并行、加速

通过胶水语言实现工作中测试流程并行、加速

  • 通过胶水语言实现工作中测试流程并行、加速
    • 工作场景(背景)
    • 问题抽象(挑战)
    • 如何做(行动)
    • 获得了什么(结果)
    • 后记
    • 相关资源

通过胶水语言实现工作中测试流程并行、加速

  尽可能自动化是计算机思维之一。一切事务尽可能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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • nginx全局块的user指令
  • 基于 Vue 3 和 Element Plus 构建图书管理系统
  • 计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设
  • Airdrop 2049 第二季如何捕捉全新机遇?专家大咖带你揭秘!
  • B树:深入解析与实战应用
  • 华为的热机备份和流量限制
  • 纯净IP的判断标准及代理深度分析
  • Unity3d开发google chrome的dinosaur游戏
  • 数据可视化入门
  • 【CPO-TCN-BiGRU-Attention回归预测】基于冠豪猪算法CPO优化时间卷积双向门控循环单元融合注意力机制
  • https 单向认证和双向认证
  • Postfix+Dovecot+Roundcube开源邮件系统搭建系列1-2:系统搭建目标+MariaDB数据库配置(MySQL)
  • 网络规划设计师教程(第二版) pdf
  • 数据库系统概论:数据库完整性
  • Pytorch:显卡驱动版本、Pytorch版本的关系
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《剑指offer》分解让复杂问题更简单
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Hibernate最全面试题
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java-详解HashMap
  • java正则表式的使用
  • js中forEach回调同异步问题
  • js作用域和this的理解
  • PhantomJS 安装
  • spark本地环境的搭建到运行第一个spark程序
  • SpriteKit 技巧之添加背景图片
  • 从零开始的无人驾驶 1
  • 简单数学运算程序(不定期更新)
  • 七牛云假注销小指南
  • 十年未变!安全,谁之责?(下)
  • 数组大概知多少
  • 线性表及其算法(java实现)
  • 以太坊客户端Geth命令参数详解
  • 用jquery写贪吃蛇
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 国内开源镜像站点
  • 交换综合实验一
  • # 达梦数据库知识点
  • #define
  • #Z0458. 树的中心2
  • (4)Elastix图像配准:3D图像
  • (7)svelte 教程: Props(属性)
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (一)Dubbo快速入门、介绍、使用
  • (原创)可支持最大高度的NestedScrollView
  • (转)ORM
  • (转)人的集合论——移山之道
  • ***详解账号泄露:全球约1亿用户已泄露
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 反编译_.net反编译的相关问题