为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英3389331 2023-09-12 16:44:53
我试图在代码提交到 Flask 应用程序时自动运行测试,但不知何故 PyTest 返回错误的结果。我尝试禁用缓存、删除缓存文件夹并删除 .pyc 文件,但问题仍然存在。这是该问题的玩具再现。目录结构:app.pyright/    main.py    test_solution1.pywrong/    main.py    test_solution2.pyapp.pyimport pytestfrom flask import Flaskapp = 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.pydef subtract(a, b):    return a - b右/test_solution1.pyimport maindef test_subtract():    assert main.subtract(5, 3) == 2错误/main.pydef subtract(a, b):    return b - a错误/test_solution2.pyimport maindef test_subtract():    assert main.subtract(5, 3) == 2如果我加载应用程序并localhost:5000在浏览器中访问,它会按预期触发每个目录中的测试,但两个结果是相同的。它说所有测试都通过了,尽管 的测试wrong应该失败。如果我交换 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 服务器确实可以解决该问题。
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

这是因为在Python中,如果你尝试导入同一个模块两次,Python将不会第二次在文件系统中搜索。它将使用第一次导入的模块。您正尝试导入两次该模块main。即使您认为这是两个不同的模块,从 Python 的角度来看,您也会尝试导入同一个模块两次(因为它们都被命名为main)。您可以在文档中阅读有关模块缓存系统的更多详细信息。


根据您想要做什么,可能有很多解决方案。这是两个:


解决方案1

您可以简单地将主模块的名称更改为不同的名称:


app.py

right/

    main1.py

    test_solution1.py

wrong/

    main2.py

    test_solution2.py

test_solution.py


import main1


def test_subtract():

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

test_solution2.py


import main2


def test_subtract():

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

解决方案2

您保留相同的文件名,但指定要导入的子模块:


test_solution.py


from right import main


def test_subtract():

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

test_solution2.py


from wrong import main


def test_subtract():

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

这是可行的,因为 Python 在搜索模块时会在本地目录中查找,并且您在 和 文件夹所在的相同位置启动app.pyPython 。rightwrong


查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 48 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信