I am writing my doctests like this:
>>> some_function(a=1, b=2)
{u'id': u'123', u'name': u'abc'}
This works fine for Python version 2.5, 2.6 & 2.7 but fails for Python 3 with following error:
Expected:
{u'id': u'123', u'name': u'abc'}
Got:
{'id': '123', 'name': 'abc'}
Problem is that if I write my doctests like this:
>>> some_function(a=1, b=2)
{'id': '123', 'name': 'abc'}
They will work only for Python3 and fail on Python2 version. My question is how do I make it cross version compatible?
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.
By default, pytest will collect test*. txt files looking for doctest directives, but you can pass additional globs using the --doctest-glob option (multi-allowed).
To run the tests, use doctest as the main program via the -m option to the interpreter. Usually no output is produced while the tests are running, so the example below includes the -v option to make the output more verbose.
I ran into the same problem with doctests in IPython. There's no neat solution, but I wrapped all of the u'
prefixes in {}
, i.e. {u}'
, and made a little function that would include or exclude them as appropriate.
You can see the u_format() function and a doctest using it.
But that's rather messy, so I've moved many tests away from doctests.
Alternatively, you can test it like this:
>>> some_function(a=1, b=2) == {'id': '123', 'name': 'abc'}
True
If you need some unicode strings in the keys, you can use u'abþ'
, and use distribute to run 2to3
on the doctests. But that only works on input code, not output reprs.
I run into the same issue with doctests in NLTK; it was solved by using a custom doctest output checker (that treats u'foo' and 'foo' the same) which is installed by a custom nose plugin: https://github.com/nltk/nltk/blob/develop/nltk/test/doctest_nose_plugin.py
This solution is not pretty, but it works quite well (there are about 0.5 megabytes of doctests in NLTK) and it doesn't make doctests less readable.
EDIT: found a simplified standalone version of this nose plugin: https://github.com/gnublade/doctest-ignore-unicode
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With