2017-05-27 83 views
0

我正在爲Python重寫一個afl-fuzz(一個C應用程序)。由於我對其內部工作沒有足夠的瞭解,因此我想盡可能地複製其功能。我可以使用UnitTest的SystemExit處理程序嗎?

我試圖運行一個例程的功能測試,它運行Python解釋器,運行execve,如果失敗,則返回42來向調用者報告失敗。測試在unittest外運行良好,但在放入它:

#!/usr/bin/env python 

import os 
import sys 
import unittest 


def run_test(): 
    x = os.fork() 
    if not x: 
     sys.exit(42) 
    waitpid_result, status = os.waitpid(x, os.WUNTRACED) 
    print(os.WEXITSTATUS(status)) 


class ForkFunctionalTest(unittest.TestCase): 

    def test_exercise_fork(self): 
     run_test() 


if __name__ == '__main__': 
    print('Expecting "42" as output:') 
    run_test() 
    print('\nAnd here goes unexpected SystemExit error:') 
    unittest.main() 

下面是它的失敗:

Expecting "42" as output: 
42 

And here goes unexpected SystemExit error: 
E 
====================================================================== 
ERROR: test_exercise_fork (__main__.ForkFunctionalTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "afl-fuzz2.py", line 23, in test_exercise_fork 
    run_test() 
    File "afl-fuzz2.py", line 15, in run_test 
    sys.exit(42) 
SystemExit: 42 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (errors=1) 
1 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.014s 

OK 

有沒有辦法讓這個功能單元測試工作,而無需改變RUN_TEST?我嘗試了os._exit而不是sys.exit(),但它使程序在兩個進程中都死亡。

回答

1

sys.exit()引發SystemExit類異常,如果未捕獲,則會退出該程序。你可以嘗試捕捉異常:

def text_exercise_fork(self): 
    try: 
     run_test() 
    except SystemExit as e: 
     print(e.args[0]) 
+0

謝謝。問題是我不想捕獲它,我想實際上分叉的進程死於退出代碼= 42。 – d33tah

0

原來,os._exit實際工作,但在我的單元測試,我需要嘲笑它因爲我嘲笑了os.fork。愚蠢的錯誤。

相關問題