首页 文章

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

提问于
浏览
5

这是我的代码在下面的代码框中的样子 . 当我运行它时,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 .

此外,这是运行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

3 回答

  • -3

    可能是您可以在python文件中使用sys模块test_json_networks.py在文件的开头

    import sys
    sys.path.append('C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel')
    

    这应该能够解决您的问题

  • -1

    好吧,在浪费了大量时间后,我终于想出了自己的答案 . 如果要在主项目目录的子目录中导入要测试的文件,则需要在LiClipse IDE中执行以下操作 .

    右键单击test_name.py文件

    运行方式>>运行配置

    选择您的文件名

    (x)=参数选项卡

    工作目录>>文件系统

    选择你的目录

  • 3

    总结一下你的问题:

    您有以下项目结构:

    - 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文件所在的位置 . 因此,您遇到了异常 .

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

    通常在编写测试时,您需要测试项目结构中的代码 . 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)
    

    这样做的好处是,如果你改变你的工作目录它仍然可以工作(虽然我不知道你为什么要这样做) .

相关问题