代码之家  ›  专栏  ›  技术社区  ›  intuited

测试命令行实用程序

  •  11
  • intuited  · 技术社区  · 14 年前

    我正在寻找一种在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,使它有效地语言不可知(或者它自己的语言,取决于你如何看待它);然而,这可能不太理想,因为我的测试技术通常涉及编写生成测试的代码。

    在谷歌上搜索这个有点困难,因为有很多关于运行测试的实用程序的信息,这和我要找的正好相反。

    对嵌入到的输出中的doctest的支持 command --help 会有额外的奖励:)

    4 回复  |  直到 14 年前
        1
  •  13
  •   Ian Bicking    14 年前

    退房 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
    

    它也是合理的最有用的。

        2
  •  1
  •   Daniel Rodriguez MSFT    14 年前

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

    对不起,这是我的东西。-。

        3
  •  1
  •   iLoveTux    9 年前

    我知道这个问题由来已久,但因为我一直在寻找答案,所以我想我会为身边的任何人加上我自己的答案。

    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()
    

    这很好地解决了我的问题,但我知道还需要更多的工作才能使它尽可能健壮(我想到了测试发现)。它可能会有帮助,我总是喜欢一个好的拉请求。

        4
  •  0
  •   frankc    14 年前

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

    expect还有一个python的重新实现,称为pexpect,也可能有一些直接的expect库接口可用。我不是一个巨蟒,所以我不能告诉你很多关于他们的事。