我的XCode UI测试如何检测屏幕是否已更改?

时间:2015-12-16 19:57:52

标签: ios objective-c xcode testing xcode-ui-testing

我正在尝试使用XCode 7的XCTest UI测试功能创建一个树木漫步者,该功能系统地探索表视图的确定性树到指定的深度。它几乎可以工作,除了我无法可靠地检测任何给定元素上的点击是否实际上触发了到新屏幕的转换。我有一个hacky方法,大部分时间都可以工作,即检测导航栏标签已更改或菜单元素的数量已更改。

第一个测试有误报,因为连续的屏幕可以有相同的导航条标签(我走的代码库不是我的)。第二个测试有误报,因为有时单击表元素不会转换到另一个表/屏幕,而是在当前屏幕上添加额外的元素。

在做了一些阅读之后,似乎使用辅助功能标签可能就是这样。因此,我在应用程序代码(在viewDidAppear中)为导航栏的可访问性标签设置了一个UID,然后在UI测试代码中对其进行测试。感觉这应该有效,但我只能在测试代码中找到 nil 的值。

我会自由地承认,在UI测试方面我是一个菜鸟,主要是切割/粘贴/调整其他人的代码而不清楚我正在做什么。所以我可能在可访问性标签代码本身中做出某种天真的错误,并且可能在概念层面上检测到屏幕已经改变;也许我可以做的事情更简单/更惯用。

在申请中:

- (void)viewDidAppear: (BOOL)animated {

    [super viewDidAppear: animated];

    //...

    UINavigationBar* navBar = self.navigationController.navigationBar;
    if( navBar )
    {
        static NSInteger s_UID = 0;
        navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++];
    }
}

在XCTest UI测试中:

- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app
{
    NSString* result = NULL;

    XCUIElementQuery *navBars = app.navigationBars;
    XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0];
    if( firstElem )
    {
        result = (NSString*)firstElem.accessibilityLabel; // This is always nil
    }

    return result;
}

注意找到firstElem IS,并且我能够提取例如 firstElem.label 非常高兴。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:6)

您可以测试元素是否可访问:

在UI测试中左键单击并开始录制,模拟器将启动,您可以单击模拟器内的元素,如果元素可访问,Xcode将在testExample方法中为您编写测试代码。

enter image description here

或者在模拟器中运行您的应用并打开辅助功能检查器,并将鼠标悬停在元素上,因为详细信息将显示在检查器中。

enter image description here

除此之外,我认为您可以通过为每个屏幕添加导航项标题来验证这一点,即self.navigationItem.title = @"myScreen";

然后用断言验证屏幕,即

// let app = XCUIApplication() // Swift

UIApplication *app = [UIApplication alloc] init]; // Objective-C

XCTAssertEqual(app.navigationBars.element.identifier, "myScreen") // Don't forget to import class XCTest

答案 1 :(得分:0)

我会使用Facebook's Snapshot test library进行快照测试。

  

基于视图的测试意味着验证用户看到的是什么   希望用户看到。这样做意味着能够确保这一点   您的观点的不同版本,或您的观点的不同状态,   继续看起来一样。基于视图的测试可用于提供   高级测试,涵盖了对象周围的大量用例。

您可以找到一篇更详细的文章here.