使用模拟和屏幕截图进行iOS UI测试

时间:2015-12-17 17:13:53

标签: ios objective-c unit-testing xcode-ui-testing

我想用iOS设置一个UI测试系统,允许我只测试一个ViewController或UIView,这样

a)我可以提供Mocked数据 b)我可以将其视图呈现给模拟器 c)我可以截取它的截图,将其保存到磁盘并聚合快照(如快照)

为什么呢? 1)QA团队想要快速验证UI仍然看起来应该如何 2)我们希望能够快速迭代具有深度定位,复杂的程序化视图的外观,Interface Builder无法以任何有意义的方式支持这些视图。

Xcode 7 UI测试不适合此目的,因为您无法实际编译任何原始代码。

逻辑XCTest框架似乎更合适,但可以理解的是,它不愿意向屏幕呈现任何内容。我不在乎:我想要在屏幕上呈现一些东西。

请饶恕我关于真正的TDD和UI与逻辑测试的教条哲学渊源。 Android Studio完全可以实现这一点,并且我已经用它取得了很大的成功。

提前感谢您的帮助。

实施例

Model * model = [[MockModel init] alloc]
model.value = @(10)

UIViewController * importantViewController= [[ImportantViewController alloc] initWithModel:model];

TestAppDelegate *appDelegate = (TestAppDelegate *)[UIApplication sharedApplication].delegate;

UINavigationController *navController = (UINavigationController*)appDelegate.window.rootViewController;

[navController pushViewController:importantViewController animated:NO];

TakeSnapshot("Important01")

2 个答案:

答案 0 :(得分:1)

如您的问题和评论中所述,您希望:

  1. 测试UIView或UIViewController
  2. 提供" mock"数据
  3. 将视图渲染为可写入磁盘的图像。
  4. 您有三组不同的选项:

    应用程序测试

    应用程序测试启动应用程序并将测试包注入其中。这允许在测试中进行最大程度的控制。大多数应用程序将在应用程序生命周期的早期执行一些设置步骤,这些步骤将会“污染”#34;测试环境。您可以按照this answer中的指导或创建最小的应用程序目标进行测试。

    在你的测试中你可以创建" mock"将对象建模到心灵内容并将其传递给视图或查看控制器。在应用程序测试中,您可以通过在根视图控制器中添加或删除视图,提供自己的根视图控制器或以模态方式呈现视图控制器来自由更改测试中的视图层次结构。如Technical QA 1817: View Snapshots on iOS 7所述,截取屏幕截图很简单。

    UI测试

    使用UI测试的过程与应用程序测试类似。您与视图层次结构的大多数交互都是通过UI测试代理对象,这可以限制测试的可行性或不可行性。 UI测试允许您记录,回放和编辑与用户界面的交互 - 这是它的主要好处。根据你的问题,这对你来说可能没什么用处。就像应用程序测试一样,对于UI测试,您将需要能够创建一个" clean"测试环境。

    UI自动化

    UI自动化是UI测试的前身(UI测试基于UI自动化)。就像UI测试一样,UI Automation允许回放,记录和编辑与应用程序用户界面的交互。与UI测试不同,UI自动化在仪器中的Xcode之外运行 - 这使得模拟对象等的自由度大大降低,尽管通过启动参数和其他将参数传递给被测应用程序的方法仍然可以实现。 UI Automation使截图变得相当容易。

      

    Xcode 7 UI测试不适合此目的,因为您无法实际编译任何原始代码。

    构建UI测试或应用程序测试时,它们依赖于应用程序目标。运行测试时,它们将注入到作为依赖项构建的应用程序中。因此,实际编译和运行测试中的应用程序和测试本身的原始代码。

答案 1 :(得分:0)

Facebook创建了一个优秀的库iOS-Snapshot-Test-Case来对UIViews和CALayers进行快照测试。有了它,您可以创建单元测试,生成视图的.png文件,并将它们与之前生成的(已知的好)示例进行比较。

所有渲染都在屏幕外完成,速度非常快。但它没有内置支持测试UIViewControllers。因此,您可能需要进行一些按摩以使其正常工作,这不应该比确保根视图已实例化并使用合理的(设备大小)框架布局更复杂。

有一点需要注意。无论出于何种原因,Facebook认为没有必要允许您在编写测试时定义设备分辨率(1x,2x,3x)。因此,您需要注意记录哪些设备并运行测试。