Python | Logging Test Output to a File
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 :
import unittest class MyTest(unittest.TestCase): ... if __name__ = = '__main__' : unittest.main() |
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 :
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) |
How it works :
- 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.