python unittest ModuleNotFoundError:没有名为<;的模块&燃气轮机;

python unittest ModuleNotFoundError:没有名为<;的模块&燃气轮机;,python,import,python-unittest,Python,Import,Python Unittest,我试图用flask和unittest包装简单的Python项目。结构非常简单: classes |-sysinfo |static |templates |- index.html |- layout.html |__init__.py |sysinfo.py |printinfo.py tests |test_sysinfo.py README.md requirments.txt p

我试图用
flask
unittest
包装简单的Python项目。结构非常简单:

classes
  |-sysinfo
      |static
      |templates
         |- index.html
         |- layout.html
      |__init__.py
      |sysinfo.py
      |printinfo.py
  tests
  |test_sysinfo.py
README.md
requirments.txt
printinfo.py
中非常简单的类:

 #!/usr/bin/python
import psutil
import json
class SysInfo:
.......
    def displayInfo(self):
        .......
        return json.dumps(self.__data)
from flask import Flask, flash, redirect, render_template, request, session, abort
from printinfo import SysInfo
import json
obj1 = SysInfo("gb")
app = Flask(__name__)
@app.route('/')
def index():
    var = json.loads(obj1.displayInfo())
    return render_template('index.html',**locals())
@app.route('/healthcheck')
def healthcheck():
    return "Ok"
@app.route("/api/all")
def all():
    return obj1.displayInfo()
if __name__ == '__main__':
   app.run(host='0.0.0.0', port=80)
del obj1
和使用sysinfo.py运行的简单flask服务器:

 #!/usr/bin/python
import psutil
import json
class SysInfo:
.......
    def displayInfo(self):
        .......
        return json.dumps(self.__data)
from flask import Flask, flash, redirect, render_template, request, session, abort
from printinfo import SysInfo
import json
obj1 = SysInfo("gb")
app = Flask(__name__)
@app.route('/')
def index():
    var = json.loads(obj1.displayInfo())
    return render_template('index.html',**locals())
@app.route('/healthcheck')
def healthcheck():
    return "Ok"
@app.route("/api/all")
def all():
    return obj1.displayInfo()
if __name__ == '__main__':
   app.run(host='0.0.0.0', port=80)
del obj1
我使用python
sysinfo.py
运行它,并保持在
classes/sysinfo
文件夹中,一切正常

所以我决定为我的应用程序运行unittest。放入
classes/tests
(也尝试了
classes/sysinfo/tests
)文件
test\u sysinfo.py
,代码为:

import unittest
import printinfo
from sysinfo import sysinfo
import json
import sys
class TestFlaskApi(unittest.TestCase):
    def setUp(self):
        self.app = sysinfo.app.test_client()
    def simple_test(self):
        response = self.app.get('/health')
        self.assertEqual(
            json.loads(response.get_data().decode(sys.getdefaultencoding())),
            {'healthcheck': 'ok'}
        )
if __name__ == "__main__":
    unittest.main()
当我启动它时,我可以看到错误:

Error Traceback (most recent call last):
   File "\Python\Python37-32\lib\unittest\case.py", line 59, in testPartExecutor
     yield   File "\Python\Python37-32\lib\unittest\case.py", line 615, in run
     testMethod()   File "\Python\Python37-32\lib\unittest\loader.py", line 34, in testFailure
     raise self._exception ImportError: Failed to import test module: test_sysinfo Traceback (most recent call last):   File
 "\Python\Python37-32\lib\unittest\loader.py", line 154, in
 loadTestsFromName
     module = __import__(module_name)   File "\classes\sysinfo\tests\test_sysinfo.py", line 2, in <module>
     import printinfo ModuleNotFoundError: No module named 'printinfo'
