2010-06-21 87 views
11

我正在寻找一种方法来对使用bash或任何其他语言编写的命令行实用程序运行测试。测试命令行实用程序

我想找到一个测试框架,将有像

setup: 
    command = 'do_awesome_thing' 
    filename = 'testfile' 
    args = ['--with', 'extra_win', '--file', filename] 
    run_command command args 

test_output_was_correct 
    assert_output_was 'Creating awesome file "' + filename + '" with extra win.' 

test_file_contains_extra_win 
    assert_file_contains filename 'extra win' 

语句想必基地测试用例将建立在其上运行这些命令的一个临时目录,并在拆卸取下。

我宁愿在Python中使用某些东西,因为我比其他似是而非的候选语言更熟悉它。

我想可能有些东西会使用DSL来使其有效地与语言无关(或者它自己的语言,这取决于你如何看待它)。但是这可能不太理想,因为我的测试技术通常涉及编写生成测试的代码。

这对谷歌有点困难,因为有很多关于运行测试的实用程序的信息,这与我正在寻找的东西相反。

支持嵌入的command --help输出文档测试将是一个额外的奖励:)

+1

您可能会从我询问有关单元测试shell脚本的问题中获得一些有用的信息:http://stackoverflow.com/questions/971945/unit-testing-for-shell-scripts – 2010-06-21 22:28:35

+0

@gareth_bowles:很酷,感谢链接。如果兼容bash,我可以尝试使用shunit2。 – intuited 2010-06-21 23:29:01

回答

13

退房ScriptTest

from scripttest import TestFileEnvironment 

env = TestFileEnvironment('./scratch') 

def test_script(): 
    env.reset() 
    result = env.run('do_awesome_thing testfile --with extra_win --file %s' % filename) 
    # or use a list like ['do_awesome_thing', 'testfile', ...] 
    assert result.stdout.startswith('Creating awesome file') 
    assert filename in result.files_created 

这是合理的文档测试,使用为好。

+0

听起来很棒!谢谢! – intuited 2010-06-22 09:44:46

1

嗯...我们通常做的(和面向对象语言的奇迹之一)是写的所有组件实际制作应用程序之前应用程序每个组件可能都有独立的执行方式,用于测试目的(通常是命令行),这也允许您将它们视为完整的程序,并在未来的项目中使用它们。如果你想要测试现有程序的完整性......我认为最好的方法是深入了解它是如何工作的,甚至更深入的:阅读源代码。甚至更深入:开发一个机器人强制测试它:3

对不起,这就是我所拥有的.-。

+0

绝对..这是一个伟大的方式来做事情。我收集你所描述的将被称为“单元测试”,而我想要一个工具集来做“验收测试”或“功能测试”或“集成测试”。这部分是为了提供验证单元可测试代码的附加方法,并且允许对不是单元可测试的代码进行某种类型的测试:bash脚本(禁止存在-shudder - bash单元测试框架);专有的外部公用事业公司,其行为记录不完善;或者在一个程序中混合了各个方面的代码。 – intuited 2010-06-21 21:56:07

+0

另外:为了流通你的术语,我想我正在寻找的是一个“机器人框架”。 – intuited 2010-06-21 21:58:55

+0

我的理解你想要做的是找到一个通用测试程序与CLI程序?我发现它很难实现,因为编写如此糟糕的程序是不可预测的。如果你面对一个错误的软件,而且它的源码不可用,那么最好的选择似乎是:尝试搜索类似的程序。或者为什么不呢?在论坛中发布你的问题:] 没问题,或者我错过了什么?如果我这样做,试着更加明确你的个人情况。 – sadasant 2010-06-21 22:12:34

0

在可能存在但我不知道的任何预先包装的测试框架之外,我只想指出期望是这种自动化的一个很棒的且未被充分利用的工具,特别是如果您想要支持多阶段交互,不仅仅是发送一个命令并检查输出,而是通过更多的输入来响应输出。如果您构建自己的系统,那么值得研究。

还有一种叫做pexpect的预期的python重新实现。可能还有一些直接接口可用于期望库。我不是一个蟒蛇人,所以我不能告诉你很多关于他们的事情。

1

我知道这个问题很老,但是因为我在寻找答案,所以我想我会为任何其他发生的人添加我自己的答案。

完全免责声明:我提到的这个项目是我自己的,但它是完全免费且开源的。

我遇到了一个非常类似的问题,并最终滚动我自己的solution。测试代码如下所示:

from CLITest import CLITest, TestSuite 
from subprocess import CalledProcessError 


class TestEchoPrintsToScreen(CLITest): 
    '''Tests whether the string passed in is the string 
    passed out''' 

    def test_output_contains_input(self): 
     self.assertNotIsInstance(self.output, CalledProcessError) 
     self.assertIn("test", self.output) 

    def test_ouput_equals_input(self): 
     self.assertNotIsInstance(self.output, CalledProcessError) 
     self.assertEqual("test", self.output) 

suite = TestSuite() 

suite.add_test(TestEchoPrintsToScreen("echo test")) 

suite.run_tests() 

这已经足够好了,通过我的问题,让我,但我知道它可以使用一些更多的工作,使之尽可能稳定(测试发现弹簧记)。这可能会有所帮助,我总是喜欢一个很好的拉动要求。