AppKitActor 0.0.1

AppKitActor 0.0.1

测试测试过的
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2014年12月

未声明 维护。



AppKitActor 是 AppKit 应用程序的集成测试框架。它允许轻松自动化 Mac OS X 应用程序的 UI 测试,帮助开发人员检查 UI 元素的状态并与 NSWindowsNSViews 交互。

它利用 NSAccessibility 来识别视图和窗口,检查它们的状态并与它们交互。 AppKitActor 还使用未经记录的 Apple API,这对于测试构建不应构成问题,但不应包含在生产分发中。

AppKitActor 重度受 KIF 启发——这是一个类似的 iOS 集成测试框架。已经应用了相似的概念,甚至尝试保持方法名称的一致性,以便更容易过渡。


特性

灵活的匹配器

通过可访问性特性、值或类匹配视图、控件和窗口。可以使用 ANDOR 操作来组合匹配器以构建复杂的条件。

包含感知

AppKitActor 可以将视图匹配缩小为识别仅限于特定或匹配的窗口和父视图中的视图。

对 UI 的时间宽松

不要在测试代码中填满睡眠来允许 AppKit 有时间动画变化或对动作做出反应。 AppKitActor 会等待合理的时间——10 秒——来等待 UI 匹配预期的检查,在此期间穿插主线程运行和重试的时间。

AppKitActor 可以验证 UI 元素是否存在或不存在。

多窗口支持

验证多个窗口中的 UI 元素,包括 状态栏

Xcode 5 集成

AppKitActor 在 Xcode 5 上无缝报告测试失败。请参阅 Actor 宏 了解如何进行。

为什么不是 KIF?

KIF 是一个出色的 iOS 框架,但它不容易与 UIKit 解耦。

  • NSAccessibility API 与 UIAccessibility 非常不同。当面对这种情况时,你会对 UIView 的简单性感到欣赏。
  • AppKitActor 需要在屏幕上同时处理更多的窗口。
  • NSControl 的责任分布在自身及其 NSCells 上。

将 AppKitActor 添加到项目中

AppKitActor 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中,指定适当的接受测试目标

target 'Acceptance Tests', :exclusive => true do
    pod 'AppKitActor', '~> 0.1.0'
end

在测试中使用 AppKitActor

导入

在测试文件或接受测试的 target .pch 中导入框架头文件。

 #import <AppKitActor/AppKitActor.h>

Actor 宏

tester

使用 tester 宏作为与 UI 交互的入口点。该宏创建一个 AKAUITestActor 实例,可以用来检查和交互窗口和视图。它还捕获位置和当前测试用例,以便在有意义的地方报告失败。

system

使用 system 宏作为与应用程序本身和机器交互的入口点。该宏创建一个 AKASystemTestActor 实例,并像 tester 一样捕获位置和当前测试用例,以便在有意义的地方报告失败。

检查视图的存在性

家族方法 -waitForViewMatching: 检查应用程序任何窗口中与给定 <AKAViewMatcher> 定义匹配的视图。

id<AKAViewMatcher> viewMatcher = [AKAAccessibilityMatcher matcherWithHelp:@"This is a tooltip"];
[tester waitForViewMatching:viewMatcher];

将视图限制为给定父视图内的视图

id<AKAViewMatcher> viewMatcher = [AKAAccessibilityMatcher matcherWithHelp:@"This is a tooltip"];
[tester waitForViewMatching:viewMatcher];

或者,可以通过提供包含的窗口来缩小匹配范围

[tester waitForViewMatching:viewMatcher inWindow:aWindow];

包含窗口甚至可以定义为 <AKAWindowMatcher>,这使得测试更加灵活

id<AKAWindowMatcher> windowMatcher = [AKANSWindowTitleMatcher matcherWithTitle:@"My Document"];
[tester waitForViewMatching:viewMatcher inWindowMatching:windowMatcher];

默认情况下,<AKAUITestActor> 将尝试每 0.1 秒定位视图一次,最多10秒,暂停以让主线程执行 UI 代码。如果允许的最大时间到期而演员无法找到匹配的视图,则记录失败并继续测试。此失败将反映在 Xcode 中,指向使用 tester 宏的行。

如果找到匹配的视图,这些方法将返回实际的 NSView(或 NSControl)实例。如果匹配实际上是在内部 NSCell 上执行的,则返回的将是包含控件。

检查视图不存在性

方法 -waitForAbsenceOfWindowMatching:-waitForAbsenceOfWindowMatching:inWindow:-waitForAbsenceOfWindowMatching:inWindowMatching:-waitForAbsenceOfWindowMatching:inView: 默认情况下将等待视图从 UI 中消失长达10秒。

窗口

类似的函数可用来验证窗口的存在性或不存在性:-waitForWindowMatching:-waitForAbsenceOfWindowMatching:。前者在成功匹配时将返回匹配的窗口。

操作

