AppKitActor 是 AppKit 应用程序的集成测试框架。它允许轻松自动化 Mac OS X 应用程序的 UI 测试,帮助开发人员检查 UI 元素的状态并与 NSWindows
和 NSViews
交互。
它利用 NSAccessibility 来识别视图和窗口,检查它们的状态并与它们交互。 AppKitActor 还使用未经记录的 Apple API,这对于测试构建不应构成问题,但不应包含在生产分发中。
AppKitActor 重度受 KIF 启发——这是一个类似的 iOS 集成测试框架。已经应用了相似的概念,甚至尝试保持方法名称的一致性,以便更容易过渡。
通过可访问性特性、值或类匹配视图、控件和窗口。可以使用 AND 和 OR 操作来组合匹配器以构建复杂的条件。
AppKitActor 可以将视图匹配缩小为识别仅限于特定或匹配的窗口和父视图中的视图。
不要在测试代码中填满睡眠来允许 AppKit 有时间动画变化或对动作做出反应。 AppKitActor 会等待合理的时间——10 秒——来等待 UI 匹配预期的检查,在此期间穿插主线程运行和重试的时间。
AppKitActor 可以验证 UI 元素是否存在或不存在。
验证多个窗口中的 UI 元素,包括 状态栏。
AppKitActor 在 Xcode 5 上无缝报告测试失败。请参阅 Actor 宏 了解如何进行。
KIF 是一个出色的 iOS 框架,但它不容易与 UIKit 解耦。
UIView
的简单性感到欣赏。NSControl
的责任分布在自身及其 NSCells
上。AppKitActor 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中,指定适当的接受测试目标
target 'Acceptance Tests', :exclusive => true do
pod 'AppKitActor', '~> 0.1.0'
end
在测试文件或接受测试的 target .pch 中导入框架头文件。
#import <AppKitActor/AppKitActor.h>
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 元素的。
使用了操作类 AKAANDMatcher
和 AKAORMatcher
的同样类型的操作匹配器。操作类 themselves 是无知的,并且可以同时作为 <AKAViewMatcher>
和 <AKAWindowMatcher>
行为。如果在同一操作中混合不同类型的匹配器,将引发运行时错误。
匹配由所有子匹配器验证的视图或窗口。一个或多个。
匹配由其至少一个子匹配器验证的视图或窗口。
匹配任何 NSView
实例。
匹配 NSButton
实例,通过以下条件进行筛选:
匹配一个 NSControl
实例,给定其启用或禁用状态。
匹配 NSImageView
实例,通过以下条件进行筛选:
与NSTextField
实例匹配,通过以下条件进行过滤:
与NSView
实例匹配,基于可见性或隐藏状态。
与NSPanel
实例匹配,通常用于警报窗口。
与NSStatusBarWindow
实例匹配。
请注意:此匹配器检查代表应用程序状态栏的私有Apple类。
与NSWindow
实例匹配,通过指定的标题进行过滤。
与NSView
或NSWindow
实例上的任何类型的可访问性属性值匹配,并且同时作为<AKAViewMatcher>
和<AKAWindowMatcher>
。可访问性属性值列在AppKit头文件NSAccessibility.h中[^1]。
提供了便捷的创建方法,用于通过以下条件进行过滤:
[^1]请注意,NSAccessibility比iOS上的UIAccessibility标准要低得多。有关详细信息,请参阅Apple的NSAccessibility文档。
稍后进行文档说明。
稍后进行文档说明。
AppKit最初是在我在Karumi开发的应用程序内部编写的。近年来,我被TDD说服并开始在服务器后端和iOS应用程序上积极使用它。不幸的是,我没有找到像iOS中的KIF那样易于使用的解决方案来帮助我进行验收测试。
欢迎合作。请帮助我们推动Mac应用程序的测试文化!
干杯!
Miguel Lara – [email protected]