Python | Logging Test Output to a File
Last Updated :
12 Jun, 2019
Improve
Problem - Writing the results of running unit tests to a file instead of printed to standard output.
A very common technique for running unit tests is to include a small code fragment (as shown in the code given below) at the bottom of your testing file.
Code #1 :
Python3 1==
This makes the test file executable, and prints the results of running tests to standard output. To redirect this output, unwind the main() call a bit and write own main() function as shown in the code given below :
Code #2 :
Python3 1==
How it works :
import unittest
class MyTest(unittest.TestCase):
...
if __name__ == '__main__':
unittest.main()
import sys
def main(out = sys.stderr, verbosity = 2):
loader = unittest.TestLoader()
suite = loader.loadTestsFromModule(sys.modules[__name__])
unittest.TextTestRunner(out, verbosity = verbosity).run(suite)
if __name__ == '__main__':
with open('testing.out', 'w') as f:
main(f)
- The interesting thing about the code is not so much the task of getting test results redirected to a file, but the fact that doing so exposes some notable inner workings of the unittest module.
- At a basic level, the unittest module works by first assembling a test suite.
- This test suite consists of the different testing methods you defined. Once the suite has been assembled, the tests it contains are executed.
- These two parts of unit testing are separate from each other. The
unittest.TestLoader
instance created in the solution is used to assemble a test suite. - The
loadTestsFromModule()
is one of several methods it defines to gather tests. In this case, it scans a module for TestCase classes and extracts test methods from them. - The
loadTestsFromTestCase()
method (not shown) can be used to pull test methods from an individual class that inherits from TestCase. - The
TextTestRunner
class is an example of a test runner class. The main purpose of this class is to execute the tests contained in a test suite. This class is the same test runner that sits behind theunittest.main()
function.