如何进行shell脚本正确性测试
在实际工作中,需要对shell脚本进行正确性测试。
如何用最快最有效的方式进行测试?
很多开发的习惯是,二话不说,写完/拿到,就跑一把,看看输入,输出,想要的操作是否完成,也就过了。
其实这是十分不严谨的,若是未经过QA,风险还是相当大的。
以下即shell脚本测试流程,仅供参考
1.代码走读:
写完,或者拿到一个shell脚本,不必急于运行,虽然实践是检验整理的唯一标准,但是,在读代码这个过程中,可以规避很多低级的bug.
读什么?
A.代码逻辑,这个脚本用来做什么,主要分为多少步,分别做了什么事情?
用于检查是否有遗漏逻辑,或有悖于需求。
B.具体语法,变量,判断语句
语法方面的东西,变量是否定义,判断语句逻辑是否正确,是否考虑各种异常,错误是否退出,返回正确状态值等。
2.语法检测:
shell的语法还是相当让人无语的,很多很容易疏忽遗漏的地方
命令格式:
sh -n ***.sh
若是没有异常输出,证明脚本没有明显的语法问题。

3.运行跟踪:
实践是检验整理的唯一标准,跑一把。
不过,可不是直接运行然后去看最终结果,这样会遗漏掉很多中间过程。
命令格式:
sh -vx ***.sh
得到效果如下:

我们可以看到
每行代码原始命令(无+的):[这是-v的效果]
代码执行时的情况(带+),包括运算结果,逻辑判断结果,变量赋值等等[-x的效果]
而我们所要关注的就是这些信息,主要是变量值和逻辑判断结果。
4.覆盖分支:
直接跑,只能覆盖到主体流程,对于其他控制流分支的代码是无法覆盖到的。
对于关键性的,重点的逻辑,我们需要制造条件,使运行脚本可以进入对应分支
5.其他:
A.关于bashdb:
可以尝试下,但是感觉投入产出比不高
B.关于单元测试:
实际工作中,由于项目压力比较大,单元测试的成本还是相当高的,所以目前为止没有。
6.有没有更好的方式?
好吧,单步跟踪,脚本短的还好,日志信息不会太多,要是多了,存在调用其他脚本等等.....
日志量达到几千行,这是很轻易的事情。
跟踪过的童鞋有同感,展现不够友好,惨白惨白一片,一千行下来,看的眼花。
很容易遗漏(LZ被坑了好多回,你看,或不看......错误信息明明就在那里,就是视而不见)
So.进行了一层优化,对日志进行处理,使用正则,标注我关心的信息
效果图对比:


脚本是用python实现的,位置:https://github.com/wklken/pytools/tree/master/shell
思想是:执行,抓到所有日志,用正则进行匹配,打上颜色,然后输出
好了,就这些
工具的实现是为了提高效率,节约时间。
The end!
转自: http://wklken.me/posts/2012/09/15/how-to-test-shell.html
如何进行shell脚本正确性测试的更多相关文章
- 二、shell 脚本条件测试
目录 一.条件测试 test 格式 文件测试 文件测试常见选项 整数值比较 字符串比较 浮点数的运算 逻辑测试 二.if语句 1单分支 2双分支结构 3多分支结构 三元运算符 三.case 一.条件测 ...
- shell脚本编程测试类型下
一bash的数值测试 -v VAR变量VAR是否设置 数值测试:-gt 是否大于greater-ge 是否大于等于-eq 是否等于-ne 是否不等于 not equal-lt 是否小于-le 是否小 ...
- shell脚本编程测试类型上
一bash的条件测试 判断某需求是否满足,需要由测试机制来实现.专用的测试表达式需要由测试命令辅助完成测试过程. 评估布尔声明,以便用在条件性执行中.若真,则返回0:若假,则返回1. 测试命令:• t ...
- 关于shell脚本——条件测试、if语句、case语句
目录 一.条件测试 1.1.表达说明 1.2.test命令 文件测试 1.3.整数值比较 1.4.字符串比较 1.5.逻辑测试 二.if语句 2.1.单分支结构 2.2.双分支结构 2.3.多分支结构 ...
- if嵌套语句 shell脚本实例 测试是否闰年
在 if 语句里面,你可以使用另外一个 if 语句.只要你能逻辑管理 你就可以使用多层嵌套. 以下是一个测试闰年的例子: #!/bin/bash # This script will test if ...
- shell脚本条件测试与比较
1.条件测试常用语法 test 测试表达式 利用test命令进行条件测试表达式,test命令与测试表达式之间至少有一个空格 [ 测试表达式 ] 通过[ ]中括号进行条件测试表达式,[]中括号边界与测试 ...
- shell脚本--文件测试
文件测试是指测试某一个文件或者目录是否存在 测试文件格式[ 操作符 目录或者文件 ] 注意左括号和操作符之间有一个空格,文件或者目录 与右边的括号之间也有一个空格. -d 测试是否为目录 -e ...
- shell脚本二
在shell脚本一 中,我讨论了shell脚本的语法规范,shell脚本的变量,以及shell脚本的测试语句. 仅仅懂得这些只能写简单的脚本,在简单的脚本中各条语句按顺序执行,从而实现自动化的管理,顺 ...
- 一次shell脚本小事故,从中学习排错过程-软件测试
一次shell脚本小事故,从中学习排错过程 事出,童鞋使用shell脚本搭建测试环境的过称中..... 配置环境变量文件:/etc/profile(用于升级JDK或其他) 手动编辑方法:vi /etc ...
随机推荐
- Access SQL中Left Join、Right Join和Inner Join的使用
1.表结构 表A 表B 2.Left Join 示例:2.1 Select * From A left join B on A. ...
- AJAX文档
AJAX 文档 AJAX开发简略.................................................................................... ...
- CI 同时上传多个图片
最近,一直在研究ci框架,由于项目的需求,在后台需要做一个功能同时上传两张图片.测试了好久都没有两张图片都没有上传成功,(上传的结果是只能上传第二张图片,但是图片名称是第一个图片的).在这里说一下自己 ...
- 一、java环境搭建
结论: 1.jdk包括jre,jre包括jvm. 2.eclipse ide依赖环境变量.如果未设置,在启动eclipse工具会提示:返回码是13.
- 字符串转Json对象
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web.S ...
- PHP判断用户设备是否是移动设备
摘自http://www.oschina.net/code/snippet_1432190_46913 <?php function isMobile() { // 如果有HTTP_X_WA ...
- Oracle中如何使用REGEXP_SUBSTR函数
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcst ...
- Device Tree(三):代码分析
一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因) 2.Device Tree的基础概 ...
- Django基础-过滤器
1.可以通过过滤器来修改变量的显示,过滤器的形式是:{{ variable | filter }},管道符号'|'代表使用过滤器 2.过滤器能够采用链式的方式使用,例如:{{ text | escap ...
- MyBatis Mapper 接口如何通过JDK动态代理来包装SqlSession 源码分析
我们以往使用ibatis或者mybatis 都是以这种方式调用XML当中定义的CRUD标签来执行SQL 比如这样 <?xml version="1.0" encoding=& ...