如何通过单个Xcode Bot实现多语言区域自动化测试?
单个Xcode Server Bot实现多语言/多区域测试的方案
当然可以搞定!不用费劲给每种语言单独建Bot,我给你分享几个实用的方案,亲测有效:
方案1:用Xcode测试计划(Test Plan)(最推荐)
Xcode 11及以后推出的Test Plan简直是为这种场景量身定做的,操作直观还不用写额外代码:
- 打开你的项目,通过
File > New > Test Plan新建一个测试计划 - 切换到「Configurations」标签,点击「+」添加新配置,比如命名为「Chinese (CN)」「English (US)」
- 选中每个配置,在右侧「Options」面板里设置对应的「Application Language」和「Application Region」
- 把你的单元测试/UI测试目标添加到每个配置中,确保每种语言环境都能跑全测试
- 配置Bot时,在「Testing」模块选择这个Test Plan,替代默认的单个测试目标
这样Bot每次运行时,会自动遍历所有配置,用对应的语言和区域完整跑一遍测试,结果还会按配置分类展示,查看起来特别清晰!
方案2:通过Bot的Pre-Action脚本动态指定语言
如果你的Xcode版本较低,或者需要更灵活的自定义逻辑,可以在Bot的前置动作里加脚本,调用xcodebuild时指定语言参数:
- 打开Bot配置页面,找到「Pre-Actions」,点击「+」选择「Run Script」
- 编写循环脚本,遍历你要测试的语言列表,每次调用
xcodebuild时指定不同的语言和区域:
# 定义要测试的语言区域组合 LANG_LOCALE_PAIRS=( "zh-Hans-CN zh_CN" "en-US en_US" ) for pair in "${LANG_LOCALE_PAIRS[@]}"; do read lang locale <<< "$pair" xcodebuild test \ -workspace YourApp.xcworkspace \ -scheme YourAppScheme \ -destination 'platform=iOS Simulator,name=iPhone 14' \ -testLanguage "$lang" \ -testRegion "$locale" done
- 注意:要禁用Bot默认的测试命令,改用脚本里的
xcodebuild调用,避免重复执行。测试结果会合并到Bot报告中,你可以通过日志区分不同语言的测试情况。
方案3:在测试代码里动态切换语言(细粒度控制)
如果需要给单个测试用例指定特定语言,可以在测试代码里设置启动参数或修改UserDefaults:
UI测试示例
import XCTest class LocalizationUITests: XCTestCase { func testChineseInterface() { let app = XCUIApplication() // 通过启动参数设置语言和区域 app.launchArguments += ["-AppleLanguages", "(zh-Hans-CN)"] app.launchArguments += ["-AppleLocale", "\"zh_CN\""] app.launch() // 验证中文文案是否正确 XCTAssertEqual(app.staticTexts["Welcome"].label, "欢迎") } func testEnglishInterface() { let app = XCUIApplication() app.launchArguments += ["-AppleLanguages", "(en-US)"] app.launchArguments += ["-AppleLocale", "\"en_US\""] app.launch() XCTAssertEqual(app.staticTexts["Welcome"].label, "Welcome") } }
单元测试示例
import XCTest class LocalizationUnitTests: XCTestCase { override func setUp() { super.setUp() // 设置语言和区域到UserDefaults UserDefaults.standard.set(["zh-Hans-CN"], forKey: "AppleLanguages") UserDefaults.standard.set("zh_CN", forKey: "AppleLocale") // 通知App语言变更(如果你的App监听了这个通知) NotificationCenter.default.post(name: NSNotification.Name("AppleLanguageChanged"), object: nil) } override func tearDown() { // 测试结束后恢复默认设置,避免影响其他测试 UserDefaults.standard.removeObject(forKey: "AppleLanguages") UserDefaults.standard.removeObject(forKey: "AppleLocale") super.tearDown() } func testChineseStringLocalization() { XCTAssertEqual(NSLocalizedString("welcome", comment: ""), "欢迎") } }
这种方式适合精准控制单个测试用例的语言环境,但要注意测试之间的状态隔离,避免语言设置残留影响其他测试。
一些注意事项
- 确保你的App已经添加了对应语言的本地化文件(
.strings),不然测试时会显示默认语言 - UI测试中,每次切换语言都要重新启动App,否则语言设置不会生效
- 使用Test Plan时,要确认每个配置都包含了所有需要测试的目标,避免漏测
- 脚本方案中,要根据你的项目类型(workspace/scheme)调整
xcodebuild的参数
内容的提问来源于stack exchange,提问作者Ericlm
相关产品推荐
相关产品推荐

