2017-07-07 59 views
1

我正在編寫一個程序,該程序在生產中使用了多個相同代碼的實例。實例然後通過網絡進行通信,但在這裏無關緊要。Python:如何測試使用fork的程序?

在開發過程中,我多次分離初始過程以獲得完整的實例設置,這非常方便。

但是,試圖在這方面編寫集成測試會給我帶來問題:測試框架(unittest/nosetests/py.test)當然也是分叉的,所以我最終得到多個副本測試框架,提供了亂碼結果每個孩子的單元測驗的輸出重疊。

簡化示例:

  • 程序是聊天客戶端,經由某種網絡連接到另一客戶端(比如,redis的發佈訂閱)
  • 程序暴露的API張貼和讀取消息
  • 我想以分離兩個彼此連接的程序實例
  • 測試應使用API​​確保客戶端通過互相發送/接收消息來工作
  • 主進程監督子進程的錯誤並運行測試套件

爲了達到這個目的,我需要「卸載」或停止子進程的測試框架。我怎樣才能做到這一點?

我可以通過調用測試套件來解決這個問題,但是我需要爲每個測試重新啓動所有的孩子。

+1

你可以擴展對亂碼的結果,也給你試圖測試和預期結果的代碼粗略的想法。 – Dan

+0

完成 - 希望更容易理解。 – arnuschky

+0

我認爲你的問題是輸出,因爲stdout不是線程安全的。您可以嘗試爲每個進程重定向stdout,或者重構代碼以注入輸出車輛。 – Dan

回答

0

在這種情況下分叉進程是一件很麻煩的事情,因爲子進程繼承了父進程的完整棧,包括測試框架的運行實例。

基本上有解決這個兩個選項:

第一是初始化測試框架之前叉,然後從測試訪問的子進程。如果子進程是長期存在的,這可以很好地工作,但是如果子進程要在每個測試中啓動,甚至可能使用不同的測試裝置/場景,則證明這是一件麻煩事。

通過使用subprocess/Popen簡單地啓動進程,第二個是放棄所有。我找到了一個名爲xprocess的pytest插件,它可以幫助您完成此任務。它並沒有提供我所需要的,但它指出了我正確的方向。