我的最终目标是发布
xcodebuild test
从命令行为不同语言选择不同的方案。
目前我有两种方案,它们之间唯一的区别是应用程序语言。在一个方案中,它是英语,另一个是西班牙语。 如果我使用xCode运行应用程序它运行良好,它是使用我选择的方案中指定的语言启动的,EN或ES都可以。
如果我从xCode运行测试,则忽略语言设置。无论我选择哪种方案,都无关紧要,它始终显示为设备语言。在模拟器上相同。运行测试时也一样 xcodebuild测试 采摘计划。 (向方案添加echo命令可确保选择正确的命令)
在方案编辑器中,选中“使用运行操作的参数和环境变量”。
我做错了什么?
谢谢。
答案 0 :(得分:27)
是的,似乎在XCTest测试中忽略了方案中提供的所有环境变量和启动参数。
但是,您可以在测试中以编程方式设置语言,例如在setUp()
方法中:
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
let app = XCUIApplication()
app.launchArguments += ["-AppleLanguages", "(en-US)"]
app.launchArguments += ["-AppleLocale", "\"en-US\""]
app.launch()
}
现在,您可以扩展此方法并执行类似Snapshot
does的操作:
必须从快照向xcodebuild命令传递2件事 线工具:
设备类型通过目标参数传递 xcodebuild参数
语言通过临时文件传递 在运行测试之前由快照编写并由UI读取 启动应用程序时进行测试
最后,为了更改架构基础上的语言,您可以执行以下操作:
<强> 1。编写用于创建临时文件的Test的预执行脚本:
mkdir -p ~/Library/Caches/xcode-helper
echo "en-US" > ~/Library/Caches/xcode-helper/language.txt
<强> 2。在setUp()
中加载文件并设置应用语言:
override func setUp() {
super.setUp()
let app = XCUIApplication()
let path = NSProcessInfo().environment["SIMULATOR_HOST_HOME"]! as NSString
let filepath = path.stringByAppendingPathComponent("Library/Caches/xcode-helper/language.txt")
let trimCharacterSet = NSCharacterSet.whitespaceAndNewlineCharacterSet()
let language = try! NSString(contentsOfFile: filepath, encoding: NSUTF8StringEncoding).stringByTrimmingCharactersInSet(trimCharacterSet) as String
app.launchArguments += ["-AppleLanguages", "(\(language))"]
app.launchArguments += ["-AppleLocale", "\"\(language)\""]
app.launch()
}
从现在开始,Xcode将使用方案的预处理脚本中指定的语言/区域设置运行测试。
原来,测试不忽略方案中提供的参数。参数实际上传递给测试本身,但不传递给测试的应用程序。这可能是意料之外的,但这是有道理的。
话虽如此,你只需要这样做:
-AppleLanguages (en-US)
和-AppleLocale en_US
启动参数
XCUIApplication
方法launch()
实例
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
let app = XCUIApplication()
app.launchArguments += NSProcessInfo().arguments
app.launch()
}