XControl中的PageControl UITest

问题描述:

我有一个应用程序,其中页面控件用于指示多个屏幕。当用户点击页面控件时(例如:在当前所选页面的右侧),滚动视图会滚动到以下屏幕。它工作正常。XControl中的PageControl UITest

我想写这个场景中的UI测试。我发现我无法点击特定的页面控件“点”来触发该操作。我可以检查的是页面控件存在和当前选择的页面。

的另一个问题是,即使我能做到这一点,我怎么能检查滚动视图已经滚动?我只能访问滚动视图的框架,而不是其边界。

我刚开始使用的Xcode UITest和它让我失望。我认为它现在会很强大(它是由Xcode 7引入的,之前它已经作为UI Automation提供),但它似乎还没有。

我将恢复到单元测试+手动功能测试。如果有人有其他想法,请分享。

不要这么快就放弃,Xcode的UITest可令人沮丧的时候,但一旦你想通了,使用什么招数,他们是非常强大:

您测试您UIPageControl这样的:

func testPageIndicator() { 
    let app = XCUIApplication() 
    app.launch() 

    let scrollView = app.scrollViews.element(boundBy: 0) 
    let pageIndicator = app.pageIndicators.element(boundBy: 0) 

    // test that page indicator is updated when user scrolls to page 2 
    scrollView.swipeLeft() 
    XCTAssertEqual(pageIndicator.value as? String, "page 2 of 3") 

    // test that scrollview scrolls to page 3 when user taps right of the current page in page indicator 
    pageIndicator.coordinate(withNormalizedOffset: CGVector(dx: 0.9, dy: 0.2)).tap() 
    XCTAssert(app.otherElements["page_3"].waitForExistence(timeout: 2)) 
    XCTAssertFalse(app.otherElements["page_2"].exists) 
    XCTAssertEqual(pageIndicator.value as? String, "page 3 of 3") 
} 

您可以使用coordinate方法告诉测试点击UIElement的位置。您将CGVector对象交给描述在哪里点击的方法。

例如一个CGVector(dx: 0.9, dy: 0.2)告诉测试挖掘元件在这个处于90%的宽度,并且其高度的20%的点。

你可以使用这个在UIPageIndicator点击向左的当前页面的右边(见上面的代码示例)

要测试,如果你是正确的页面中的UIScrollView您可以accessibilityIdentifier设置每个页面的上唯一的字符串,然后声明在点击页面控件后,具有该标识符的UIElement存在。

在我的情况下,页面3个UIViews。我将他们的accessibilityIdentifier设置为“page_1”,“page_2”和“page_3”,然后断言“page_3”存在,“page_2”不存在。

+0

这真的很复杂。我可以使用更简单的单元测试编写代码,并且测试代码将更加健壮,清晰并且可维护(代码中的0.9和0.2,特别是几乎让我心脏病发作!)我不知道,但在我看来,即使这些年来,UI测试缺乏很多。 –

+0

我不觉得它很复杂。当然UnitTests总是比UITests更可靠,但是有些东西是UnitTests无法做到的。就像测试用户实际使用它时应用程序的用户界面的行为一样。我完全同意UITests应该更可靠,像坐标系这样的黑客应该不是必需的,但我认为它也不算太糟糕。它当然胜过手动测试。 – joern

+0

这绝对比手动测试更好。我现在正在自动完成整个过程,因此手动测试主要用于交互设计测试 - 整个其他范围。关于单元测试不能测试特定用户交互的情况,好吧,我已经能够做到了(至少到现在为止)。我写了一个测试,从一个VC到另一个,测试UI元素和状态。我认为当UI测试变得更容易时,它将取代这种测试,但在此之前,我坚持单元测试更好。 –