为什么不让@interface中声明的变量中的值在XCTest中的方法之间保持不变?

时间:2015-12-17 19:37:49

标签: objective-c xctest

我在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]]));
    }

1 个答案:

答案 0 :(得分:3)

您的问题特定于XCTest。

运行的每个测试都在测试用例类的新实例中运行。在您的情况下,为每个测试实例化一个新的Extended_Tests对象。这就是为什么如果你在一个测试中设置任何一个变量,你就不会在另一个测试中看到这些变化。

一般来说,如果测试不依赖于其他测试的副作用,那么最好是因为您无法自行运行这些测试。最好是使用共享设置方法来设置状态并使用两种状态。

如果你绝对必须在测试之间共享变量,那么你可以使用类静态方法(用+而不是 - 来声明的方法)和静态变量,或者像你一样使用全局变量。