This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author bluebird
Recipients bluebird
Date 2007-09-26.19:25:01
SpamBayes Score 0.0026661605
Marked as misclassified No
Message-id <1190834704.12.0.956914269209.issue1207@psf.upfronthosting.co.za>
In-reply-to
Content
Something very nice about unittest is that it can find automatically the
TestCase that you declare, and the test methods of every test case. This
makes the operation of adding or removing tests very simple.

For test modules however, there is nothing to automatically load all the
modules of a given directory. I think that would be very helpful.

Here is my proposal, to add to the set of TestLoader methods:

============================
def loadTestsFromPath( path='', filePattern='test*.py' ):
    '''Load all the TestCase in all the module of the given path.

    path: directory containing test files
    filePattern: glob pattern to find test modules inside path. Default
is test*.py

    The path will be converted into an import statement so anything that
can not be imported will
    not work.  The path must be relative to the current directory, and
can not include '.' and '..'
    directories.

    To simply load all the test files of the current directories, pass
an empty path (the default).

    Return a test suite containing all the tests.
    '''

    if len(path) == 0:
        pathPattern = filePattern
    else:
        pathPattern = path + '/' + filePattern
    pathPattern = os.path.normpath( pathPattern )
    fileList = glob.glob( pathPattern )

    mainSuite = TestSuite()
    for f in fileList:
        importName = f[:-3]
        importName = importName.replace( '\\', '.' )
        importName = importName.replace( '/', '.' )

        suite = defaultTestLoader.loadTestsFromName(importName)
        mainSuite._tests.extend( suite._tests )

    return mainSuite
===================

I use it like this: on my project, I have the following directory
organisation:

vy
  + run_all_tests.py
  + tests
     - run_tests.py
     - test_xxx.py
     - test_yyy.py
  + libvy
     + tests
        - run_tests.py
        - test_xxx.py
        - test_yyy.py
  + qvy
    + tests
        - run_tests.py
        - test_xxx.py
        - test_yyy.py

 
I can do either:
- cd libvy/tests && python run_tests.py
- cd qvy/tests && python run_tests.py
- cd tests && python run_tests.py
- run_all_tests.py

Each time I add a new test module, it is automatically picked up by the
test runners thank to the loadFromPath() feature. It makes it easy to
maintain the global test suite that runs all the tests. That's the most
important one because that test suite is responsible for non regression.

run_tests.py:
=============
if __name__ == '__main__':
    mainSuite = TestSuite()
    mainSuite._tests.extend( loadTestsFromPath('.')._tests )
    ttr = TextTestRunner(verbosity=2)
    ttr.run( mainSuite )

run_all_tests.py:
=================
if __name__ == '__main__':
    mainSuite = TestSuite()
    mainSuite._tests.extend( loadTestsFromPath( 'libvy/tests' )._tests )
    mainSuite._tests.extend( loadTestsFromPath( 'qvy/tests' )._tests )
    mainSuite._tests.extend( loadTestsFromPath( 'tests' )._tests )
    ttr = TextTestRunner(verbosity=2)
    ttr.run( mainSuite )
History
Date User Action Args
2007-09-26 19:25:04bluebirdsetspambayes_score: 0.00266616 -> 0.0026661605
recipients: + bluebird
2007-09-26 19:25:04bluebirdsetspambayes_score: 0.00266616 -> 0.00266616
messageid: <1190834704.12.0.956914269209.issue1207@psf.upfronthosting.co.za>
2007-09-26 19:25:03bluebirdlinkissue1207 messages
2007-09-26 19:25:01bluebirdcreate