大家好,转发我朋友老吴的一篇文章,我们在做测试框架的时候用的是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 ——