2010-06-21 124 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() 

這已經足夠好了,通過我的問題,讓我,但我知道它可以使用一些更多的工作,使之儘可能穩定(測試發現彈簧記)。這可能會有所幫助,我總是喜歡一個很好的拉動要求。