为啥@interface 中声明的变量中的值不会在 XCTest 中的方法之间持续存在?

Posted

技术标签:

【中文标题】为啥@interface 中声明的变量中的值不会在 XCTest 中的方法之间持续存在?【英文标题】:Why don't the values in variables declared in @interface persist between methods in XCTest?为什么@interface 中声明的变量中的值不会在 XCTest 中的方法之间持续存在? 【发布时间】:2015-12-17 19:37:49 【问题描述】:

我正在 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】:

您的问题是 XCTest 特有的。

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

一般来说,最好不要依赖其他测试的副作用,因为您将无法自行运行这些测试。最好使用共享设置方法来设置状态并从两个状态中使用。

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

【讨论】:

Objective-C 没有类属性。不过它有类方法。 是的,没错,但是您可以使用此处的任何一种方法来模拟它们:***.com/questions/695980/… 也许将您的答案改写为@NobodyNada 在技术上是正确的。然而,更好的参考可能是Setting Static Variables in Objective-C,但也许我有偏见;-) 哦,我明白了。谢谢大家的帮助!

以上是关于为啥@interface 中声明的变量中的值不会在 XCTest 中的方法之间持续存在?的主要内容,如果未能解决你的问题,请参考以下文章

IOS OC声明变量在@interface括号中与使用@property的区别

为啥要在 main 中声明一个静态变量?

iOS OC声明变量@interface和@property的区别

为啥新类不会出现在 Interface Builder 的 Identity Inspector/Custom Class 中?

java里的interface接口类怎么用?

为啥javascript不会在while循环中堆叠