TestLoader.discover 中 top_level_dir 的目的是什么?

nal*_*zok 9 python unit-testing module python-import python-unittest

根据unittest.TestLoader.discover文档

discover(start_dir, pattern=’test*.py’, top_level_dir=None)

...所有测试模块必须可以从项目的顶层导入。如果起始目录不是顶级目录,则必须单独指定顶级目录...

我自己做了一些实验,似乎 whentop_level_dir是不同的start_dir并且没有设置,没有出错:所有测试都被发现并正确导入。

我想知道将top_level_dir参数传递给discover. 为什么它需要知道顶级目录是什么?我想它的所有工作都是 (i) 在 中找到测试包/模块start_dir,以及 (ii) 导入它们,不是吗?

或者,有人可以提供一个示例,说明没有top_level_dir导致测试发现至少部分失败吗?

小智 0

unittest.TestLoader.discover() 中的 top_level_dir 参数用于指定被测试项目的根目录。这用于确定正在测试的模块的包结构,并允许 discovery() 方法正确导入和运行测试。

当未指定top_level_dir时,discover()方法将使用当前工作目录作为项目的根目录。如果当前工作目录不是项目的根目录,这可能会出现问题,因为它可能导致方法错误导入或找不到某些测试。

例如,考虑具有以下目录结构的项目:

    myproject/
        mypackage/
            __init__.py
            tests/
                __init__.py
                test_module.py
Run Code Online (Sandbox Code Playgroud)

如果从 myproject 目录运行unittest.TestLoader.discover(),并且不指定 top_level_dir 参数,该方法将在当前工作目录中搜索测试,但不会找到任何测试,因为它们位于 mypackage 中/测试/子目录。

但是,如果您指定 top_level_dir='myproject' 参数,discover() 方法将正确查找并导入 mypackage/tests/ 目录中的测试。

总之,top_level_dir参数用于指定正在测试的项目的根目录,即使当前工作目录不是项目的根目录,它也有助于正确查找和导入测试。