Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python package structure, setup.py for running unit tests

I'm not sure I'm organizing my package structure correctly or am using the right options in setup.py because I'm getting errors when I try to run unit tests.

I have a structure like this:

/project    /bin    /src        /pkgname                      __init__.py            module1.py            module2.py    /tests        __init__.py        test1.py        test2.py 

My setup.py looks like this:

#!/usr/bin/env python                                                                                                                                         from setuptools import setup, find_packages  setup(version='0.1',       description='Trend following library',       author='Nate Reed',       author_email='[email protected]',       packages=find_packages(),       install_requires=['numpy'],       test_suite="tests",                           ) 

When I run 'python setup.py test' I get:

nate@nate-desktop:~/PycharmProjects/trendfollowing$ sudo python setup.py test running test running egg_info writing requirements to UNKNOWN.egg-info/requires.txt writing UNKNOWN.egg-info/PKG-INFO writing top-level names to UNKNOWN.egg-info/top_level.txt writing dependency_links to UNKNOWN.egg-info/dependency_links.txt reading manifest file 'UNKNOWN.egg-info/SOURCES.txt' writing manifest file 'UNKNOWN.egg-info/SOURCES.txt' running build_ext Traceback (most recent call last):   File "setup.py", line 11, in <module>     test_suite="tests",   File "/usr/lib/python2.6/distutils/core.py", line 152, in setup     dist.run_commands()   File "/usr/lib/python2.6/distutils/dist.py", line 975, in run_commands     self.run_command(cmd)   File "/usr/lib/python2.6/distutils/dist.py", line 995, in run_command     cmd_obj.run()   File "/usr/lib/python2.6/dist-packages/setuptools/command/test.py", line 137, in run     self.with_project_on_sys_path(self.run_tests)   File "/usr/lib/python2.6/dist-packages/setuptools/command/test.py", line 117, in with_project_on_sys_path     func()   File "/usr/lib/python2.6/dist-packages/setuptools/command/test.py", line 146, in run_tests     testLoader = loader_class()   File "/usr/lib/python2.6/unittest.py", line 816, in __init__     self.parseArgs(argv)   File "/usr/lib/python2.6/unittest.py", line 843, in parseArgs     self.createTests()   File "/usr/lib/python2.6/unittest.py", line 849, in createTests     self.module)   File "/usr/lib/python2.6/unittest.py", line 613, in loadTestsFromNames     suites = [self.loadTestsFromName(name, module) for name in names]   File "/usr/lib/python2.6/unittest.py", line 587, in loadTestsFromName     return self.loadTestsFromModule(obj)   File "/usr/lib/python2.6/dist-packages/setuptools/command/test.py", line 34, in loadTestsFromModule     tests.append(self.loadTestsFromName(submodule))   File "/usr/lib/python2.6/unittest.py", line 584, in loadTestsFromName     parent, obj = obj, getattr(obj, part) AttributeError: 'module' object has no attribute 'test1' 

Do the test names need to match module names? Are there other conventions I need to follow in my package structure?

like image 363
Nate Reed Avatar asked May 28 '11 19:05

Nate Reed


People also ask

Which Python package can be used to do unit testing?

unittest has been built into the Python standard library since version 2.1. You'll probably see it in commercial Python applications and open-source projects. unittest contains both a testing framework and a test runner. unittest has some important requirements for writing and executing tests.

Should tests be included in Python package?

Testing is an important part of Python package development but one that is often neglected due to the perceived additional workload.

How do I run a unit test in Python?

We apply the unit testing Python built-in function sum() against the known output. We check that the sum() of the number (2, 3, 5) equals 10. We can put the above code into the file and execute it again at the command line. In the following example, we will pass the tuple for testing purpose.


1 Answers

Through some trial and error, I found the cause of this problem. Test names should match module names. If there is a "foo_test.py" test, there needs to be a corresponding module foo.py.

I found some guidelines on organizing package structure, which helped me reorganize my package into a structure I was confident in.

like image 159
Nate Reed Avatar answered Sep 22 '22 05:09

Nate Reed