[Python-ideas] Location of tests for packages

Ron Adam rrr at ronadam.com
Tue Jan 25 04:38:17 CET 2011


Moving these suggestions to python ideas as they are not immediately 
relevant to the current python dev discussion at this time. ;-)

I'm really just wondering what others think, is this something worth 
working on?


On 01/24/2011 01:46 PM, Raymond Hettinger wrote:
> Right now, the tests for the unittest package are under the package
> directory instead of Lib/test where we have most of the other tests.
>
> There are some other packages that do the same thing, each for their own
> reason.
>
> I think we should develop a strong preference for tests going under
> Lib/test unless there is a very compelling reason.

> * For regrtest to work, there still needs to be some file in Lib/test
> that dispatches to the alternate test directory.

Currently tests are mostly separate from the modules.  Mostly separate 
because, some modules have doctests in them, and/or a test() function to 
run tests.  But the test function name isn't special in any way as far as I 
know.  It's usually _test(), but it could be something else.

Would it help things to have a special __test__ name?  ie... special to 
python, in that module.__test__() can be depended on to run the tests for 
that module? (or package)


I've found it useful to add a -T option to my own python applications to 
run tests.  But moving it from being a module option to a python option, 
would make that even nicer. Where python -T modulename called the 
__test__() function. (or evoke the tests in another way.)

With a dependable way to evoke the tests no matter where they are located, 
it then becomes just a matter of iterating the list of modules in the 
library (or a directory) to run all the tests.


But then, what's the  best way to actually do that?


The current method uses pattern matching ... (not my first choice for sure)

python -m unittest discover -s project_directory -p '*_test.py'
python -m unittest discover project_directory '*_test.py'

Those lines are way too long in my opinion.


In the above, the test functions need to begin with an underscore.  I'm not 
sure the discoverable test function should be private,  The very act of 
finding them suggests they should be a public, but special API, rather than 
a private API to me.  If they were only accessed from inside the module or 
package they are in, then being private makes sense.


One choice is that __test__ is special to doctest and unittest only.

python -m unittest module    # runs module.__test__() if it exists.


Or a little more far out ...

The __test__() function could be called with "python -T module".  But then 
it seems that maybe we could also have a __main__() function be called with 
"python -M module".  (?)


Alternately ...  "python -T module" could alter the name of the module.

if __name__ == "__main__":
    main()

elif __name__ == "__test__":
    _test()                     # a private name is ok here.


Cheers,

Ron




More information about the Python-ideas mailing list