我在Xcode中编写脚本来运行一些UI测试,我想使用一些全局变量。
我的第一次尝试是在@interface
中声明一个类型为strong
的变量,如下所示:
@interface Extended_Tests : XCTestCase
@property (strong) NSMutableArray *list;
@property (strong) NSString *name;
@end
但这没有用。
我最终使用了老式的C方式来声明方法之外的变量。
我的问题是,为什么这不起作用?为什么变量中的值不会持续存在于所有方法中?
编辑: 我的方法:
- (void)testMultiUser1 {
[[[XCUIApplication alloc] init] launch];
XCUIApplication *app = [[XCUIApplication alloc] init];
[app.buttons[@"Sign-in button"] tap];
sleep(5);
user1 = [app.staticTexts elementBoundByIndex:0].label;
[app.otherElements[@"LibraryView"] tap];
sleep(5);
_list = [[NSMutableArray alloc] init];
for(int i = 0; i < 3; i++){
XCUIElementQuery *file1 = [[app.cells elementBoundByIndex:i] descendantsMatchingType:XCUIElementTypeStaticText];
NSString *number = [file1 elementBoundByIndex:0].label;
[_list addObject:number];
}
XCTAssert(_list);
}
我希望这可以将变量保存到数组_list中,这样我就可以在另一种方法中使用它:
-(void)testMultiUser3{
//Go into Library and make sure top 3 files are different from user1
XCUIApplication *app = [[XCUIApplication alloc] init];
[app.otherElements[@"LibraryView"] tap];
sleep(5);
NSMutableArray *user2files = [[NSMutableArray alloc] init];
for(int i = 0; i < 3; i++){
XCUIElementQuery *list1 = [[app.cells elementBoundByIndex:i] descendantsMatchingType:XCUIElementTypeStaticText];
NSString *number = [list1 elementBoundByIndex:0].label;
[user2files addObject:number];
}
XCTAssert(!([user2files[0] isEqualToString:_list[0]] && [user2files[1] isEqualToString:_list[1]] && [user2files[2] isEqualToString:_list[2]]));
}
答案 0 :(得分:3)
您的问题特定于XCTest。
运行的每个测试都在测试用例类的新实例中运行。在您的情况下,为每个测试实例化一个新的Extended_Tests
对象。这就是为什么如果你在一个测试中设置任何一个变量,你就不会在另一个测试中看到这些变化。
一般来说,如果测试不依赖于其他测试的副作用,那么最好是因为您无法自行运行这些测试。最好是使用共享设置方法来设置状态并使用两种状态。
如果你绝对必须在测试之间共享变量,那么你可以使用类静态方法(用+而不是 - 来声明的方法)和静态变量,或者像你一样使用全局变量。