2014-05-04 93 views
1

我試圖測試一個控制檯應用程序,它使用jline來處理與用戶的交互。如何測試基於jline的控制檯應用程序

我開始使用ProcessBuilder這使我獲得了應用程序的應用程序:

我期待使用類似的工作流這個:

  • 啓動應用程序
  • 讀輸出,直到我看到了應用程序的提示>
  • 發送輸入我的測試情況下,如login
  • 讀取輸出,直到看到預期響應,例如Username:

但是,測試只是凍結。單步執行代碼,看起來jline在Windows上的_getch的JNI調用中凍結。我猜測問題是因爲我正在從ProcessBuilder運行Java,它是無頭的,所以沒有控制檯,這是令人困惑的Windows。根據Jline文檔設置-Djline.terminal=jline.UnsupportedTerminal也無濟於事。

我發現一個線程討論Python pexpect用於測試(非java)readline應用程序。

問題:我該如何使用java工具測試基於jline的應用程序?

+0

我有同樣的問題。陛下你取得了一些進展? – Alex

+0

我已經添加了一個答案,顯示我所用的解決方案。 –

回答

0

我放棄了試圖使用java工具進行測試,並使用python pexpect庫去執行控制檯應用程序。這些測試整合到Maven構建,但所需的* nix主機來運行它們:

import unittest 
import pexpect 
import os 
import signal 
import subprocess 
import urllib 
import urllib2 
import json 

from wiremock import WiremockClient 

class TestInteractive(unittest.TestCase): 

    cli_cmd = "java -jar " + os.environ["CLI_JAR"] 

    # ... code omitted for brevity 

    def test_interactive_mode_username_and_password_sent_to_server(self): 
     child = pexpect.spawn(TestInteractive.cli_cmd, timeout=10) 
     child.expect ('Username: ') 
     child.sendline ('1234') 
     child.expect ('Password: ') 
     child.sendline ('abcd') 
     child.expect ('Successfully authenticated') 
     child.expect ('stratos> ') 
     child.sendline ('exit') 
     child.expect (pexpect.EOF) 
     # CLI sends GET request to mock server url /stratos/admin/coookie 
     self.assertEqual(self.wiremock.get_cookie_auth_header(), "1234:abcd") 

    # ... code omitted for brevity 

if __name__ == '__main__': 
    try: 
     unittest.main() 
    # handle CTRL-C 
    except KeyboardInterrupt: 
     # shut down wiremock 
     TestInteractive.wiremock.stop() 
     exit(1) 

完整的CLI測試套件,我工作的項目可以發現here

+0

哦,我明白了。很好。謝謝。 – Alex

相關問題