Is it possible to check if a program stopped with sys.exit()
and check for the messages that were logged using the logging
module?
For example, let’s say I have the following function in a file called func.py:
import logging import sys logging.basicConfig(level=logging.INFO,format='%(levelname)s:%(message)s') def my_func(word): if word == "orange": logging.info("All is good with {}.".format(word)) elif word == "apple": logging.error("Something went wrong with {}.".format(word)) sys.exit()
Now, I have created a couple of tests to check my function’s performance. I know that, to test the messages logged–provided that the program completed its function–I can do something like this:
import unittest from func import * class Test_errors_and_messages(unittest.TestCase): def test_logs(self): with self.assertLogs() as captured: my_func("orange") self.assertEqual(len(captured.records), 1) self.assertEqual(captured.records[0].getMessage(), "All is good with orange.")
And if I want to check if the program is stopping when expected, I’m doing something similar to this:
import unittest from func import * class Test_errors_and_messages(unittest.TestCase): def test_exit(self): with self.assertRaises(SystemExit): my_func("apple")
My question is: is it possible to test for a system exit and the messages logged at the same time? In other words, I would like to modify the test_exit()
test to check (a) that the program stopped with a SystemExit
and (b) that the message
Something went wrong with apple.
was logged. In particular, I want to check both of these conditions because in my real script, I have several conditions that will prompt sys.exit()
, and I want to test that when the program stops, it is stopping for the reason that I expect.
Advertisement
Answer
Just put the two context managers together:
with self.assertLogs() as captured, self.assertRaises(SystemExit): my_func("apple") # assert on captured logs here