动态运行时 PyTest 返回不正确的结果

我试图在代码提交到 Flask 应用程序时自动运行测试,但不知何故 PyTest 返回错误的结果。我尝试禁用缓存、删除缓存文件夹并删除 .pyc 文件,但问题仍然存在。这是该问题的玩具再现。


目录结构:


app.py

right/

    main.py

    test_solution1.py

wrong/

    main.py

    test_solution2.py

app.py


import pytest


from flask import Flask


app = Flask(__name__)


@app.route("/")

def submit():

    pytest.main(["right", "-p", "no:cacheprovider"])

    pytest.main(["wrong", "-p", "no:cacheprovider"])

    return "OK"


if __name__ == "__main__":

    app.run("0.0.0.0")

右/main.py


def subtract(a, b):

    return a - b

右/test_solution1.py


import main


def test_subtract():

    assert main.subtract(5, 3) == 2

错误/main.py


def subtract(a, b):

    return b - a

错误/test_solution2.py


import main


def test_subtract():

    assert main.subtract(5, 3) == 2

如果我加载应用程序并localhost:5000在浏览器中访问,它会按预期触发每个目录中的测试,但两个结果是相同的。它说所有测试都通过了,尽管 的测试wrong应该失败。

https://img4.mukewang.com/6500253a0001560923931132.jpg

如果我交换 Flask 应用程序中测试的触发顺序,那么两个项目的测试都会失败,即使第二个项目应该通过。


修改了submit()路线app.py(现在首先运行“错误”的项目)


@app.route("/", methods=["GET","POST"])

def submit():

    pytest.main(["wrong", "-p", "no:cacheprovider"])

    pytest.main(["right", "-p", "no:cacheprovider"])

    return "OK"

现在,尽管“正确”的项目没有问题,但两项测试都显示失败。


如何确保 pytest 完全运行目录中的代码?我认为它以某种方式缓存结果,就好像名称main.py不冲突一样,它工作得很好。


在运行测试之间删除__pycache__类似的目录和文件没有帮助。在运行测试之间停止并重新加载 Flask 服务器确实可以解决该问题。


慕桂英3389331
浏览 55回答 1
1回答

鸿蒙传说

这是因为在Python中,如果你尝试导入同一个模块两次,Python将不会第二次在文件系统中搜索。它将使用第一次导入的模块。您正尝试导入两次该模块main。即使您认为这是两个不同的模块,从 Python 的角度来看,您也会尝试导入同一个模块两次(因为它们都被命名为main)。您可以在文档中阅读有关模块缓存系统的更多详细信息。根据您想要做什么,可能有很多解决方案。这是两个:解决方案1您可以简单地将主模块的名称更改为不同的名称:app.pyright/    main1.py    test_solution1.pywrong/    main2.py    test_solution2.pytest_solution.pyimport main1def test_subtract():    assert main1.subtract(5, 3) == 2test_solution2.pyimport main2def test_subtract():    assert main2.subtract(5, 3) == 2解决方案2您保留相同的文件名,但指定要导入的子模块:test_solution.pyfrom right import maindef test_subtract():    assert main.subtract(5, 3) == 2test_solution2.pyfrom wrong import maindef test_subtract():    assert main.subtract(5, 3) == 2这是可行的,因为 Python 在搜索模块时会在本地目录中查找,并且您在 和 文件夹所在的相同位置启动app.pyPython 。rightwrong
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python