有没有办法验证shell脚本的覆盖范围?我的项目有很多shell脚本,需要确保可以对shell脚本的覆盖范围执行静态分析。有没有可用的工具?
答案 0 :(得分:7)
我严重怀疑在shell脚本上可能会执行任何静态代码分析 - 特别是由于shell脚本 应该调用外部程序并基于这些外部程序返回了什么 - 并且有无数的外部程序和外部环境状态。它类似于严重依赖于eval
的代码的静态分析问题 - 就像机制一样,但shell脚本 都是关于eval风格的编程。
但是,有一些通用指针可能对主要语言的“正确”验证,代码覆盖和shell脚本文档化有用:
您始终可以使用-x
(AKA xtrace
)选项运行脚本 - 它会将类似的跟踪输出到stderr:
+ log_end_msg 0
+ [ -z 0 ]
+ retval=0
+ log_end_msg_pre 0
+ :
+ log_use_fancy_output
+ TPUT=/usr/bin/tput
+ EXPR=/usr/bin/expr
+ [ -t 1 ]
+ [ xxterm != x ]
+ [ xxterm != xdumb ]
Bash可以将此流重定向到外部FD(使用BASH_XTRACEFD变量) - 这在实践中更容易解析。
这不是一件容易的事,但是可以编写一个程序来查找使用xtrace输出执行的相关代码片段并使你成为一个花哨的“代码覆盖率”报告 - 就像所谓的多少次,哪些片段代码根本没有运行,因此缺乏测试覆盖率。
事实上,已经编写了一个名为shcov的精彩工具,它使用了这个过程 - 尽管它有点过于简单,并且不能很好地处理所有可能的情况(特别是当我们谈论长期和复杂的线条)
最后但并非最不重要的是 - 有一个简约的shelldoc项目(类似于javadoc),它有助于根据shell脚本中的注释生成文档。是的,这是一个无耻的插件:)
答案 1 :(得分:3)
我认为没有可用于测试覆盖的COTS工具,无论脚本语言有多少都有。
另一张海报提出了一种可能适用于某些工具的临时方法:让他们转储一些跟踪数据,并尝试将其与实际代码相匹配以获得覆盖率。他说这样做有点......这是大多数人的问题。
我的technical paper on a general approach for building test coverage tools使用程序转换涵盖了为您喜爱的脚本语言构建测试范围的另一种方法。我的公司以这种方式为更流行的语言构建了一系列这样的工具。
答案 2 :(得分:3)
您可以尝试查看shcov,这是一个基于Python的GPL v2许可工具。它似乎可能已被作者抛弃,但确实产生了基于HTML的图形报告,并且(在我的有限测试中)似乎在覆盖率分析方面相当准确。
答案 3 :(得分:3)
我编写的工具可以覆盖shell脚本,名称是 shAge 表示shell脚本覆盖,项目托管here
如果任何shell脚本执行以下操作,则执行Coverage
运行程序
java -jar shAge.jar hello.sh
将执行shell脚本中的内容,最后生成报告