Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I redirect the output of unittest? Obvious solution doesn't work

Here is my code:

import unittest
import sys
import os

class DemoTest(unittest.TestCase):
    def test_one(self):
        print "test one"
        self.assertTrue(True)

    def test_two(self):
        print "test two"
        self.assertTrue(False)

if __name__ == '__main__':
    dirpath = os.path.dirname(os.path.abspath(__file__))
    sys.stdout = open(dirpath+'/test_logs/demo_test.stdout.log', 'w')
    sys.stderr = open(dirpath+'/test_logs/demo_test.stderr.log', 'w')
    test_program = unittest.main(verbosity=0, exit=False)

When I run this, the contents of demo_test.stdout.log is only:

test one
test two

on the screen I still see the output from unittest:

======================================================================
FAIL: test_two (__main__.DemoTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "demotest.py", line 12, in test_two
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=1)

I want there to be no output on the screen and everything to be logged. (I am running the test as a cron job, so any output to stdout or stderr causes an email to be sent, so I want to be able to specify exactly when this happens, which means I need to be able to control unittest in this regard.)

like image 904
tadasajon Avatar asked Jan 09 '13 20:01

tadasajon


People also ask

How do I redirect stdout to Dev Null in Python?

Alternatively, you can use set sys. stdout to os. devnull, which is the file path of the null device. The file path of the null device is /dev/null on Unix and nul on Windows.

Which decorator is used to skip a test if a given condition is false with unittest?

unittest.skipUnless(condition, reason) Skip the decorated test unless condition is true.

How do I raise an exception in unittest Python?

using keyword arguments. Just pass the exception, the callable function and the parameters of the callable function as keyword arguments that will elicit the exception. Make a function call that should raise the exception with a context.

Can we use Pytest and unittest together?

pytest supports running Python unittest -based tests out of the box. It's meant for leveraging existing unittest -based test suites to use pytest as a test runner and also allow to incrementally adapt the test suite to take full advantage of pytest's features.


1 Answers

redirect stderr, e.g.:

python my_unit_test_launcher.py 2> log.txt
like image 81
Zaur Nasibov Avatar answered Oct 21 '22 08:10

Zaur Nasibov