python - python unittest ModuleNotFoundError:没有名为<...>的模块
问题描述
我尝试使用flask
and来创建简单的 Python 项目unittest
。结构很简单:
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)
简单的烧瓶服务器运行sysinfo.py
:
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
文件夹中,一切正常。
所以我决定为我的应用程序运行单元测试。使用代码放入classes/tests
(也尝试过classes/sysinfo/tests
)文件test_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'
我在 StackOverflow 上阅读了几篇文章和一些主题,以了解它与项目结构有关。我试图创建setup.py
和setup.cfg
. 我设法使用此设置启动它,但测试仍然无法正常工作。
您能帮我设置适用于我的案例的最低设置吗?我找到的所有材料都是针对特定案例或过于笼统而写的。我不能将它应用于我的案例。
解决方案
按照烧瓶教程我编辑__init__.py
文件从这里启动应用程序:
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
还应为 Flask 设置环境变量:对于 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 上的 localhost 上运行应用程序。无论如何,我需要添加from . import printinfo
到__init__.py
.
没有尝试测试,但认为它应该工作。如果有趣将很快更新。
推荐阅读
- git - 管道时 Git diff stat 更改
- magento2 - Magneto 2 中的 sequence_product 表中的列 sequence_value 指代
- opencart - 关于与产品一起进入购物车的产品价格
- reactjs - Safari 浏览器给出错误:未处理的承诺拒绝:无效日期
- asp.net-core - 具有本地化字符串的 ASP.NET Core API
- php - 我想将名称、电子邮件、联系人的 0 索引存储在新数组中,反之亦然所有数据
- sql - 在Sql Server中将Xml列分成多个用逗号分隔的列
- numpy - numpy 中的 frombuffer 和 fromiter 有什么区别?为什么以及何时使用这些
- python - Pyspark 展平 RDD 错误:: 要解压的值太多
- visual-studio - Visual Studio Mac OS 上的 Xamarin XAML 格式化似乎不起作用