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

Python 动态运行时,PyTest返回不正确的结果,python,pytest,Python,Pytest,我试图在代码提交到Flask应用程序时自动运行测试,但PyTest返回了错误的结果。我尝试过禁用缓存、删除缓存文件夹和删除.pyc文件,但问题仍然存在。这是这个问题的玩具复制品 目录结构: app.py right/ main.py test_solution1.py wrong/ main.py test_solution2.py app.py 导入pytest 从烧瓶进口烧瓶 app=烧瓶(名称) @附件路线(“/”) def submit(): main(

我试图在代码提交到Flask应用程序时自动运行测试,但PyTest返回了错误的结果。我尝试过禁用缓存、删除缓存文件夹和删除.pyc文件,但问题仍然存在。这是这个问题的玩具复制品

目录结构:

app.py
right/
    main.py
    test_solution1.py
wrong/
    main.py
    test_solution2.py
app.py

导入pytest
从烧瓶进口烧瓶
app=烧瓶(名称)
@附件路线(“/”)
def submit():
main([“right”、“-p”、“no:cacheprovider”])
main([“错误”、“-p”、“否:缓存提供程序”])
返回“OK”
如果名称=“\uuuuu main\uuuuuuuu”:
应用程序运行(“0.0.0.0”)
右/main.py

def减法(a,b):
返回a-b
右/测试解决方案1.py

importmain
def test_subtract():
assert main.subtract(5,3)==2
错误/main.py

def减法(a,b):
返回b-a
错误/测试解决方案2.py

importmain
def test_subtract():
assert main.subtract(5,3)==2
如果我加载应用程序并在浏览器中访问
localhost:5000
,它会按预期触发每个目录中的测试,但两个结果相同。它说所有的测试都通过了,即使
错误的测试应该失败

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

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

@app.route(“/”,方法=[“GET”,“POST”])
def submit():
main([“错误”、“-p”、“否:缓存提供程序”])
main([“right”、“-p”、“no:cacheprovider”])
返回“OK”
现在两个测试都显示失败,即使“正确”的项目没有问题

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


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

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

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

解决方案1 您只需为不同的名称更改主模块的名称:

app.py
right/
    main1.py
    test_solution1.py
wrong/
    main2.py
    test_solution2.py
测试解决方案.py

import main 1
def test_subtract():
断言main1.减去(5,3)==2
测试解决方案2.py

导入main2
def test_subtract():
断言main2.减去(5,3)==2
解决方案2 保持相同的文件名,但指定要导入的子模块:

测试解决方案.py

从右主导入
def test_subtract():
assert main.subtract(5,3)==2
测试解决方案2.py

来自错误的导入主节点
def test_subtract():
assert main.subtract(5,3)==2

这是因为Python在搜索模块时正在本地目录中查找,而您在
app.py
和文件夹
right
error
所在的同一位置启动Python。

在上传显示两个失败的第二个屏幕截图时遇到问题,所以这里就是