测试命令行工具的最佳方法是什么?

时间:2008-12-09 15:46:51

标签: testing command-line automation

我有很多命令行实用程序,我们自己编写并经常使用。目前测试它们非常麻烦,因此我们没有像我们那样进行那么多的测试。

我想知道是否有人可以提出好的技巧或工具来做好这类事情。

这是UNIX

9 个答案:

答案 0 :(得分:8)

您可以使用Cram编写类似于交互式shell会话的测试。它具有灵活的测试规范格式,允许您使用Perl正则表达式或类似shell的通配符来匹配输出。 Cram将重放测试中的命令,将输出与参考进行比较,并报告差异。

答案 1 :(得分:7)

我建议构建命令行工具的代码,以便命令行实用程序是函数和/或类库的客户端。

不是简单地使用std :: cout来打印输出,而是让库函数采用默认为std :: cout的ostream引用。在测试时,提供std :: stringstream来收集输出。

最后,只需使用您最喜欢的单元测试框架将您的实用程序输出与预期结果进行比较。

(我为C ++特定的例子道歉......我确信在其他语言中也有办法做类似的事情)。

答案 2 :(得分:5)

ArubaCucumber扩展,用于测试用任何编程语言编写的命令行应用程序。

要使用它,你需要ruby来运行测试,但是aruba的目的是提供一个预定义的步骤定义库,这样你就不需要编写任何ruby代码来制作一个可行的测试套件。 (虽然在某些时候你可能会想要写一些ruby来做一些自定义步骤。)

您可以在此处看到使用aruba测试的命令行工具的复杂示例:jingweno/gh

答案 3 :(得分:3)

您应该能够从shell脚本(批处理文件,在MS操作系统上)调用它们,将输出重定向到文件,然后以编程方式扫描文件以确保它具有正确的输出。我不知道有一个测试框架可以为你自动化,但是自己设置它应该是相当直接的。

答案 4 :(得分:2)

我使用Expect做了一点这个(很久以前嘿嘿),检查发生的事情是我,嗯,预期

答案 5 :(得分:1)

Sam Stephenson的

Bats (Bash Automated Testing System)。它很小,纯粹是用shell编写的,并且具有很好的功能。

之前建议的Aruba看起来很有趣,但在某些情况下,依赖性(红宝石,黄瓜)可能会很安静

答案 6 :(得分:0)

您可以从批处理文件或Windows脚本主机执行此操作。

但我保证会使用像(http://www.splinterware.com/products/wincron.htm)或其他免费/专业软件这样的任务调度程序。

在那里,您可以轻松复制/粘贴您应该改变的命令行参数,当您想要测试软件大约100次时?!

答案 7 :(得分:0)

您可以将perl与Test::more库一起使用,这为测试CLI提供了一个很好的框架。 虽然主要是为单元测试而设计的,但您可以将其扩展到测试用户工作流程。

一些方法:

 # Various ways to say "ok"
  ok($got eq $expected, $test_name);
  is  ($got, $expected, $test_name);
  isnt($got, $expected, $test_name);

  # Rather than print STDERR "# here's what went wrong\n"
  diag("here's what went wrong");

  like  ($got, qr/expected/, $test_name);
  unlike($got, qr/expected/, $test_name);

  cmp_ok($got, '==', $expected, $test_name);

答案 8 :(得分:0)

我已经开发了“精确”工具 https://github.com/emilkarlen/exactly

它在一个临时的沙箱目录中执行要测试的东西。 自述文件包含许多示例。

一个假想的程序“通过移动到适当的目录对文件进行分类”的测试看起来像这样:

[setup]

dir input
dir output/good
dir output/bad

file input/a.txt = <<EOF
GOOD contents
EOF

file input/b.txt = <<EOF
bad contents
EOF

[act]

classify-files-by-moving-to-appropriate-dir GOOD input/ output/

[assert]

dir-contents input empty

exists output/good/a.txt : type file
dir-contents output/good num-files == 1

exists output/bad/b.txt : type file
dir-contents output/bad num-files == 1