2015-01-10 73 views
2

我有一個Python腳本tutorial.py。我想從我的python測試套件中的test_tutorial.py文件運行此腳本。如果tutorial.py沒有任何例外地執行,我想讓測試通過;如果在執行tutorial.py期間發生任何異常,我希望測試失敗。如果腳本失敗會引發異常

這裏是我如何寫test_tutorial.py,這確實不產生所需的行爲:

from os import system 
test_passes = False 
try: 
    system("python tutorial.py") 
    test_passes = True 
except: 
    pass 
assert test_passes 

我發現上面的控制流是不正確:如果tutorial.py拋出一個異常,那麼斷言行從不執行。

測試外部腳本是否引發異常的正確方法是什麼?

回答

3

如果沒有錯誤s0

from os import system 
s=system("python tutorial.py") 
assert s == 0 

或者使用subprocess

from subprocess import PIPE,Popen 

s = Popen(["python" ,"tutorial.py"],stderr=PIPE) 

_,err = s.communicate() # err will be empty string if the program runs ok 
assert not err 

你的try /除了從教程文件追趕什麼,你可以將一切在它之外它將表現相同:

from os import system 
test_passes = False 

s = system("python tutorial.py") 
test_passes = True 

assert test_passes 
+0

聰明的解決方案,儘管行s = system(「python tutorial.py」)不執行:它只會引發一個不受控制的異常。所以我陷入了同樣的問題。 – aph

+0

@aph,如果你試圖從另一個python文件中捕獲異常,你的try/except是多餘的。它不會被os.system引發,s = system(「python tutorial.py」)也執行代碼,我已經測試過它。 –

+0

好的解決方案,Padriac!我之前沒有使用python生成子進程,所以這很有啓發性。感謝分享。 – aph

0
from os import system 
test_passes = False 
try: 
    system("python tutorial.py") 
    test_passes = True 
except: 
    pass 
finally: 
    assert test_passes 

這將解決您的問題。

Finally如果發生任何錯誤,塊將處理。檢查this瞭解更多信息。如果它不是with open()方法,通常用於文件處理,以查看文件是否安全關閉。

+0

不錯的主意,但這實際上並沒有解決問題。當我在tutorial.py中人爲地引入一個錯誤,然後運行你建議的修改時,assert語句永遠不會被聲明。我認爲問題在於異常在某種程度上被註冊爲try語句的外部。所以當系統(「python tutorial.py」)被執行時,錯誤不會被視爲控制流的一部分。 – aph

+1

'finally'塊會處理有或沒有錯誤,它是重要的功能或過程。 –

+0

不確定你的意思。我以你建議的方式執行了代碼,並且它不以這種方式行事。代碼永遠不會到達assert語句。 – aph

相關問題