用 Shell 快速写一个嵌入式测试框架

大家好,转发我朋友老吴的一篇文章,我们在做测试框架的时候用的是python,但是一些理论基础和用shell是一样的,在这里,语言并不是关键。希望对大家有帮助。


哈喽,我是老吴。

作为一个嵌入式底层码农,

在项目初期,我经常需要测试各种 Linux 单板的稳定性和性能

例如:

用 memtester 测试内存的稳定性。

用 glmark-es2 测试 GPU 的性能。

用 iperf 测试网卡设备的带宽。

等一大堆、杂七杂八的测试项目。

这些测试都不难,但是比较碎片化,一般都是基于简单的测试脚本。

为了节省我的时间和精力,我写了一个简单的测试框架

它的服务对象是像我这样的嵌入式底层开发人员。

我对它的要求是:

能扩展以适应不同的单板;

能自由地组合测试项;

能对每个测试项进行单独地定制;

能复用和积累各种测试脚本;

下面是实现这个测试框架的关键点

查找表

declare -gA fct_table=(['Test 1']="do_test1"['Test 2']="do_test2"['Test 3']="do_test3"['Test 4']="do_empty_handler"['Test 5']="do_empty_handler"['Test6']="do_empty_handler")declare -gA res_table=(['Test 1']="N/A"['Test 2']="N/A"['Test 3']="N/A"['Test 4']="N/A"['Test 5']="N/A"['Test 6']="N/A")

这里通过 Shell 的关联数组定义了两个查找表。

fct_table 是测试函数表。

res_table 是测试结果表。

测试函数

function do_empty_handler()
{echo "Test Not Implemented: $1"return 2}function do_test1
{echo "Test 1"ret=0return $ret}function do_test2
{echo "Test 2"ret=0return $ret
}function do_test3
{echo "Test 1"ret=0return $ret}

这里的每一个 test handler 函数就代表一个测试项目。

只要将 memetester、iperf 等具体地测试命令填充进行就可以执行真实的测试了。

调度代码

function validate_system()
{for i in "${!fct_table[@]}"; doecho "Test : $i"${fct_table[$i]}res=$?__update_result_table $res "$i" res_tabledone}# Main entry point
validate_system
print_result

遍历 fct_table,取出每一个 test handler 并调用,然后用 __update_result_table() 将测试的结果填充到 res_table 中。

到这里,这个测试框架就完成。

运行效果

wwd@think:~/Desktop$ ./board_test.sh 
Test : Test 1
Test 1
>>>>> SUCCESS
Test : Test 3
Test 1
>>>>> SUCCESS
Test : Test 2
Test 2
>>>>> SUCCESS
Test : Test 5
Test Not Implemented: 
>>>>> N/A
Test : Test 4
Test Not Implemented: 
>>>>> N/A
Test : Test6
Test Not Implemented: 
>>>>> N/A
TEST RESULTS:
============
Test: Test 1 Result: PASS
Test: Test 3 Result: PASS
Test: Test 2 Result: PASS
Test: Test 5 Result: N/A
Test: Test 4 Result: N/A
Test: Test 6 Result: N/A
Test: Test6 Result: N/A

总结

这个简单的测试框架非常轻巧且易于扩展,但功能强大。

在我的实际工作中被大量地使用,并且进行了一些必要的扩展,实实在在地降低了我的工作负担。

它完全可以作为第一次“冒烟测试”集成到更大的自动化系统中。

—— The End ——

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不同技术团队的配合问题及DevOps

一、技术团队细分及配合问题 在IT企业里产品从创意到交付给用户,从整体上看是由技术部门负责,但如果深入到技术部门,会发现由不同的技术团队负责不同的部分或者阶段。一般会 分产品团队、开发团队、测试团队以及运维团队,在互联网…

jquery validation验证身份证号、护照、电话号码、email

$.validator.setDefaults({ submitHandler: function(form) { form.submit(); } }); // 字符验证 jQuery.validator.addMethod("stringCheck", function(value, element) { return this.optional(element) || /^[\u0391-\uFFE5\w]$/.test(value); }, "只能包括中…

C++/C中定义与声明的区别

在C/C中,定义与声明是不一样的,主要区别在于是否分配了内存。 定义:编译器创建一个对象,为该对象分配一块内存,并为该内存起一个名字,这个名字就叫变量名。 例如: int a;//未初始化 int b 0;…

ubuntu php.ini 配置,ubuntu下配置PHP+JSON模块(apache) | 学步园

搭配完毕apachephpmysql环境后我们开始来配置PHP加载JSON模块1.下载源文件包:wget http://www.aurore.net/projects/php-json/php-json-ext-1.2.0.tar.bz22.解压tar xvjf php-json-ext-1.2.0.tar.bz23.进入目录cd php-json-ext-1.2.04.编译前要初始化PHP环境:phpiz…

A good book to learn C#2.0 ----C# 2.0 : Practical Guide for Programmers

c#2.0,已经出来很久了,相信已经有不少人或多或少了解了它的一些特性了.而这本<C# 2.0 : Practical Guide for Programmers>(作者&#xff1a;Michel de Champlain, Brian G. Patrick)是一本2005年2月出的turorial类型的好书,通过这本书不仅可以学习c#2.0的新内容,还可以对…

单线程会导致死锁吗?

