Optimal file structure organization of Python module unittests?

后端 未结 1 718
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-01 06:24

Sadly I observed that there are are too many ways to keep your unittest in Python and they are not usually well documented.

I am looking for an \"ultimate\" structure, o

1条回答
  •  遥遥无期
    2021-02-01 06:39

    Here's the approach I've been using:

    Directory structure

    # All __init__.py files are empty in this example.
    app
        package_a
            __init__.py
            module_a.py
        package_b
            __init__.py
            module_b.py
        test
            __init__.py
            test_app.py
        __init__.py
    main.py
    

    main.py

    # This is the application's front-end.
    #
    # The import will succeed if Python can find the `app` package, which
    # will occur if the parent directory of app/ is in sys.path, either 
    # because the user is running the script from within that parect directory
    # or because the user has included the parent directory in the PYTHONPATH
    # environment variable.
    
    from app.package_a.module_a import aaa
    print aaa(123, 456)
    

    module_a.py

    # We can import a sibling module like this.
    from app.package_b.module_b import bbb
    def aaa(s, t):
        return '{0} {1}'.format(s, bbb(t))
    
    # We can also run module_a.py directly, using Python's -m option, which
    # allows you to run a module like a script.
    #
    #    python -m app.package_a.module_a
    if __name__ == '__main__':
        print aaa(111, 222)
        print bbb(333)
    

    module_b.py

    def bbb(s):
        return s + 1
    

    test_app.py

    import unittest
    
    # From the point of view of testing code, our working modules
    # are siblings. Imports work accordingly, as seen in module_a.
    from app.package_a.module_a import aaa
    from app.package_a.module_a import bbb
    
    class TestApp(unittest.TestCase):
    
        def test_aaa(self):
            self.assertEqual(aaa(77, 88), '77 89')
    
        def test_bbb(self):
            self.assertEqual(bbb(99), 100)
    
    # Simiarly, we can run our test modules directly as scripts using the -m option,
    # or using nose.
    #
    #    python -m app.test.test_app
    #    nosetests app/test/test_app.py
    
    if __name__ == '__main__':
        unittest.main()
    

    0 讨论(0)
提交回复
热议问题