在PyCharm和unittests之间加载模拟数据进行单元测试时发生冲突。

问题描述 投票:0回答:1

我有一个Python项目结构如下。

.├── data├── src│ ├── module1│ └── module2└── tests ├── base ├── module1 └── module2

data 目录是我放置用于单元测试的模拟数据的地方(例如CSV文件)。如果我在PyCharm里面,在单元测试里面,我可以使用下面的相对路径,并使用IDE来运行单元测试(使用 unittests)成功。

pd.read_csv('../../data/mock.csv')

然而,在PyCharm之外,我可以尝试运行以下命令来运行单元测试。

python -m unittest tests/module1/*.py

我将得到一个错误,说文件不存在。如果我改变路径如下,那么从PyCharm外部运行单元测试就会成功,但在PyCharm内运行测试就会失败。

pd.read_csv('./data/mock.csv')

当我检查单元测试配置时,我注意到 working directory 设置为 /Users/myusername/myproject/tests/module1. 如果我把工作目录改为 /Users/myusername/myproject我得到以下错误信息。AssertionError: Path must be within the project.

我甚至尝试移动 data 目录进入 tests > module1但同样的冲突依然存在;现在 pd.read_csv('./data/mock.csv') 对PyCharm有效,但对终端失败。

有什么办法可以解决这个冲突吗?

python unit-testing pycharm
1个回答
0
投票

我解决了这个问题,抽象出了获取mock数据的路径。

def normalize_path(resource, proj_root='root_folder'):
    path = os.getcwd() # current working directory
    tokens = path.split('/') # tokens of directory path
    index = tokens.index(proj_root) # look for where project root ends
    tokens = tokens[1:index + 1] # reconstruct the path up to the project root
    p = '/'.join(tokens)
    p = f'/{p}/{resource}' # append the resource to the project root

    return p

在我的代码中,现在我做了如下的事情。

pd.read_csv(normalize_path('data/mock.csv'))

我可以在终端或PyCharm中顺利执行测试。

© www.soinside.com 2019 - 2024. All rights reserved.