Outputting data from unit test in Python

前端 未结 14 2448
孤城傲影
孤城傲影 2020-12-02 05:45

If I\'m writing unit tests in python (using the unittest module), is it possible to output data from a failed test, so I can examine it to help deduce what caused the error?

14条回答
  •  自闭症患者
    2020-12-02 06:12

    Use logging:

    import unittest
    import logging
    import inspect
    import os
    
    logging_level = logging.INFO
    
    try:
        log_file = os.environ["LOG_FILE"]
    except KeyError:
        log_file = None
    
    def logger(stack=None):
        if not hasattr(logger, "initialized"):
            logging.basicConfig(filename=log_file, level=logging_level)
            logger.initialized = True
        if not stack:
            stack = inspect.stack()
        name = stack[1][3]
        try:
            name = stack[1][0].f_locals["self"].__class__.__name__ + "." + name
        except KeyError:
            pass
        return logging.getLogger(name)
    
    def todo(msg):
        logger(inspect.stack()).warning("TODO: {}".format(msg))
    
    def get_pi():
        logger().info("sorry, I know only three digits")
        return 3.14
    
    class Test(unittest.TestCase):
    
        def testName(self):
            todo("use a better get_pi")
            pi = get_pi()
            logger().info("pi = {}".format(pi))
            todo("check more digits in pi")
            self.assertAlmostEqual(pi, 3.14)
            logger().debug("end of this test")
            pass
    

    Usage:

    # LOG_FILE=/tmp/log python3 -m unittest LoggerDemo
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.047s
    
    OK
    # cat /tmp/log
    WARNING:Test.testName:TODO: use a better get_pi
    INFO:get_pi:sorry, I know only three digits
    INFO:Test.testName:pi = 3.14
    WARNING:Test.testName:TODO: check more digits in pi
    

    If you do not set LOG_FILE, logging will got to stderr.

提交回复
热议问题