我一直在Xcode 7.3中编写UI测试,最近想添加一个启动参数来在应用程序中启用一些测试代码。我最初尝试设置XCUIApplication().launchArguments
,因为有几个人在不同的帖子中做过,但他们不会工作。
即使API文档说明了这些内容,但仍然无法在UI测试中设置launchArguments
和launchEnvironment
。
此外,当我尝试在UI测试方案中设置启动参数和环境变量时,它们也没有传递到应用程序,在单元测试或运行应用程序时,它们都是。
这是我为证明这一点所做的快速测试的副本,所有这些测试都失败了。
import XCTest
class LaunchDebugUITests: XCTestCase {
func testLaunchArgumentsSetting() {
XCUIApplication().launchArguments = ["abc"]
print("Arguments \(XCUIApplication().launchArguments)")
XCTAssertTrue(XCUIApplication().launchArguments.contains("abc"))
}
func testLaunchArgumentsAppending() {
XCUIApplication().launchArguments.append("abc")
print("Arguments \(XCUIApplication().launchArguments)")
XCTAssertTrue(XCUIApplication().launchArguments.contains("abc"))
}
func testLaunchEnvironmentSetting() {
XCUIApplication().launchEnvironment = ["abc":"def"]
print("Environment \(XCUIApplication().launchEnvironment)")
XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"])
}
func testLaunchEnvironmentAppending() {
XCUIApplication().launchEnvironment["abc"] = "def"
print("Environment \(XCUIApplication().launchEnvironment)")
XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"])
}
}
还有其他人遇到过这个吗?你有工作吗?
答案 0 :(得分:13)
XCUIApplication()
。
您不应多次调用 XCUIApplication()
。
我读过的很多博客多次拨打这个电话,大多数情况下并不重要。事实上,许多博客文章都将该函数视为访问单例。我有一种感觉这是不正确的,因为它看起来不对,但我认为其他人会说得对。
但事实并非如此。它不访问单例,实际上每次调用时都会创建一个新的XCUIApplication实例。因此我的代码失败了,因为我在一个实例上设置启动参数,然后创建另一个实例以启动。
所以我的测试实际上应该是这样的:
func testLaunchArgumentsSetting() {
let app = XCUIApplication()
app.launchArguments = ["abc"]
print("Arguments \(app.launchArguments)")
XCTAssertTrue(app.launchArguments.contains("abc"))
app.launch()
}
答案 1 :(得分:2)
然后,您还需要启动应用并在应用中查看参数。我就是这样做的......
func testFooBar() {
// given
app.launchArguments = ["shouldDoBar", "shouldDoFoo"]
// when
app.launch()
// then
}
然后在你的应用中
int main(int argc, char *argv[]) {
NSArray *arguments = [[NSProcessInfo processInfo] arguments];
if ([arguments containsObject:@"shouldDoBar"]) {
doBar();
}
if ([arguments containsObject:@"shouldDoFoo"]) {
doFoo();
}
...
}
您可能希望参数检查更适合您的使用(也可能包含在#ifdef DEBUG ... #endif
中以避免运送它)。