[Python-Dev] Cleaning-up the new unittest API
Michael Foord
fuzzyman at voidspace.org.uk
Sat Oct 30 05:29:10 CEST 2010
On 29/10/2010 23:14, Raymond Hettinger wrote:
> The API for the unittest module has grown fat (the documentation
> is approaching 2,000 lines and 10,000 words like a small book).
> I think we can improve learnability by focusing on the most
> important parts of the API.
>
> I would like to simplify and clean-up the API for the unittest module
> by de-documenting assertSetEqual(), assertDictEqual(),
> assertListEqual, and assertTupleEqual().
>
> All of those methods are already called automatically by
> assertEqual(), so those methods never need to be called directly.
> Or, if you need to be more explicit about the type checking for
> sequences, the assertSequenceEqual() method will suffice.
> Either way, there's no need to expose the four type specific methods.
>
I'm fine with dedocumenting these. These methods should not need to be
called directly.
> Besides de-documenting those four redundant methods,
> I propose that assertItemsEqual() be deprecated just like
> its brother assertSameElements(). I haven't found anyone
> who accurately guesses what those methods entail based
> on their method names ("items" usually implies key/value
> pairs elsewhere in the language; nor is it clear whether order is
> important, whether the elements need to be hashable or
> orderable or just define equality tests, nor is is clear whether
> duplicates cause the test to fail).
>
> Given the purpose of the unittest module, it's important that
> the reader have a crystal clear understanding of what a test
> is doing. Their attention needs to be focused on the subject
> of the test, not on questioning the semantics of the test method.
>
assertItemsEqual compares two iterables and tests that they have the
same elements irrespective of order. A relatively straightforward
definition. Hopefully the docstring and documentation make this clear.
If the members are all of the same type then indeed comparing two sorted
lists is only slightly more typing. If the members are of different
types checking that the members are the same is a much harder problem in
Python 3, and this method can be very useful.
-1 for deprecating.
All the best,
Michael Foord
> IMO, users are far better-off sticking with assertEqual() so they
> can be specific about the nature of the test:
>
> # hashable elements; ignore dups
> assertEqual(set(a), set(b))
>
> # orderable elements; dups matter, order doesn't
> assertEqual(sorted(a), sorted(b))
>
> # eq tested elements, dups matter, order matters
> assertEqual(list(a), list(b))
>
> # hashable keys, eq tested values
> # ignore dups, ignore order
> assertEqual(dict(a), dict(b))
>
> These take just a few more characters than assertSameElements()
> and assertItemsEqual(), but they are far more clear about their meaning.
> You won't have to second guess what semantics are hidden
> behind the abstraction.
>
> There are a couple other problems with the new API but it is probably
> too late to do anything about it.
>
> * elsewhere in Python we spell comparison names with abbreviations
> like eq, ne, lt, le, gt, ge. In unittest, those are spelled in
> an awkward,
> not easily remembered manner: assertLessEqual(a, b), etc.
> Fortunately, it's clear what the mean; however, it's not easy to guess
> their spelling.
>
> * the names for assertRegexpMatches() and assertNotRegexpMatches
> are deeply misleading since they are implemented in terms of
> re.search(), not re.match().
>
>
> Raymond
>
>
> P.S. I also looked ar assertDictContainsSubset(a,b). It is a bit
> over-specialized, but at least it is crystal clear what is does
> and it beats the awkward alternative using dict views:
>
> assertLessEqual(a.items(), b.items())
>
>
>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: http://mail.python.org/mailman/options/python-dev/fuzzyman%40voidspace.org.uk
--
http://www.voidspace.org.uk/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20101029/b5d6a4bd/attachment.html>
More information about the Python-Dev
mailing list