Pythonでsys.exitやsys.stderrへの書き込みをテストする

エラー時にstderrへメッセージを出力し、sys.exitするスクリプトをテストするのに以下のように書いてみました


sys.exitについてはSystemExitで補足できますので、それでテストできます。
sys.stderrについてはmockに置き換えて、writeされた値を保存しておいて、後で期待通りのメッセージかどうかassertEqualsでテストしてます

import sys
import unittest


def dummy_method():
    sys.stderr.write('error!!!')
    sys.exit(2)


class DevNull(object):
    data = []

    def write(self, data):
        self.data.append(data)

    def clear(self):
        self.data = []


class DummyTest(unittest.TestCase):

    def setUp(self):
        self._stderr = DevNull()
        self.original_stderr = sys.stderr
        sys.stderr = self._stderr

    def tearDown(self):
        sys.stderr = self.original_stderr

    def test_dummy(self):
        try:
            dummy_method()
        except SystemExit, e:
            self.assertEqual(e.code, 2)
            self.assertEqual(self._stderr.data[0], 'error!!!')
        else:
            self.fail('SystemExit exception expected')


if __name__ == '__main__':
    unittest.main()


参考)
http://stackoverflow.com/questions/426500/how-do-i-mock-the-python-method-optionparser-error-which-does-a-sys-exit