代码之家  ›  专栏  ›  技术社区  ›  mike rodent

如何测试我的`__main__`文件的功能?

  •  0
  • mike rodent  · 技术社区  · 1 年前

    我在用pytest。NB W10。
    我将运行我的应用程序 > python src/core 。“核心”是我的中央模块,带有 __main__.py 文件

    出于这个原因,我将我的“测试”目录放在[project-root]/src/core中。

    我有一个测试文件test_xxx.py。我试图在其中导入 __main__ :

    import __main__
    
    ... 
    
    def test_xxxxx():
       print(f'main {__main__} type {type(__main__)}')
    

    这将打印以下内容:

    main <module '__main__' from 'D:\\apps\\Python\\virtual_envs\\doc_indexer v2.0.0\\Scripts\\pytest.exe\\__main__.py'> type <class 'module'>
    

    …换句话说,这是进口而不是我的本地 __main__.py 来自我的本地“核心”模块,但pytest自己的 主要的 从其模块。到目前为止,这是可以理解的。然后我查看sys.path:

    path: D:\My Documents\software projects\EclipseWorkspace\doc_indexer\src\core\tests
    path: D:\My Documents\software projects\EclipseWorkspace\doc_indexer\src\core
    path: D:\apps\Python\virtual_envs\doc_indexer v2.0.0\Scripts\pytest.exe
    path: D:\apps\Python\PyQt5
    ...
    

    现在我在挠头,这已经不是第一次用pytest了。这src\core路径已列出 之前 …脚本\pytest.exe。为什么pytest会自己识别 __main__.py 并导入,然后再导入 __main__.py 从它之前的路径?

    我还尝试了各种实验 importlib 。似乎什么都不起作用。

    一般来说,有没有办法真正导入该文件。。。src/core/ __main__py ?

    我意识到这个文件在交给另一个文件之前应该做最少的事情,但为了完整性,我只想测试一下 main() 事实上确实做到了。有办法跑吗 __main__.main() 在测试中?

    1 回复  |  直到 1 年前
        1
  •  1
  •   chepner    1 年前

    每个Python程序都会创建一个名为 __main__ 在启动时,基于正在执行的脚本。

    因此 import __main__ 总是 通过该名称查找模块,这意味着它不需要从名为 __main__.py .就你而言,你执行了 pytest (主要是一个简单的包装 import pytest; pytest.console_main() 。(剧本 pytest ,存储在搜索路径上的目录中,与由定义的模块是分开的 pytest.py 在Python库中。)

    一个解决方案是确保您可以导入 __main__.py 使用另一个包,以便 somepackage.__main__ 与不同 主要的 .

    然而 __main__.py 从未打算作为模块导入。当您尝试将目录或存档文件作为脚本执行时,它是定义脚本的文件。如果它包含需要测试的代码,我建议将其分解为一个单独的模块 __main__.py 自身进口。