运行python单元测试无法在正确的目录中找到我要导入的文件

Sea*_*ean 5 python directory import python-unittest

这是我的代码在下面的代码框中的样子.当我运行它时,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工作区\ 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))
Run Code Online (Sandbox Code Playgroud)

打印声明的结果:

======================== 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
Run Code Online (Sandbox Code Playgroud)

问题是我需要为Python单元测试设置什么环境变量或设置,以便它可以在以下位置的正确目录中查看我的文件:

C:\ Users\sepham\Documents\LiClipse工作区\ sengtool_data_funnel\tests\test_networks

顺便说一下,我正在使用LiClipse IDE.

此外,这是运行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
Run Code Online (Sandbox Code Playgroud)

如果我将文件放在目录中导入如下,那么它可以正常工作:

C:\ Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel

de1*_*de1 9

总结您的问题:

您具有以下项目结构:

- sengtool_data_funnel (project root)
  - tests
    - test_networks
      - test_json??_networks.py
      - example_EventsOfInterestColumnAggregate.json
      - example_EventsOfInterestConcatenate.json
Run Code Online (Sandbox Code Playgroud)

当您运行测试时,工作目录是 ,sengtool_data_funnel而不是sengtool_data_funnel/tests/test_networksJSON 文件所在的目录。因此,您遇到了异常。

为什么项目根目录是默认工作目录

通常,当您编写测试时,您会想要测试项目结构中的代码。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)
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,如果您更改了工作目录,它仍然可以工作(尽管我不知道您为什么要这样做)。


Sea*_*ean -5

好吧,在浪费了很多时间之后,我终于找到了自己的答案。如果您想在主项目目录的子目录中导入文件进行测试,则需要在LiClipse IDE中执行以下操作。

右键单击 test_name.py 文件

运行方式>>运行配置

选择您的文件名

(x)= 参数选项卡

工作目录>>文件系统

选择您的目录