如何正确导入单元测试的相对路径



我一直在阅读这个,这个和这个,但我仍然不知道如何正确导入以便我可以运行覆盖率。

这是我的应用程序的结构

package/
app/
services/
__init__.py
news_services.py
test/
news_test.py

这是导入

from ..app.services.news_services import NewsServices

这是我运行文件的命令。

coverage run .testnews_test.py

这是我得到的错误

ValueError: attempted relative import beyond top-level package

编辑:这是应用程序/服务的答案

对于同一应用程序/服务中的测试,我经常使用以下模式:

import inspect
import os
import sys
test_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
src_dir = os.path.join(test_dir, '..', 'app')
sys.path.append(src_dir)
from services.news_services import NewsServices

编辑:以下是软件包的原始内容,但问题似乎与应用程序/服务有关

你最好的选择,也是我每天在我维护的包中使用的一个,是安装你自己的包,根本不使用相对导入。

测试将完全像用户一样查找和导入包。

这是我install.sh,你只需要做一次;诀窍是以"可编辑"的方式安装它,在这种情况下,这将导致从环境中导入它的任何内容都准确地在你的工作结构中找到它,并带有所有本地更改:

#!/bin/bash
python3 -m venv env/
source env/bin/activate
pip install --editable "."

然后,在测试中:

from app.services.news_services import NewsServices

这个答案中也有描述:

https://stackoverflow.com/a/6466139/351084