Tag: 快照测试

为什么我要编写快照测试?

测试是任何高质量软件的组成部分。 我相信每个公司或软件发行商都必须先验证产品的质量,然后才能投放市场。 据说,如果质量好,它将吸引更多的用户。 这个事实也适用于软件开发。 我们以手动或自动方式执行UI测试,以确认应用程序的行为正确并具有符合规范的所有功能。 如果我们进行更细化的单元测试,则可以测试单个单元。 我们通过编写肯定的测试(即正确通过测试)和否定的测试(即测试意外数据到来时单元的行为)来涵盖所有极端情况。 编写自动化测试以捕获UI“正确性”实际上是不可能的。 测试UI困难的原因是,UI最小模块的显着细节很难以编程方式表达。 正确性不能由输出的文本部分确定。 我们希望质量保证将重点放在需要人工关注或可以通过自动化完美测试的功能的确切状态下的确切组件上。 但是UI单元测试呢? 好吧,我们为此提供了一个解决方案: 快照测试! iOSSnapshotTestCase如何捕获快照? iOSSnapshotTestCase提供FBSnapshotVerifyView(view)方法来将期望与参考快照进行比较。 如果不存在参考快照,它将捕获。 这个方法使用`renderInContext()`来捕获快照,但是`renderInContext()`有一些限制,您不能使用它来测试Visual元素或UIAppearance。 为了测试这些元素,还有另一种方法“ drawViewHierarchyInRect”。 要使用此方法,您需要在测试中设置`useDrawViewHierarchyInRect = true`。 drawViewHierarchyInRect的性能不好,所以我建议仅在确实需要时使用useDrawViewHierarchyInRect = true。 iOSSnapshotTestCase如何比较快照? 有很多比较图像的方法。 我在演讲中得到的第一个答案是逐像素比较图像,这是正确的,但在逐像素比较之前,我们还需要考虑其他方面。 让我们看看它如何进行比较: 首先,它比较图像大小。 如果不匹配,则测试失败。 如果容差率为零,则使用C函数“ Memcmp()”在内存级别比较图像。 为此,它使用calloc()在内存中分配空间,并使用CGContextRef在内存中绘制图像。 如果容差率> 0,即表示您可以接受,即使存在x%的差异,它也会通过对numberOfPixels(即图像宽度*高度)进行迭代来逐像素比较图像。 iOSSnapshotTestCase的功能: 它会根据测试类和选择器自动命名磁盘上的参考映像。 如果要在单个测试方法中执行多个快照,则需要提供一个可选的“标识符”。 使用`isDeviceAgnostic`。 如果您在测试中将此属性设置为true,它将在测试名称中附加设备型号,操作系统编号和大小。 优点: 快照测试易于编写。 在执行重构时,您不必担心,就好像只有代码重构一样,测试也不会失败。 解耦:视图将松散耦合。 易于验证不同尺寸的布局。 我建议以一个模拟器(即iPhone 6)为基础来捕获快照。 如果您使用3倍快照的iPhone 8,则尺寸会很大。 如果您使用的是CI / CD工具,请确保也在那里设置了默认模拟器iPhone 6。 […]

Swift 5 Snapshot Testi

AdınaCardNumberTestskoyalım。 Bir kredikartıView’ıyapıpbunun快照testini yapmak istiyorum。 本AMCreditCardViewadındabir Github reposundanyararlandım。 İndiripiçindekiAMCreditCardView查看地图,查看如何设置Alalım。 Swift 5içinufak bir fixyaptım。 Böylece快照testiniökrenanak观看。 Unutma,依依 Ardındanbir测试班’ıyazıyoruz。 FBSnapshotTestCase’tentüremelibu类。 哦,XCTestCase’tentürüyorkendiiçinde。 Biz enbaştaUnit Test’li bir projeistediğimiziçinXcode bizimiçinbir taneayarladı。 Onuaçıpiçineaşağıdakikodu tamamenyapıştıralım。 导入XCTest @testable导入CardNumber 导入FBSnapshotTestCase 类CardNumberTests:FBSnapshotTestCase { 覆盖func setUp(){ super.setUp() recordMode = true } func testCardType(){ 让cardView = AMCreditCardView( 框架:CGRect(x:0,y:0,宽度:240,高度:150)) cardView.cardNumber =“ 4374123412341234” cardView.cardHoldersName =“ ERK EKIN” cardView.expirationDate =“ 06/32” […]