Tom*_*art 23 xcode ui-testing ios xcode7 xcode-ui-testing
Apple在Xcode 7中引入了新的UI测试,但是每当测试启动应用程序时我都会遇到困难,它从应用程序之前的数据开始.这意味着测试不能独立,并且可能受到其他测试的影响.
无法访问用户默认值和其他数据,因为运行测试的应用程序无法访问已测试应用程序的捆绑包.脚本也是不可能的,因为它们可以在测试之前或之后运行.并且无法在iOS上执行NSTask以在每个测试套件之前运行脚本.
有没有办法在每个测试套件之前重置应用程序数据?
Mat*_*ats 21
不是直截了当的方式.但是有一些解决方法.
该XCUIApplication可以设置命令行参数和环境变量,可以改变你的应用程序的行为.
一个简单的main.m文件示例:
int main(int argc, char * argv[]) {
#if DEBUG
// Reset all data for UI Testing
@autoreleasepool {
for (int i = 1; i < argc; ++i) {
if (0 == strcmp("--reset-container", argv[i])) {
NSArray *folders = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSFileManager *fm = [[NSFileManager alloc] init];
for (NSString *path in folders) {
[fm removeItemAtPath:path error:nil];
}
// Also remove documents folder if necessary...
}
}
}
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
}
}
Run Code Online (Sandbox Code Playgroud)
另外-[XCTestCase setUp]:
XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchArguments = @[@"--reset-container"];
[app launch];
Run Code Online (Sandbox Code Playgroud)
如果为你的UITests准备应用程序application:didFinishLaunchingWithOptions:是好的,那么你可以做以下事情:
在setUp()测试类扩展的方法中XCTestCase添加以下代码:
let application = XCUIApplication()
application.launchEnvironment = ["UITESTS":"1"]
application.launch()
Run Code Online (Sandbox Code Playgroud)
然后,application:didFinishLaunchingWithOptions:您可以使用以下代码检查标志:
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
let env = ProcessInfo.processInfo.environment
if let uiTests = env["UITESTS"], uiTests == "1" {
// do anything you want
}
// further set up code
}
Run Code Online (Sandbox Code Playgroud)
当然,如果这是你的选择.
注:除设定"1"的参数为"UITESTS"标志,你可以指定不同的测试用例不同的值-甚至测试方法(但在这种情况下,你应该从测试方法启动应用程序,而不是setUp())
注2:我建议将处理标志的代码包装成#if DEBUG块.
| 归档时间: |
|
| 查看次数: |
6819 次 |
| 最近记录: |