我之前在我们的项目里面解决了一个死锁的问题&#xff0c;然后我跟一个我的朋友聊了下&#xff0c;他让我深入研究下这个问题。大家也可以考虑想我的这个问题。首先我们再看看什么是死锁&#xff1f;什么是死锁用个通俗的例子讲一讲死锁死锁从文字理论上说明的是两个线程&#…

细节‘出卖’你

细节‘出卖’你 ①喜欢眨眼&#xff1a;这种人心胸狭隘。②习惯盯着别人看&#xff1a;代表警戒心强。③喜欢提高音量说话&#xff1a;多半是自我主义者。④穿着不拘小节&#xff1a;也代表个性随和。⑤一坐下就翘脚&#xff1a;这种人充满企图心有行动力。⑥边说话边摸下巴&am…

makefile / CMake

- makefile syntax ifneq https://www.gnu.org/software/make/manual/html_node/Conditional-Example.html - [CMake] undef a symbol https://cmake.org/pipermail/cmake/2012-June/050708.html 但是我发现用这个和用remove_definiton对我移植OpenCV的时候都没起作用. https:…

Json的优缺点

JSON的定义 一种轻量级的数据交换格式&#xff0c;具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;&#xff0c;从而可以在不同平台间进行数据交换。JSON…

appcrash事件java,java – SpringBoot应用程序崩溃

请告诉我哪里有问题&#xff1f;我尝试启动我在Spring Boot上开发的第一个应用程序.我已经在SpringMVC上有简单的Web项目,现在我想在BOOT上构建它.这是错误输出&#xff1a;org.springframework.beans.factory.BeanCreationException: Error creating bean with name messageSo…

书摘:35岁之前成功的12条黄金法则

第一章:一个目标 一艘没有航行目标的船&#xff0c;任何方向的风都是逆风1、你为什么是穷人&#xff0c;第一点就是你没有立下成为富人的目标2、你的人生核心目标是什么&#xff1f;杰出人士与平庸之辈的根本差别并不是天赋、机遇&#xff0c;而在于有无目标。3、起跑领先一步…

软件工程师 VS 硬件工程师

因为在软件行业35岁就算老人了而搞硬件的53岁正辉煌表面上看起来高大上的硬件工程师在实际的工作中&#xff0c;其实很惨...以上漫画虽然调侃的意味更多但现实中搞硬件的门槛确实很高收入也会随着经验的增多不断增长硬件工程师也基本不存在中年危机如果实在搞不下去了转项目经理…

假如我们的坦克继续前进队——需求改进系统设计

需求和原型改进 在上个星期的《需求说明书》课堂讨论中&#xff0c;老师提出了游戏的用户界面的设计问题。 经过小组成员的讨论后&#xff0c;我们的想法如下&#xff1a;设计关卡基于时间和人手问题难以实现因此改为一关的形式&#xff0c;以便有更多的时间出开发趣味性更高的…

瑞星2009:3大拦截2大防御功能主动遏制木马病毒

12月16日&#xff0c;“瑞星全功能安全软件2009”正式发布&#xff0c;它基于瑞星“云安全”技术开发&#xff0c;实现了彻底的互联网化&#xff0c;是一款超越了传统“杀毒软件”的划时代安全产品。该产品集“拦截、防御、查杀、保护”多重防护功能于一身&#xff0c;并将杀毒…

Android中使用软引用和弱引用避免OOM的方法

个人总结如下&#xff1a; 4种类型的引用 由高到低依次为&#xff1a;强引用>软引用>弱引用>虚引用 (1)、强引用 如&#xff1a;Object objectnew Object&#xff08;&#xff09;&#xff0c;object就是一个强引用了。 当内存空间不足&#xff0c;Java虚拟机宁愿…

DIY一个低成本多功能点阵时钟!

大家好&#xff0c;转发一篇正念同学的文章----大家好&#xff0c;我是ZhengN。本次转载一篇保姆级的diy教程&#xff1a;基于Esp8266的多功能点阵时钟 。简介很早就了解ESP8266了&#xff0c;当时也用这个搞过一些小demo&#xff0c;一直也没有想过要弄些实际的作品出来&#…

从DataTable导出Excel,并下载,删除Excel进程。

页面上加入一个button即可.源代码如下: usingSystem;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Web;usingSystem.Web.SessionState;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.HtmlC…

Traceroute(路由追踪)的原理及实现

现实世界中的网络是由无数的计算机和路由器组成的一张的大网&#xff0c;应用的数据包在发送到服务器之前都要经过层层的路由转发。而Traceroute是一种常规的网络分析工具&#xff0c;用来定位到目标主机之间的所有路由器 原理 在介绍Traceroute的原理之前&#xff0c;需要了解…

社交网站与网民隐私安全报告(2009)

社交网站与网民隐私安全报告&#xff08;2009&#xff09; 免责声明&#xff1a; 本报告主要内容来自瑞星客户服务中心和瑞星互联网攻防实验室的调查和研究成果&#xff0c;部分数据来自来自瑞星“云安全”系统&#xff0c;仅针对网民在使用国内社交网站&#xff08;SNS&#x…

Intent传递数据时,可以传递哪些类型数据

Intent传递数据时&#xff0c;下列的数据类型哪些可以被传递&#xff08;abcd&#xff09;(多选) A、Serializable B、charsequence C、Parcelable D、Bundle 除了上面的还能传递基本数据类型(byte/boolean/char/short/int/float/long/double)、String/StringBuffer/StringBu…