FRY是一个iOS测试驱动程序。这个库的目的是简化与UIKit的交互。FRY通过提供清晰的API来完成视图查找、触摸交互、输入和空闲检测。
FRY还包含一个库FRYolator
,当它包括在你的目标中时,可以帮助创建集成测试。《FRYolator》的目标是记录目标的所有输入以便以后重现。目前FRYolator将记录并生成单元测试命令以回放触摸事件以及通过OHHTTPStubs或Nocilla的网络请求。
FRY命令通常由两部分组成,查找,它可以在屏幕上找到与之交互的内容,动作,即触摸、滑动、滚动或输入事件。
// Tap the button "Share" button on row 5
FRY.lookup(atSectionAndRow(0, 5)).lookup(accessibilityLabel(@"Share")).tap();
// Return all the image views that are inside a UITableViewCell
FRY.lookup(ofKind([UITableViewCell class])).lookup(ofKind([UIImageView class]));
// Tap the OK button inside the alert view
FRY.lookup(ofKind([UIAlertView class])).lookup(accessibilityLabel(@"OK")).tap();
并非所有命令都需要查找,因为它们在执行动作之前会隐式地查找所需的子视图。
// Select the text in the first UITextField
FRY.selectText();
// Scroll down to row 9 in section 0 of the first UIScrollView
FRY.searchFor(FRYDirectionDown, atSectionAndRow(0, 9));
// Select the '200' and 'lbs' on the first UIPickerView
FRY.selectPicker(@"200", 0).selectPicker(@"lbs", 1);
指定查找的命令也可以更加具体
// Select '200' and 'lbs' on the picker view inside of row 1 (skipping the picker view in row 0)
FRY.lookup(atSectionAndRow(0, 1)).selectPicker(@"200", 0).selectPicker(@"lbs", 1);
FRY提供了一些有用的宏,以创建编译器检查的谓词。有一个键值谓词辅助函数FRY_PREDICATE_KEYPATH
,以及选择器谓词辅助函数FRY_PREDICATE_SELECTOR
。这些谓词将确保键值或选择器是有效的,并为增加安全性添加一个isKindOf:
检查。在FRYDefines.h中也有一些用于更常见查找的短码辅助函数,如ofKind()
、atSectionAndRow()
和accessibilityLabel()
。
FRY使用强建模的触摸来生成UIKit触摸事件。这允许简单地创建任意触摸,以及创建常见触摸序列的明确API。
FRY.lookup(@"My Label").tap();
FRY.lookup(@"My Label").touch([FRYTouch doubleTap]);
FRY.lookup(@"My Label").touch([FRYTouch dragFromPoint:p1 toPoint:p2 forDuration:1]);
有关触摸综合的更多信息
输入是一个独立的API,与FRYQuery
不同,因为它实际上不查找任何视图,而是直接与私有API交互。
[FRYTypist typeString:@"Fake Input"]
FRY可以与硬件和软件键盘一起工作,但软件键盘非常慢。
存在一个辅助器 FRYIdleCheck,它将循环运行直到所有触摸结束,所有UI动画完成。这大大简化了流程控制,消除了绝大部分 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, false)
。如果你想要将这些添加到你的测试中,考虑在你的UI中添加动画,或者向代理提供额外的应用特定检查。所有 FRYQuery 动作在各个动作前后都会调用 FRYIdleCheck。
在执行一个特殊的点击序列时,FRYolator将会启用。一旦启用,所有触摸和网络活动将被记录,直到再次执行点击序列。这会将FRYolator可以记录的所有输入事件保存到一个 .fry
文件中。在 .fry
包中包含了所有的触摸事件和网络通信。
启用监控
#ifdef DEBUG
[[FRYolatorUI shared] registerGestureEnablingOnView:self.window];
#endif
FRY尝试使用相对于可访问性查找信息的视图的相对坐标。当UI发生变化时,这将最大化这些命令的可靠性。如果找不到可访问性信息,将使用绝对屏幕坐标。
FRYolator还可以可视化触摸事件。这被FRYolator用来指示记录正在进行,但也可以在自动化测试中轻松启用,以帮助编写测试。
启用触摸可视化
[[FRYTouchHighlightWindowLayer shared] enable];
如果将FRYolator库链接到目标中,触摸可视化将由 FRYTouchDispatch 自动启用。
iOS 8+正在积极支持并测试。所有触摸分发代码应该在任何iOS版本上都能工作,并且键盘代码也应该在iOS的早期版本中工作。
将FRY添加到你的Podfile中安装。如果你想要使用触摸记录,请将FRYolator添加到你的应用程序目标中。仅将其添加到'Debug'配置,以确保它不会被提交到应用商店,或者将其添加到一个调试目标。
带有调试配置的Podfile
target :YourTests do
pod 'FRY'
# Un-comment for touch visualization
# pod 'FRY/FRYolator'
end
target :YourApplication do
pod 'FRY/FRYolator', :configuration => "Debug"
end
这会导致你的测试目标链接到FRY,并且在你Debug
配置中链接你的应用程序与FRYolator。
KIF是一个出色的框架,基本上开始了iOS上的UI测试。推动我编写FRY而不寻求保持兼容性的核心设计与KIF不同之处在于,查找视图会修改视图层次结构以找到它。这导致了许多奇怪的问题,这通常不是我希望从测试角度获得的内容。
Robot是UI测试世界的后起之秀,非常有趣,其主要目标是速度。