我可以解决UnitTest的SystemExit处理程序吗?

时间:2017-05-27 14:33:13

标签: python unix exit python-unittest low-level

我将一个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(),但它使程序在两个进程中都死掉。

2 个答案:

答案 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。愚蠢的错误。