Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to stop Python unittest from printing test docstring?

I've noticed that, when my Python unit tests contain documentation at the top of the function, sometimes the framework prints them in the test output. Normally, the test output contains one test per line:

<test name> ... ok 

If the test has a docstring of the form

"""
test that so and so happens
"""

than all is well. But if the test has a docstring all on one line:

"""test that so and so happens"""

then the test output takes more than one line and includes the doc like this:

<test name>
test that so and so happens ... ok

I can't find where this is documented behavior. Is there a way to turn this off?

like image 773
DaveBurns Avatar asked Oct 18 '12 20:10

DaveBurns


People also ask

How do I stop a Python test?

Once you are in a TestCase , the stop() method for the TestResult is not used when iterating through the tests. Somewhat related to your question, if you are using python 2.7, you can use the -f/--failfast flag when calling your test with python -m unittest . This will stop the test at the first failure.

Which item in Python will stop a unit test abruptly?

An exception object is created when a Python script raises an exception. If the script explicitly doesn't handle the exception, the program will be forced to terminate abruptly.

What is the correct way to run all the Doctests?

Right click on a blank space in the python code, and there is a menu option to run all the Doctests found in the file, not just the tests for one function.


2 Answers

The first line of the docstring is used; the responsible method is TestCase.shortDescription(), which you can override in your testcases:

class MyTests(unittest.TestCase):
    #  ....
    def shortDescription(self):
        return None

By always returning None you turn the feature off entirely. If you want to format the docstring differently, it's available as self._testMethodDoc.

like image 181
Martijn Pieters Avatar answered Sep 28 '22 10:09

Martijn Pieters


This is an improved version of MartijnPieters excellent answer.


Instead of overriding that method for every test, it is more convenient (at least for me) to add the following file to your list of tests. Name the file test_[whatever you want].py.

test_config.py

import unittest
# Hides Docstring from Verbosis mode
unittest.TestCase.shortDescription = lambda x: None

This code snippet could also be placed in the __init__.py files of the test folder.

In my case, I just added to the root folder of my project, scripts, since I use discover as in python -m unittest from scripts to run all the unittests of my project. As this is the only test*.py file on that directory level, it will load before any other test.

(I tried the snippet on the __init__.py of the root folder, it didn't seem to work, so I sticked with the file approach)

BTW: I actually prefer lambda x: "\t" instead of lambda x: None

like image 35
Eduardo Reis Avatar answered Sep 28 '22 09:09

Eduardo Reis