2014-11-20 43 views
4

我正在編寫針對需要作爲另一個進程運行的REST API進行測試的python單元測試。在python中,我如何運行命令行程序,直到我發送Ctrl + D時才返回

其餘服務器是tomcat的應用程序,我從殼呼籲在發展模式下運行,所以我在尋找什麼用Python測試做的是:

  1. 啓動服務器,返回時服務器已經到了。
  2. 運行單元測試
  3. 發送服務器Ctrl + D因此它優雅地關閉。

有沒有辦法爲python使用單一入口點,以便服務器啓動並且單元測試可以從一個python腳本調用中運行所有入口?

我環顧了python的子進程和多線程,但我還是不太明白怎麼從這裏到達那裏。

對於那些熟悉的人來說,這是我們正在開發的Atlassian JIRA插件,因此實際的shell命令是「atlas-run」。

+1

1.)如何從命令行調用服務器?你可以使用'pexpect'模塊嗎? 2.)服務器啓動後,只需運行'unittest.main()'。 3.)你可以使用'signal'模塊來將'SIGQUIT'和'pexpect'發送到服務器嗎? – wflynny 2014-11-20 21:14:15

+0

我沒有意識到這一點,我現在正在研究這一點,謝謝!通過CD向服務器調用插件項目的根目錄並從命令行運行「atlas-run」。 – MStudley 2014-11-21 18:44:24

回答

3

由於沒有人提供任何代碼來幫助解決這個問題,我會做類似以下的事情。原來pexpect功能非常強大,你不需要signal模塊。

import os 
import sys 
import pexpect 

def run_server(): 
    server_dir = '/path/to/server/root' 
    current_dir = os.path.abspath(os.curdir) 

    os.chdir(server_dir) 
    server_call = pexpect.spawn('atlas-run') 
    server_response = server_call.expect(['Server Error!', 'Sever is running!']) 
    os.chdir(current_dir) 
    if server_response: 
     return server_call #return server spawn object so we can shutdown later 
    else: 
     print 'Error starting the server: %s'%server_response.after 
     sys.exit(1) 

def run_unittests(): 
    # several ways to do this. either make a unittest.TestSuite or run command line 
    # here is the second option 
    unittest_dir = '/path/to/tests' 
    pexpect.spawn('python -m unittest discover -s %s -p "*test.py"'%unittest_dir) 
    test_response = pexpect.expect('Ran [0-9]+ tests in [0-9\.]+s') #catch end 
    print test_response.before #print output of unittests before ending. 
    return 

def main(): 
    server = run_sever() 
    run_unittests() 
    server.sendcontrol('d') #shutdown server 

if __name__ == "__main__": 
    main() 
+1

這個工程!我正在使用TestSuite路線,而不是在另一個流程中運行單元測試,但仍然 - 非常棒的答案。謝謝! – MStudley 2014-11-21 22:57:08

相關問題