Python: How to run unittest.main() for all source files in a subdirectory?

前端 未结 6 1258
野趣味
野趣味 2020-12-04 13:17

I am developing a Python module with several source files, each with its own test class derived from unittest right in the source. Consider the directory structure:

6条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-04 13:47

    In case it happens to help anyone, here is the approach I arrived at for solving this problem. I had the use case where I have the following directory structure:

    mypackage/
        tests/
            test_category_1/
                tests_1a.py
                tests_1b.py
                ...
            test_category_2/
                tests_2a.py
                tests_2b.py
                ...
            ...
    

    and I want all of the following to work in the obvious way and to be able to be supplied the same commandline arguments as are accepted by unittest:

    python -m mypackage.tests
    python -m mypackage.tests.test_category_1
    python -m mypackage.tests.test_category_1.tests_1a
    

    The solution was to set up mypackage/tests/__init__.py like this:

    import unittest
    
    def prepare_load_tests_function (the__path__):
        test_suite = unittest.TestLoader().discover(the__path__[0])
        def load_tests (_a, _b, _c):
            return test_suite
        return load_tests
    

    and to set up mypackage/tests/__main__.py like this:

    import unittest
    from . import prepare_load_tests_function, __path__
    
    load_tests = prepare_load_tests_function(__path__)
    unittest.main()
    

    and to copy and paste an empty __init__.py and the following __main__.py in each mypackage/tests/test_category_n/:

    import unittest
    from .. import prepare_load_tests_function
    from . import __path__
    
    load_tests = prepare_load_tests_function(__path__)
    unittest.main()
    

    and also to add the standard if __name__ == '__main__': unittest.main() in each actual tests file.

    (Works for me on Python 3.3 on Windows, ymmv.)

提交回复
热议问题