Fleet 是一个以 UIKit 为核心的测试框架,旨在用于 Swift 编写的 iOS 和 tvOS 项目的测试。
安装
有关在 iOS 或 tvOS 项目中安装 Fleet 的详细信息,请参阅安装部分。iOS: iOS,tvOS: tvOS。
功能
Storyboard 注入和模拟
Fleet 允许测试代码注入到Storyboard中,并从Storyboard中拉取模拟。这为您提供了 双重优点 —— 能够像在生产代码中一样精确地测试视图控制器及其相互之间的交互,同时不牺牲对任何特定视图控制器进行单元测试的能力。
有关使用Fleet的Storyboard特性的更多信息,请参阅文档部分。
与UIKit元素交互
Fleet 扩展了 UIKit 类,以便更容易地测试您的代码与 UIKit 的交互。以下是对每个扩展类的功能概要。有关这些功能的更多信息以及如何使用的示例代码,请参阅文档文件夹。
- UIViewController - 使 UI 运行循环表现得更加一致,以便可以轻松地测试视图控制器的显示和隐藏。
- UITableView - 提供模拟用户对表格视图进行操作的方法,确保所有适当的代理和数据源回调都得以执行。
- UINavigationController - 允许可视图控制器测试在不等待 UI 运行循环的情况下在导航栈上推送和弹出。
- UIButton - 提供在测试中交互按钮的便利方法。
- UIBarButtonItem - 提供类似于为 UIButton 提供的便利方法。
- UIAlertController - 允许可视图控制器测试简单地点击警报操作以测试其行为。
- UITabBarController - 提供选择标签的便利方法。
- UINavigationBar - 点击导航栏中的项。
- UITextField - 提供输入文本的便利方法。 (仅限iOS)
- UISwitch - 提供在测试中与开关进行交互的便利方法。 (仅限iOS)
- UITextView - 提供在文本视图中输入文本的便利方法。 (仅限iOS)
- UIToolbar - 点击工具栏中的项。 (仅限iOS)
视图控制器测试的配置
Fleet 除了Storyboard注入和模拟之外,还提供了另一种帮助设置视图控制器的方法。它可以通过提供以下方法,轻松地将视图控制器设置在适当的键应用窗口中。
// Takes a `UIViewController`, makes it the test app key window's root, and kicks off its lifecycle.
Fleet.setAsAppRootWindow(_:)
// Takes a `UIViewController`, makes it the root of a navigation stack, kicks off the lifecycle, and
// returns the navigation controller that hosts that view controller.
Fleet.setInAppWindowRootNavigation(_:)
Fleet 强烈建议在测试主机的主窗口中使用上述方法之一来运行所有视图控制器测试。有关为什么的更多讨论,请参阅 FAQ 中的相关部分。
常见问题解答(FAQ)
- Fleet是否为了提供其特性而进行了大量的乱序处理?
- 我自己调用所有的代理方法和事件,能否达到同样的效果?
- Fleet为什么会抛出异常?我应该如何处理它们?
- 为什么我应该在UIWindow中执行所有的UIViewController单元测试?
示例
为了帮助您开始使用Fleet,我们创建了一个真实、可工作的项目,该项目完全由Fleet驱动测试,并包含许多适用于任何Swift iOS应用程序的基本测试示例。
对于更复杂、更大规模的项目,可以使用Fleet,以下是一些项目示例: