我将一个afl-fuzz(一个C应用程序)重写为Python。由于我对其内部工作原理不够了解,我想尽可能地复制其功能。
我正在尝试运行对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
有没有办法让unittest在不更改run_test的情况下使用此功能?我尝试使用os._exit而不是sys.exit(),但它使程序在两个进程中都死掉。
答案 0 :(得分:1)
sys.exit()
引发SystemExit类异常,如果没有捕获,则退出该程序。您可以尝试捕获异常:
def text_exercise_fork(self):
try:
run_test()
except SystemExit as e:
print(e.args[0])
答案 1 :(得分:1)
事实证明os._exit确实有效,但在我的单元测试中,我需要嘲笑它,因为我嘲笑了os.fork。愚蠢的错误。