 <p>This turned out to be a mess: Nose pretty much exclusively uses the <code>TestLoader.load_tests_from_names</code> function (it's the <em>only function</em> tested in <a href="https://github.com/nose-devs/nose/blob/master/unit_tests/test_loader.py" rel="nofollow"><code>unit_tests/test_loader</code></a>) so since I wanted to actually load things from an arbitrary python object I seemed to need to write my own figure out what kind of load function to use.</p> <p>Then, in addition, to correctly get things to work like the <code>nosetests</code> script I needed to import a large number of things. I'm not at all certain that this is the best way to do things, not even kind of. But this is a stripped down example (no error checking, less verbosity) that is working for me:</p> <pre><code>import sys import types import unittest from nose.config import Config, all_config_files from nose.core import run from nose.loader import TestLoader from nose.suite import ContextSuite from nose.plugins.manager import PluginManager from myapp import find_test_objects def load_tests(config, obj): """Load tests from an object Requires an already configured nose.config.Config object. Returns a nose.suite.ContextSuite so that nose can actually give formatted output. """ loader = TestLoader() kinds = [ (unittest.TestCase, loader.loadTestsFromTestCase), (types.ModuleType, loader.loadTestsFromModule), (object, loader.loadTestsFromTestClass), ] tests = None for kind, load in kinds.items(): if isinstance(obj, kind) or issubclass(obj, kind): log.debug("found tests for %s as %s", obj, kind) tests = load(obj) break suite = ContextSuite(tests=tests, context=obj, config=config) def main(): "Actually configure the nose config object and run the tests" config = Config(files=all_config_files(), plugins=PluginManager()) config.configure(argv=sys.argv) tests = [] for group in find_test_objects(): tests.append(load_tests(config, group)) run(suite=tests) </code></pre>