簡體   English   中英

在未經修改的情況下在線程中測試Python代碼?

[英]Testing Python code in thread without modifications?

假設我將這段代碼做成一個長期運行的執行線程,以輪詢事件並觸發其他事件(在我的情況下,使用XMLRPC調用)。 它需要重構為干凈的對象,以便可以進行單元測試,但是與此同時,我想在一些集成測試中捕獲它的一些當前行為,將其像黑盒子一樣對待。 例如:

# long-lived code
import xmlrpclib
s = xmlrpclib.ServerProxy('http://XXX:yyyy')
def do_stuff():
    while True:
        ...
        if s.xyz():
            s.do_thing(...)

_

# test code
import threading, time
# stub out xmlrpclib
def run_do_stuff():
    other_code.do_stuff()

def setUp():
    t = threading.Thread(target=run_do_stuff)
    t.setDaemon(True)

def tearDown():
    # somehow kill t
    t.join()

def test1():
    t.start()
    time.sleep(5)
    assert some_XMLRPC_side_effects

最后一個大問題是,被測試的代碼被設計為可以永久運行,直到Ctrl-C為止。我看不出有任何方法可以迫使它引發異常或殺死線程,因此我可以從頭開始而不更改我正在測試的代碼。 調用被測函數后,我將無法從線程中輪詢任何標志。

我知道這真的不是設計測試的工作方式,集成測試的價值有限等等,但是我希望通過輕輕地努力而不是完全地向朋友展示測試和好的設計的價值。一口氣重新設計他的軟件。

最后一個大問題是,被測試的代碼旨在永久運行,直到Ctrl-C為止,我看不出有任何方法可以迫使它引發異常或殺死線程。

測試驅動開發的要點是重新考慮你的設計, 使其可測試。

永遠循環-雖然看起來可以用於生產,但無法測試。

因此,使循環終止。 這不會損害生產。 它將提高可測試性。

“設計為永遠運行”不是為了可測試性而設計的。 因此,將設計修復為可測試的。

我想我找到了一種解決方案,該解決方案可以滿足我的需求:不用線程,而要使用單獨的進程。

我可以編寫一個小的python存根進行模擬並以受控方式運行代碼。 然后,我可以編寫實際測試以在每個測試的子進程中運行我的存根,並在每個測試完成時將其殺死。 測試過程可以與stdio或套接字上的存根進行交互。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM