Tag: 快照

iOS快照测试

为iOS应用程序的用户界面编写测试非常麻烦。 由于进行基于视图的测试很困难,许多人不愿编写这些测试。 不幸的是,直到最近我还是遇到了验证我的观点的不同状态的问题。 为了实际查看结果,我需要在修改视图后多次运行该应用程序,这花费了很多时间。 因此,我试图寻求一种更有效的方式来处理这种情况,并且找到了一个完美的解决方案— FBSnapshotTestCase 。 它能做什么 快照测试用例采用已配置的UIView,并将其呈现为其内容的图像快照。 它将快照与存储在我的源代码存储库中的参考图像进行比较,如果两个图像不匹配,它将创建另一个参考图像。 通过将视图和现有快照都绘制到两个CGContextRef ,并使用C函数memcmp()对它们进行内存比较,进行比较。 这使其非常快。 安装与设置 按照他们在GitHub页面上的说明,我将pod ‘FBSnapshotTestCase’添加到pod ‘FBSnapshotTestCase’的测试目标中。 另外,推荐的设置参考目录的方法是在我的方案中定义FB_REFERENCE_IMAGE_DIR 。 这应该指向我要存储参考图像的目录。 示例值为$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages 。 很方便吧? 让我们开始编写一些代码。 实作 为了演示如何利用FBSnapshotTestCase的优势,我创建了一个具有两种不同状态的简单视图控制器:空和正常。 一方面,当视图控制器的状态设置为空时,它应该显示一个文本标签。 另一方面,视图控制器在状态正常时应显示字符串列表。 enum State { case empty case normal([String]) } 让我们编写一些测试来验证它们。 首先,子类FBSnapshotTestCase而不是XCTestCase。 然后将recordMode = true添加到setup方法中。 它将使宏记录新的屏幕截图,而不是对照参考图像检查结果。 最后,添加以下两个测试功能,以存储我的视图控制器的图像并运行测试。 func testViewControllerEmpty() { let vc = ViewController() FBSnapshotVerifyView(vc.view) } func testViewControllerNormal() { […]

Xamarin的fastlane快照

部署到模拟器 生成应用程序时,需要将其部署到Simulator。 为此,我创建了bash脚本: 创建Xcode UI测试 将应用程序部署到Simulator后,我们可以接下来移动并创建FastlaneSnapshotXamarinTest项目,并选中“ Include UI Tests”。 下一步是通过命令fastlane snapshot init初始化fastlane快照 。 并取消注释要从中获取屏幕快照的设备(在Snapfile中 )。 现在,我们需要将SnapshotHelper.swift添加到FastlaneSnapshotXamarinTestUITests。 SnapshotHelper.swift文件需要进行一些小的修改,我们需要使用默认的构造函数将XCUIApplication的创建替换为XCUIApplication,并使用接受bundleIdentifier:“ com.organization.appname”的构造函数。 实际上,测试本身包含一种使用bundleIdentifier激活应用程序的方法:“ com.bohdanhrybach.FastlaneSnapshotXamarin” ,使用reverseText标识符向UITextField输入文本,使用01UserEntry图像名称创建快照,然后按下带有reverseButton标识符的UIButton并使用02Alert进行快照 图片名称。 就这些。 现在您应该可以在Xamarin上使用fastlane快照了

使用FBSnapshotTestCase测试用户界面

有时,您需要为应用程序的UI添加自动测试。 有几种不同的方法可以实现此目的。 在测试中,您可以获取屏幕的元素并断言所有帧是否都符合您的期望。 根据要测试的UI,这可能需要很多工作。 或者,您可以使用Xcode提供的UI测试。 但是这些操作非常慢,以我的经验,有时它们只是停止工作。 有更好的选择。 Facebook有一个名为FBSnapshotTestCase的开源组件。 此类允许您创建快照测试。 快照测试将视图的UI与快照的外观进行比较。 让我们看看它是如何工作的。 我要测试的UI如下所示: 有两个带有标签,按钮和两个文本字段的堆栈视图。 使用迦太基安装FBSnapshotTestCase 我是迦太基人。 因此,我将向您展示如何使用迦太基在测试目标中安装FBSnapshotTestCase并使用它为简单的登录屏幕添加快照测试。 创建一个如下所示的Cartfile: github“ facebook / ios-snapshot-test-case” 然后要求Carthage使用以下命令创建动态框架 迦太基更新-平台iOS 迦太基将从github上获取源代码并构建框架。 迦太基完成后,将框架从迦太基/ Bild / iOS文件夹中拖动到测试目标的链接二进制文件与库构建阶段: 接下来,向测试目标添加一个新的运行脚本构建阶段。 输入命令 / usr / local / bin / carthage复制框架 并添加输入文件$(SRCROOT)/Carthage/Build/iOS/FBSnapshotTestCase.framework 。 在Xcode中,它应如下所示: 配置FBSnapshotTestCase 接下来,您需要配置放置快照的目录。 每当快照测试失败时,您还可以告诉FBSnapshotTestCase创建差异映像。 这意味着,当测试失败时,将创建一个图像,该图像显示预期的UI和使测试失败的UI之间的差异。 这样,您可以找出UI中发生了什么变化。 打开您使用测试的方案,并添加以下环境变量: FB_REFERENCE_IMAGE_DIR:$(SOURCE_ROOT)/ $(PROJECT_NAME)测试/失败差异 FB_REFERENCE_IMAGE_DIR:$(SOURCE_ROOT)/ $(PROJECT_NAME)测试 在Xcode中,它看起来像这样: 创建快照 要创建快照测试,请将FBSnapshotTestCase的子类添加到测试目标并添加以下导入语句: 导入FBSnapshotTestCase […]

XCTest中的快照测试

“这不是一个错误,这是一个功能”。 几乎每个团队成员都已经学会了这句话。 是的,很奇怪,可以说它存在一定数量的缺陷。 但不是关于显示效果不好的布局。 考虑到交付到商店的时间成本,这对于移动测试尤为重要。 我们有许多类似的工具可用于测试iOS应用程序中的布局。 但是大多数人只是从一个人那里分叉或提出了一个主意。 因此,在此XCNote中,我想谈一谈– iOSSnapshotTestCase 。 该工具最初是在Facebook的领导下作为一个开源项目创建的。 随着时间的流逝,进入存档的计划被传递给了Uber,该项目仍在成功开发中。 最令人高兴的是, iOSSnapshotTestCase继承自XCTestCase ,这显然意味着,我们根本不需要对自动化系统进行任何更改。 我还要注意,我们可以像XCUITest一样在XCUITest中使用iOSSnapshotTestCase。 太好了,让我们尝试。 一开始,我们应该: 在Podfile中添加一个额外的pod: 保存参考快照的功能由位于setUp()中的变量recordMode调节: recordMode = true //保存参考快照 recordMode = false //使用实际验证参考快照 为了对每个测试进行多个检查,我们应该将“ identifier”设置为FBSnapshotVerifyView和FBSnapshotVerifyLayer方法的参数。 如果需要通过XCUITest验证全屏快照,则可能会遇到以下问题:状态栏中会发生冲突(电池,时间等)。 可以解决此问题,尽管以一种有点荒谬的方式进行—在拍摄快照时,剪掉用于状态栏的几个像素。 主要问题是,由于iPhone X系列的状态栏尺寸不标准: 我们可以使用UIImage扩展来实现此拐杖: 此后,为了在所有iPhone机型上正确执行此裁切操作,我们将需要学习如何从测试中确定裁切结果。 为此,我们需要扩展UIDevice : 然后将像这样使用它: 有时我们可能需要验证全屏快照,但特定元素除外。 谁能画画? 还有油漆吗?)现在该重新油漆了,因为我们可以借助“ 着色 ”解决这个问题。 我不是在开玩笑😉。 为此,我们需要: 1.通过创建fill(element:XCUIElement)方法再次扩展UIImage ,该方法将在快照上绘制所选元素: 2.在先前创建的验证方法附近创建一个新方法verifyScreen(不包含元素:XCUIElement) : 综上所述,我想说的是,至少可以在移动设备上使用快照进行测试,并且最多可以加快我们的自动化测试的速度。 阅读完有关快照测试的文章后,如果您有任何疑问或澄清,我们将很乐意为您解答。 您可以在这里找到完成的项目: https://github.com/alter-al/sample_of_ios_snapshot_testing_2048 所以,祝你好运,玩得开心,以后再见(:

如何使用FBSnapshotTestCase在iOS中进行UI测试

在视图控制器中更改某些代码已经发生了多少次,并且在生产环境中测试应用程序时,视图已经发生了神奇的变化? 如果我们不想,我们是否应该有某种方法来确保视图不变? 因此,进行UI测试很重要。 通过添加UI测试,我们可以确保不会对UI进行意外更改。 在本文中,我们将在一个简单的示例项目中专注于FBSnapshotTestCase的用法。 FBSnapshotTestCase的历史 最初,FBSnapshotTestCase由Facebook创建和维护。 这是一个非常有用的工具,具有非常简单的实现。 所需要做的就是将库集成到项目中,并实例化我们要测试的UIView或UIViewController子类。 不幸的是,自去年以来,Facebook已停止维护该工具。 Facebook已经创建了另一个与其内部基础设施紧密相关的工具,因此他们不赞成该工具。 对我们来说幸运的是, Uber决定为他们当前维护的项目创建一个分支。 FBSnapshotTestCase测试实际上是单元测试,它使我们能够将UIViewController的参考图像(也可以是UIView,但通常是在全屏模式下)与视图的当前呈现进行比较。 如果存在任何不一致(第一张图像与第二张图像之间存在差异),FBSnapshotTestCase将生成第三张图像,并以灰度标出差异。 如果参考图像和项目中的电流之间存在差异,则该工具将生成此第三张图像,并且在该单元测试中会生成错误,从而导致测试套件产生故障。 Fastlane为我们提供了类似的工具Fastlane Snapshot(存储库),它使我们能够在Xcode UI测试中截取屏幕截图。 所有UI测试完成后,如果它们都获得批准,它将生成带有所有屏幕截图的HTML文件。 Fastlane Snapshot默认情况下还允许我们设置我们要查看的所有设备和语言。 这对于测试所有可能的组合非常有用(如果您有3种语言,应用程序中有10个屏幕,并且支持5种设备,则它会生成3 x 10 x 5 = 150个屏幕截图!)。 问题在于,这只是一个屏幕截图,它没有为我们带来有关图像是否具有正确UI的信息。 总而言之,FBSnapshotTestCase允许我们比较并告诉我们是否有任何错误,Fastlane Snapshot只是为我们带来了Xcode UI测试的屏幕截图。 我们将讨论以下主题,力图充分利用该工具的潜力: 如何集成FBSnapshotTestCase 使用SnapKit重构代码并使用FBSnapshotTestCase 编写脚本以生成具有不同分辨率的屏幕 要开始本教程,请下载以下示例项目https://github.com/fedejordan/FBSnapshotTestCaseExample 在模拟器中编译项目(我使用过iPhone 8),您将看到以下屏幕: 一个简单的View Controller,可以是任何应用程序的第一个屏幕,带有登录和注册按钮。 我已经使用CocoaPods集成了SDK。 您可以使用Carthage或您选择的包裹管理员。 集成该工具的步骤在存储库指南中。 为了方便起见,以下是使用CocoaPods的安装说明: 在终端应用程序中,我们输入pod init以创建podfile 在podfile中,我们添加pod ‘FBSnapshotTestCase’ 我们在终端中进行pod install以下载SDK 我在这里使用的版本是2.1.6 将SDK集成到项目中后,我们将打开CocoaPods生成的工作区并编译项目,以确保一切正常。 就像它在FBSnapshotTestCase官方指南中所说的那样,我们转到Edit […]