错误回溯(最近一次调用上次):
testPartExecutor中的第59行文件“\Python\Python37-32\lib\unittest\case.py”
生成文件“\Python\Python37-32\lib\unittest\case.py”,第615行,正在运行
testMethod()文件“\Python\Python37-32\lib\unittest\loader.py”,第34行,在testFailure中
提升自我。\异常导入错误:导入测试模块失败:测试\系统信息回溯(最近一次调用上次):文件
“\Python\Python37-32\lib\unittest\loader.py”,中的第154行
loadTestsFromName
模块=\uuuuu导入\uuuu(模块名称)文件“\classes\sysinfo\tests\test\u sysinfo.py”,第2行,在
导入printinfo模块NotFoundError:没有名为“printinfo”的模块
我在这里读了几篇关于StackOverflow的文章和一些主题,以了解它与项目结构的关系。我试图创建
setup.py
setup.cfg
。我设法用这个设置启动它,但测试仍然不起作用


你能帮我做一个适用于我的案例的最低设置吗?我找到的所有材料都是针对具体情况编写的,或者过于笼统。我无法将其应用于我的案例。

遵循我编辑的flask教程
\uuuu init\uuuuuuuupy
文件从这里启动应用程序:

from flask import Flask, flash, redirect, render_template, request, session, abort
from . import printinfo
import json
import os

obj1 = printinfo.SysInfo("gb")

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev'
    )

    obj1 = printinfo.SysInfo("gb")

    @app.route('/')
    def index():
        var = json.loads(obj1.displayInfo())
        return render_template('index.html', **locals())

    @app.route('/healthcheck')
    def healthcheck():
        return "Ok"

    @app.route("/api/all")
    def all():
        return obj1.displayInfo()

    #del obj1
    return app
此外,还应为烧瓶设置环境变量: 对于Linux和Mac:

export FLASK_APP=sysinfo
export FLASK_ENV=development
对于Windows cmd,请使用set而不是export:

set FLASK_APP=sysinfo
set FLASK_ENV=development
并运行应用程序:

flask run
自开发环境设置以来,它在端口5000上的本地主机上运行应用程序。无论如何,我需要从中添加
。将printinfo
导入
\uuuuu init\uuuuu.py


没有尝试测试,但认为它应该有效。如果感兴趣,将很快更新。

刚刚完成了本教程。创建了
conftest.py
test\u factory.py
。使用
pytest运行Ok

import pytest
from sysinfo import create_app
from sysinfo import printinfo

@pytest.fixture
def app():
    app = create_app({
        'TESTING': True
    })

    with app.app_context():
        printinfo.SysInfo("gb")

    yield app

可能相同的设置可用于
unittest
。没有尝试。

这是一个
sys.path
问题。如果通过
python classes/tests/test\u sysinfo.py
运行测试,则
classes/sysinfo
目录将不在
sys.path
中,因此python无法导入
printinfo
模块。无需进一步修改项目结构,您可以将目录添加到
sys.path
中,作为一种解决方法:
PYTHONPATH=classes/sysinfo/python classes/tests/test\u sysinfo.py
。但是,您的导入看起来有点混乱
sysinfo
是一个包,因此您应该通过
从sysinfo导入printinfo
导入
printinfo
(正如您已经使用另一个模块所做的那样:
从sysinfo导入sysinfo
)。修复后,将
classes
添加到
sys.path
(因为它是
sysinfo
包的父目录),导入问题应该得到解决:
PYTHONPATH=classes python classes/tests/test\u sysinfo.py
我尝试过,现在它引发了另一个与代码相关的错误,模块错误丢失。谢谢@hoefling,我已经开始重构代码,从setup.py以模块的形式运行我的代码。阅读手册并尝试使其适应我的现实。我准备放弃(根据
\uuu init\uuuuuuuuuuupy
中决定初始化应用程序的文档)。下面是代码:
def create\u app(test\u config=None):\u35;从映射创建并配置app app=Flask(\uu name\uuuuuu,instance\u relative\u config=True)app.config(SECRET_KEY='dev')from.import printinfo#Create printenv class instance obj1=printinfo.SysInfo(“gb”)
相同的错误…
flask.cli.NoAppException:导入“SysInfo”时,引发了一个导入错误:
是否可以编辑问题,添加新的代码位和新的错误跟踪?