通过 tester(它创建一个 AKAUITestActor),可以对匹配的视图执行操作。

点击

方法 -clickOnViewMatching:-clickOnViewMatching:inWindow:-clickOnViewMatching:inWindowMatching:-clickOnViewMatching:inView: 将向匹配的视图发送一个点击事件。如果 NSView 实例可用,也可以通过一个更定向的方法 -clickOnView: 来执行点击。

要执行点击事件

  • NSControl 实例将接收一个来自 nil 发送者的 -performClick: 消息。
  • 如果视图支持,将执行可访问性动作 NSAccessibilityPressAction
  • 否则,将通过 -mouseDown:-mouseUp: 发送位于视图中心位置的伪造鼠标左键事件。

键入

方法 -typeText:onControlMatching:-typeText:onControlMatching:inWindow:-typeText:onControlMatching:inWindowMatching:-typeText:onControlMatching:inView: 将尝试使用提供的文本设置可访问性值 NSAccessibilityValueAttribute。这些方法将等待控制上的字符串值发生变化,如果在超时时间内验证失败将记录失败。

也可以通过更定向的方法 -typeText:onControl: 来设置文本。

增加和减少

增加和减少是通常在 NSStepper 中可用的动作。

方法 -incrementControlMatching:-incrementControlMatching:inWindow:-incrementControlMatching:inWindowMatching:-incrementControlMatching:inView:-incrementControl: 将增加控制值。为此,它尝试定位响应 NSAccessibilityIncrementButtonAttribute 的元素并点击它。如果没有找到,将记录失败。

方法 -decrementControlMatching:-decrementControlMatching:inWindow:-decrementControlMatching:inWindowMatching:-decrementControlMatching:inView:-decrementControl: 将减少控制值。为此,它尝试定位响应 NSAccessibilityDecrementButtonAttribute 的元素并点击它。如果没有找到,将记录失败。


匹配器

有两种不同类型的匹配器:一种是针对 NSView 的,另一种是针对 NSWindow 元素的。

操作匹配器

使用了操作类 AKAANDMatcherAKAORMatcher 的同样类型的操作匹配器。操作类 themselves 是无知的,并且可以同时作为 <AKAViewMatcher><AKAWindowMatcher> 行为。如果在同一操作中混合不同类型的匹配器,将引发运行时错误。

AKAANDMatcher

匹配由所有子匹配器验证的视图或窗口。一个或多个。

AKAORMatcher

匹配由其至少一个子匹配器验证的视图或窗口。

视图匹配器

AKAAnyNSViewMatcher

匹配任何 NSView 实例。

AKANSButtonMatcher

匹配 NSButton 实例,通过以下条件进行筛选:

  • 任何发生。
  • 带有特定标题的按钮。

AKANSControlIsEnabledMatcher

匹配一个 NSControl 实例,给定其启用或禁用状态。

AKANSImageViewMatcher

匹配 NSImageView 实例,通过以下条件进行筛选:

  • 任何发生。
  • 显示带有特定名称的图像的图像视图。

AKANSTextFieldMatcher

NSTextField实例匹配,通过以下条件进行过滤:

  • 具有特定占位符文本的文本字段。
  • 具有特定字符串值的文本字段。
  • 具有特定字符串值的静态(不可编辑)文本字段。可用于检测标签。

AKANSViewIsHiddenMatcher

NSView实例匹配,基于可见性或隐藏状态。

窗口匹配器

AKANSAlertWindowMatcher

NSPanel实例匹配,通常用于警报窗口。

AKANSStatusBarWindowMatcher

NSStatusBarWindow实例匹配。
请注意:此匹配器检查代表应用程序状态栏的私有Apple类。

AKANSWindowTitleMatcher

NSWindow实例匹配,通过指定的标题进行过滤。

通用匹配器

AKAAccessibilityMatcher

NSViewNSWindow实例上的任何类型的可访问性属性值匹配,并且同时作为<AKAViewMatcher><AKAWindowMatcher>。可访问性属性值列在AppKit头文件NSAccessibility.h中[^1]。

提供了便捷的创建方法,用于通过以下条件进行过滤:

  • 可访问性描述,当明确提供时。
  • 帮助字符串,提供它的最自然方式是通过视图的工具提示。
  • 标题,对于按钮很有用。
  • 值,对于状态控件很有用。

[^1]请注意,NSAccessibility比iOS上的UIAccessibility标准要低得多。有关详细信息,请参阅Apple的NSAccessibility文档


示例

稍后进行文档说明。


扩展框架

稍后进行文档说明。


动机

AppKit最初是在我在Karumi开发的应用程序内部编写的。近年来,我被TDD说服并开始在服务器后端和iOS应用程序上积极使用它。不幸的是,我没有找到像iOS中的KIF那样易于使用的解决方案来帮助我进行验收测试。

欢迎合作。请帮助我们推动Mac应用程序的测试文化!

干杯!
Miguel Lara – [email protected]
Go Karumi