- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很喜欢 unit testing一些legacy shell 脚本。
在现实世界中,脚本通常用于调用实用程序像 find
, tar
, cpio
, grep
, sed
, rsync
、date
等等,还有一些相当复杂的命令行,其中包含很多选项。有时会构造和使用正则表达式或通配符模式。
示例:通常由 cron 定期调用的 shell 脚本的任务是使用实用程序将一些巨大的目录树从一台计算机镜像到另一台计算机 rsync .应从中排除几种类型的文件和目录镜像过程:
#!/usr/bin/env bash
...
function mirror() {
...
COMMAND="rsync -aH$VERBOSE$DRY $PROGRESS $DELETE $OTHER_OPTIONS \
$EXCLUDE_OPTIONS $SOURCE_HOST:$DIRECTORY $TARGET"
...
if eval $COMMAND
then ...
else ...
fi
...
}
...
正如 Michael Feathers 在他的名著 Working Effectively with Legacy Code 中所写的那样, 一个好的单元测试运行得非常快,不会接触网络、文件系统或打开任何数据库。
根据 Michael Feathers 的建议,此处使用的技术是:dependency injection .此处要替换的对象是实用程序 rsync
。
我的第一个想法:在我的 shell 脚本测试框架(我使用 bats )中,我以 mockup 的方式操作 $PATH
rsync
被发现而不是真正的 rsync
工具。这mockup对象可以检查提供的命令行参数和选项。与本部分中使用的其他实用程序类似 script under test .
我过去在这个脚本领域遇到的实际问题通常是由文件或目录名称中的特殊字符引起的错误、引号或编码问题、缺少 ssh key 、错误权限等。这些类型的错误会逃脱这种单元测试技术。 (我知道:对于其中一些问题,单元测试根本无法解决)。
另一个缺点是写一个mockup对于像 rsync
或 find
这样的复杂实用程序来说,它很容易出错,而且本身就是一项乏味的工程任务。
我相信上面描述的情况很普遍,其他人可能也遇到过类似的问题。谁有一些聪明的想法并愿意在这里与我分享?
最佳答案
您可以使用函数模拟任何命令,如下所示:
function rsync() {
# mock things here if necessary
}
然后导出函数并运行单元测试:
export -f rsync
unittest
关于bash - Shell 脚本单元测试 : How to mockup a complex utility program,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219223/
我使用 Balsamiq Mockups 进行了 UI 设计。现在它们只是图像。我想知道是否有可能构建一个交互式 Storyboard。基本上,我希望用户单击一个按钮并显示与该按钮关联的下一个 UI
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
Closed. This question is off-topic。它当前不接受答案。 想改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。 7年前关
在 EvolusPencil 文档中有一个表单,上面有很多控件(对象)如何在不按住 CTRL 键单击每个控件的情况下选择此表单上的多个控件? 最佳答案 您需要锁定要选择的对象周围的任何对象,方法是右键
我的应用程序使用FastScanner (基于 BufferedReader )读取输入(查看我的问题的代码部分)。 如果我想在测试中替换输入,我应该模拟 FastScanner (查看我的问题的代码
我一直在用 Balsamiq创建模型。我使用的是试用版,所以我将所有屏幕都放在一个模型中,而不是多个文件中。我想将这些模型的导出发送给我的团队,以便他们可以对其进行评论。他们需要能够轻松地添加箭头、标
我刚刚开始使用 JMockit,并且对使用 MockUp 进行“伪造”与使用 Expectations 来模拟对象的优势感到困惑。 根据我阅读的文档,类的 MockUp 允许我用自己的实现覆盖方法。然
我正在使用 JUnit 和 JMockit 编写一些单元测试,并且需要为采用私有(private)枚举实例作为参数的方法编写 JMockit MockUp。这是我需要模拟的类: public clas
我正在使用用 Groovy 编写的 Spock 测试来测试一些 Java 代码。我使用 JMockit 来模拟 java 代码中的方法,因为 Spock 只处理模拟 Groovy 类。我遇到了一个问题
我正在尝试(仍然)学习 JMockit 的来龙去脉。这是另一个我不明白的 JMockit 怪癖示例。使用 NonStrictExpectations 运行测试效果很好。但是,使用 MockUp 运行不
考虑以下示例 MockUp 类 Foo 拦截构造函数中的 Bar 然后实现 toString() 在 Bar 方面; public class FooStub extends MockUp {
我是 JMockIt 的新手,正在尝试弄清楚/理解如何使用 @Injectable对于我已经定义的顶级 MockUp 类。 例如: // JUnit Test Class public class R
我正在尝试将 JNDI 数据源模拟到 JUnit 测试中,但由于某种原因它不起作用: 我使用这些导入: import static org.mockito.ArgumentMatchers.anyIn
我正在尝试将使用 JMockit 的测试套件转换为使用 Mockito 和 powermock。 在测试设置中有以下代码片段: new MockUp() { @Mock publ
我很喜欢 unit testing一些legacy shell 脚本。 在现实世界中,脚本通常用于调用实用程序像 find, tar, cpio, grep, sed, rsync 、date 等等,
有没有办法模拟 Angular 2 的 Http 对象,梦想是将它用于模型,并拥有与核心代码相同的模型,除了发送到服务器的连接。 最佳答案 有一个 MockBackend,确保它在默认 Backend
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
在 plone 5 页面模板中假设以下愚蠢的代码片段: $('#bar').click( function () { $('#bar').addClass(
我刚刚将 Android Studio 更新到了 2.3 版(金丝雀版)和最后的构建工具 'com.android.tools.build:gradle:2.3.0-alpha1' 以及当我打开布局并
我是一名优秀的程序员,十分优秀!