Python Test Collector

last modified: April 9, 2004

I accidentally "discovered" the TestCollector idea independently in Python. My tests all end in "Test.py", and I set them up so I can run each of them independently from the command line, or all at once with this script. I have this in "runAllTests.py" and invoke it so that the current directory is the top of the program. (Unlike most Python programmers I actually have a lot of separate directories and modules.) It recursively searches the current directory for things to test and runs them all at once.

No guarantees, etc.


#!/bin/python

import sys
import os
import re
import unittest
import imp

filesList = []

def collector(arg, dirname, names):
    filesList.extend([dirname + os.sep + n for n in names])

def returnTests():
    p = os.path.abspath(os.path.dirname(sys.argv[0]))
    os.path.walk(p, collector, None)
    fList = [x for x in filesList if x[-7:] == "Test.py" and '#' not
             in x] # '#' is for temp files in emacs, extend as needed
    fileList = [file(x, "r") for x in fList]
    modules = []
    for i in range(len(fList)):
        modules.append(imp.load_source(os.path.split(fList[i])[1][:-3],
                                       fList[i],
                                       fileList[i]))

    l = unittest.defaultTestLoader.loadTestsFromModule
    return unittest.TestSuite(map(l, modules))

if __name__ == "__main__":
    unittest.main(defaultTest="returnTests")

There's about a billion ways to extend this, make it more robust, etc., but it's a start. -- JeremyBowers


Loading...