• 赚钱入口【需求资源】限时招募流量主、渠道主,站长合作;【合作模式】CPS长期分成,一次推广永久有收益。主动打款,不扣量;

在单元测试中测试UIKit可访问性

iOS rin, seun 10个月前 (06-19) 109次浏览 0个评论

我在UIKit中编写自定义进度视图:

在单元测试中测试UIKit可访问性                                                                                   我的循环进度视图

该视图的设计目标之一是替代UIProgressView。这意味着它应该尽可能接近地建模UIProgressViewAPI 行为。此方面的一个重要方面是可访问性:理想情况下,我的进度视图应与系统进度视图与VoiceOver用户没有区别。

单元测试中的辅助功能属性

为此,我想编写一个单元测试,当它发现我的视图的可访问性设置与standard的可访问性设置存在差异时,它将失败UIProgressView。不过,在编写该测试之前,我们应该检查UIProgressView实际上的可访问性属性是什么,以确保我们看到正确的数据:

/// Simple tests for the accessibility properties of UIKit controls,
/// to prove that the test setup is working.
class UIAccessibilityTests: XCTestCase {
  func testUIProgressViewAccessibility() {
    let progressView = UIProgressView()
    progressView.progress = 0.4

    XCTAssertTrue(progressView.isAccessibilityElement)
    XCTAssertEqual(progressView.accessibilityLabel, "Progress")
    XCTAssertEqual(progressView.accessibilityTraits, [.updatesFrequently])
    XCTAssertEqual(progressView.accessibilityValue, "40%")
    // More assertions ...
  }
}

根据运行此测试的环境,其中某些或所有断言会意外失败:

  • 在框架的单元测试目标中,所有断言都会失败。
  • 在iOS应用程序的单元测试目标中,只有第一个断言(isAccessibilityElement)失败,其他的才通过​​。

(是的,我知道某些断言是与语言环境相关的。如果您的测试应用程序具有除英语以外的其他语言的本地化版本,则在运行测试时可能必须在构建方案中配置正确的语言。)

Dominik Hauser发现我们可以通过将视图添加到可见窗口并为其提供非零帧来进行第一个断言传递:

  func testUIProgressViewAccessibility() {
    let progressView = UIProgressView(frame: (CGRect(x: 0, y: 0, width: 200, height: 20)))
    progressView.progress = 0.4

    let window = UIWindow(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
    window.makeKeyAndVisible()
    window.addSubview(progressView)

    XCTAssertTrue(progressView.isAccessibilityElement)
    XCTAssertEqual(progressView.accessibilityLabel, "Progress")
    /// ...
  }

非常感谢您的帮助,Dominik(以及其他回答我的问题的人)!

要求

综上所述,在单元测试中测试UIKit可访问性属性的要求似乎是:

  1. 您的测试目标必须附加到应用目标。这些测试在库/框架的单元测试目标中不起作用,大概是因为当未将测试注入到正在运行的应用程序中时,使窗口可见并不起作用。
  2. 在被测视图上设置非零框架。
  3. 创建一个UIWindow(最好也使用非零帧,尽管这与我的测试无关),然后将视图添加到窗口中。致电window.makeKeyAndVisible

我说“似乎是”是因为我不确定行为是100%确定性的。某些视图(例如)UILabel不需要其他设置。

更重要的是,我已经看到我的测试至少失败了一次。发生这种情况时,从测试应用程序(而不只是在测试中)登录到控制台时,诸如之类的属性accessibilityLabel 甚至都不会返回其正确的值。好像模拟器上的整个辅助功能系统都没有运行。曾经将Accessibility Inspector附加到模拟器似乎可以解决问题(也许这导致了Accessibility系统重新启动),并且即使在多次重新启动之后,我也无法重现该问题。现在一切似乎都在工作。

我的测试环境:带有iOS 13模拟器的Xcode 11.4.1。

喜欢 (0)

您必须 登录 才能发表评论!