测试命令行实用程序

时间:2010-06-21 21:12:10

标签: python language-agnostic bash testing command-line

我正在寻找一种在用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输出中嵌入的doctests将是额外的奖励:)

4 个答案:

答案 0 :(得分: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

它也是合理的doctest可用的。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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()

这足以让我完成我的问题,但我知道它可以使用更多的工作来使其尽可能健壮(考虑发现测试发现)。它可能会有所帮助,我总是喜欢一个很好的拉动请求。

答案 3 :(得分:0)

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

还有一个python reimplementation of expect叫做pexpect。也可能有一些直接接口到expect库。我不是一个蟒蛇人,所以我不能告诉你很多关于他们的事。