Pytest不执行我包模块中的代码

0 投票
4 回答
73 浏览
提问于 2025-04-14 16:28

我正在学习《Learn Python The Hard Way》这本书,在第46个练习中,我们为项目建立了一个基本的结构,并安装了Pytest来测试项目代码。一切都很顺利,直到我尝试运行我的包的测试。测试显示成功,但我的模块代码没有任何输出,只有当我单独用一个test_Dandy2.py文件测试模块时,代码才会运行。

这是我根据书中练习整理的目录结构:

project_1\
  bin\
  docs\
  project1\
    __init__.py
    Dandy2.py
  tests\
    __init__.py
    test_project1.py
    test_Dandy2.py
  setup.py

我在包目录的__init__文件中尝试写import Dandy2,结果出现了ImportError错误。我在Stack Overflow上查了很多,发现大多数回答都提到我的项目文件可能不在Python的路径中。然而,我的测试显示成功,当我单独运行模块的测试时,代码也能正常运行。

我不知道这是否是正常情况,因为书里没有任何解释,而LPTHW论坛也很冷清。也许是因为我在使用Windows操作系统,并且在PowerShell中运行pytest,需要调整一些设置才能让它正常工作(就像我之前为了运行脚本需要更改系统的执行策略一样)。

附注:这是在PowerShell中显示的内容。也许我的代码有问题,或者测试的行为是正常的,只是我没有理解pytest的工作方式。当我只运行test_project1.py时,我只得到测试结果,而没有看到我模块中的代码。

    (lpthw) PS C:\Users\desou\OneDrive\Desktop\venvs\projects\project_1> python -m pytest -s
    ============================================== test session starts ===============================================
    
    platform win32 -- Python 3.12.2, pytest-8.0.2, pluggy-1.4.0
    rootdir: C:\Users\desou\OneDrive\Desktop\venvs\projects\project_1
    
    collecting ... Hello this is a test program.
    
    You will be tested, how much is 77 + 33?
    
    \> 4
    
    Test complete. You've proved that you lack math skills.
    
    collected 2 items
    
    tests\test_Dandy2.py SETUP!
    I RAN!
    .TEAR DOWN!
    
    tests\test_project1.py SETUP!
    I RAN!
    .TEAR DOWN!
    
    
    =============================================== 2 passed in 2.22s ================================================

这是我的模块代码:

print("Hello this is a test program.")

print("You will be tested, how much is 77 + 33?")

x = input("> ")

if x != '110':
   print("Test complete. You've proved that you lack math skills.")
   pass

else:
   print("Test complete. Congratulations, you have a brain.")
   pass

4 个回答

0

你是怎么运行 pytest 的?

根据你的描述,你可能需要添加 tests 这个文件夹。比如说,假设你现在在 project_1 这个文件夹里,你可以这样运行:

pytest tests
0

根据对这个答案的第一个评论,我删除了之前的回答。

这是更新后的回复:

明白了!那么答案是,使用pytest运行时,上面的行为是正常的。

pytest会从当前工作目录及其子目录中收集所有以“test”开头的方法作为要运行的测试。在收集测试时,如果发现模块导入中有可执行的代码,它会在收集测试之前就运行这些代码。这就是为什么在你的输出中会看到模块代码在收集测试的过程中运行的原因。

然后,在收集测试的过程完成后,pytest开始按照收集的顺序运行这些测试。在执行每个测试时,它会确保在运行测试之前先执行设置方法,并在每个测试完成后再执行清理方法。

希望这能解答你的疑问。

点击这里查看pytest的官方文档以获取更多细节

0

在项目的根目录“project_1”中运行测试。这样可以更好地理解Python是如何查找模块和包的。

撰写回答