运行 python 单元测试无法在正确的导入目录中找到我的文件
Running python unit-test cannot find my files in the correct directory to import
这就是我的代码在下面的代码框中的样子。当我 运行 时, my_dir 和 network_json 的结果分别是:
my_dir: C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel
network_json:
C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel\example_EventsOfInterestColumnAggregate.json
但是我的test_json_networks.py文件的项目目录结构如下:
C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel\tests\test_networks
json_files_input = [
'example_EventsOfInterestColumnAggregate.json',
'example_EventsOfInterestConcatenate.json']
@pytest.mark.parametrize('network_json', json_files_input)
def test_network_jsons(network_json):
my_dir = os.path.dirname(os.path.abspath(network_json))
network_json = os.path.join(my_dir, network_json)
print my_dir
print network_json
with open(network_json) as jdata:
network = Network.load(json.load(jdata))
打印语句的结果:
======================== CAPTURED OUTPUT =========================
C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel
C:\Users\sepham\My Documents\LiClipse
Workspace\sengtool_data_funnel\example_EventsOfInterestColumnAggregate.json
问题是我需要为 Python 单元测试设置什么环境变量或设置,以便它可以在正确的目录中看到我的文件:
C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel\tests\test_networks
顺便说一下,我正在使用 LiClipse IDE。
此外,这是 运行ning python 单元测试时的错误消息,因为它看不到我要导入的文件:
E IOError: [Errno 2] No such file or directory: 'C:\Users\sepham\My
Documents\LiClipse
Workspace\sengtool_data_funnel\example_EventsOfInterestCo
lumnAggregate.json'
File "C:\Users\sepham\My Documents\LiClipse
Workspace\sengtool_data_funnel\tests\test_networks\test_json_networks.py",
line 58 IOError
如果我将要导入的文件放在如下目录中,则它可以正常工作:
C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel
好吧,在这上面浪费了很多时间之后,我终于找到了自己的答案。
如果要在主项目目录的子目录下导入文件进行测试,需要在LiClipse中进行如下操作IDE.
右键单击 test_name.py 文件
运行 作为 >> 运行 配置
选择你的文件名
(x)= 参数选项卡
工作目录 >> 文件系统
选择你的目录
也许您可以在 python 文件中使用 sys 模块 test_json_networks.py
在文件的开头
import sys
sys.path.append('C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel')
这个应该可以解决你的问题
总结您的问题:
您的项目结构如下:
- sengtool_data_funnel (project root)
- tests
- test_networks
- test_json_networks.py
- example_EventsOfInterestColumnAggregate.json
- example_EventsOfInterestConcatenate.json
当您 运行 测试时,工作目录是 sengtool_data_funnel
而不是 sengtool_data_funnel/tests/test_networks
,JSON 文件所在的目录。因此你遇到了异常。
为什么项目根目录是默认工作目录
通常在编写测试时,您会希望测试项目结构中的代码。 Python 将在工作目录中查找模块(当然还有已安装的包)。
如果您的工作目录不是项目根目录,那么您可能会开始发现很难加载不在该目录(例如父目录)中的任何模块。即使是同一目录中的模块也可能存在问题。那是因为绝对包结构不再匹配您的项目结构。你可能最终会使用修改 sys.path
.
之类的技巧
这就是默认工作目录是项目根目录的原因,它应该保持原样。
你能做什么?
现在假设工作目录确实是项目根目录,我们有几个选择。
首先,您可以简单地加载 sengtool_data_funnel/tests/test_networks/example_EventsOfInterestConcatenate.json
而不是 example_EventsOfInterestConcatenate.json
或者,您可以加载与测试脚本相关的文件。 Python 为您的测试脚本定义了 __file__
。即 os.path.dirname(__file__)
在这种情况下会指向 sengtool_data_funnel/tests/test_networks
。您可以将脚本更改为:
my_dir = os.path.dirname(__file__)
network_json = os.path.join(my_dir, network_json)
这样做的好处是,如果您更改了工作目录,它仍然可以工作(尽管我不知道您为什么要这样做)。
这就是我的代码在下面的代码框中的样子。当我 运行 时, my_dir 和 network_json 的结果分别是:
my_dir: C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel
network_json:
C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel\example_EventsOfInterestColumnAggregate.json
但是我的test_json_networks.py文件的项目目录结构如下:
C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel\tests\test_networks
json_files_input = [
'example_EventsOfInterestColumnAggregate.json',
'example_EventsOfInterestConcatenate.json']
@pytest.mark.parametrize('network_json', json_files_input)
def test_network_jsons(network_json):
my_dir = os.path.dirname(os.path.abspath(network_json))
network_json = os.path.join(my_dir, network_json)
print my_dir
print network_json
with open(network_json) as jdata:
network = Network.load(json.load(jdata))
打印语句的结果:
======================== CAPTURED OUTPUT =========================
C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel
C:\Users\sepham\My Documents\LiClipse
Workspace\sengtool_data_funnel\example_EventsOfInterestColumnAggregate.json
问题是我需要为 Python 单元测试设置什么环境变量或设置,以便它可以在正确的目录中看到我的文件:
C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel\tests\test_networks
顺便说一下,我正在使用 LiClipse IDE。
此外,这是 运行ning python 单元测试时的错误消息,因为它看不到我要导入的文件:
E IOError: [Errno 2] No such file or directory: 'C:\Users\sepham\My
Documents\LiClipse
Workspace\sengtool_data_funnel\example_EventsOfInterestCo
lumnAggregate.json'
File "C:\Users\sepham\My Documents\LiClipse
Workspace\sengtool_data_funnel\tests\test_networks\test_json_networks.py",
line 58 IOError
如果我将要导入的文件放在如下目录中,则它可以正常工作:
C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel
好吧,在这上面浪费了很多时间之后,我终于找到了自己的答案。 如果要在主项目目录的子目录下导入文件进行测试,需要在LiClipse中进行如下操作IDE.
右键单击 test_name.py 文件
运行 作为 >> 运行 配置
选择你的文件名
(x)= 参数选项卡
工作目录 >> 文件系统
选择你的目录
也许您可以在 python 文件中使用 sys 模块 test_json_networks.py 在文件的开头
import sys
sys.path.append('C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel')
这个应该可以解决你的问题
总结您的问题:
您的项目结构如下:
- sengtool_data_funnel (project root)
- tests
- test_networks
- test_json_networks.py
- example_EventsOfInterestColumnAggregate.json
- example_EventsOfInterestConcatenate.json
当您 运行 测试时,工作目录是 sengtool_data_funnel
而不是 sengtool_data_funnel/tests/test_networks
,JSON 文件所在的目录。因此你遇到了异常。
为什么项目根目录是默认工作目录
通常在编写测试时,您会希望测试项目结构中的代码。 Python 将在工作目录中查找模块(当然还有已安装的包)。
如果您的工作目录不是项目根目录,那么您可能会开始发现很难加载不在该目录(例如父目录)中的任何模块。即使是同一目录中的模块也可能存在问题。那是因为绝对包结构不再匹配您的项目结构。你可能最终会使用修改 sys.path
.
这就是默认工作目录是项目根目录的原因,它应该保持原样。
你能做什么?
现在假设工作目录确实是项目根目录,我们有几个选择。
首先,您可以简单地加载 sengtool_data_funnel/tests/test_networks/example_EventsOfInterestConcatenate.json
而不是 example_EventsOfInterestConcatenate.json
或者,您可以加载与测试脚本相关的文件。 Python 为您的测试脚本定义了 __file__
。即 os.path.dirname(__file__)
在这种情况下会指向 sengtool_data_funnel/tests/test_networks
。您可以将脚本更改为:
my_dir = os.path.dirname(__file__)
network_json = os.path.join(my_dir, network_json)
这样做的好处是,如果您更改了工作目录,它仍然可以工作(尽管我不知道您为什么要这样做)。