You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XCUITestCase中读取项目内的JSON文件?

在XCUITest中读取本地JSON文件的正确方法

这个问题我之前也碰到过,核心原因是主App的Bundle和XCUITest Target的Bundle完全是两个独立的包,直接用Bundle.main在测试代码里肯定找不到文件,得换个姿势来:

第一步:确保JSON文件被添加到测试Target

先检查你的myfile.json有没有被包含到测试Target里:

  • 在Xcode中选中JSON文件,打开右侧的File Inspector(快捷键⌥⌘1)
  • 在Target Membership区域,勾选你的XCUITest Target(比如YourAppUITests)
  • 也可以去测试Target的Build Phases > Copy Bundle Resources里确认,这个文件是否在列表中,如果不在,点击+号添加进去

第二步:在测试代码中使用测试Target的Bundle

不要用Bundle.main,而是获取测试类所在的Bundle,有两种常用方式:

方式一:通过测试类获取Bundle(推荐)

这种方式最稳妥,不用硬写Bundle Identifier:

func testReadLocalJSON() {
    // 获取当前测试类所属的测试Bundle
    let testBundle = Bundle(for: type(of: self))
    
    // 从测试Bundle中查找JSON文件
    guard let jsonUrl = testBundle.url(forResource: "myfile", withExtension: "json") else {
        XCTFail("无法找到myfile.json,请检查文件是否加入测试Target")
        return
    }
    
    // 读取并解析JSON
    do {
        let jsonData = try Data(contentsOf: jsonUrl)
        let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments)
        // 这里可以根据需求解析成模型或者直接使用
        print("成功读取JSON: \(jsonObject)")
    } catch {
        XCTFail("读取/解析JSON失败: \(error.localizedDescription)")
    }
}

方式二:通过Bundle Identifier获取

如果你知道测试Target的Bundle Identifier(在测试Target的Build Settings > Product Bundle Identifier里查看),也可以这样写:

guard let testBundle = Bundle(identifier: "com.yourcompany.YourAppUITests") else {
    XCTFail("找不到测试Bundle")
    return
}

常见排查点

如果还是找不到文件,检查这几个地方:

  • 文件名拼写是否完全一致(注意iOS真机是区分大小写的,模拟器可能不区分,尽量保持一致)
  • 文件的withExtension参数不要带点,比如写"json"而不是".json"
  • 确认测试Target的Build Phases > Copy Bundle Resources里确实包含了这个JSON文件

内容的提问来源于stack exchange,提问作者leedex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:35:18