编写可扩展XCUITests的技巧— WWDC 2017

在WWDC 2017上,有一个关于可测试性工程的精彩演讲,重点关注测试代码以及​​应用程序代码质量的重要性。 演讲介绍了通过编写出色的测试代码来提高应用程序可测试性的各种方法。 最重要的一点是第二部分,其中分享了改善UI测试的可伸缩性的技巧。 在这篇文章中,我们将看到Apple工程师分享的那些技巧。 请记住,这不仅仅是在WWDC上发表的演讲的复制粘贴,本文还提供了一些在Github 可扩展XCUITest上的演示项目的真实示例,以证明这些观点。

WTF是可扩展的测试代码吗?

即使未在生产中执行,测试代码也与应用程序代码一样重要。 我们绝对应该使我们的应用程序可测试,但还要付出一些努力使测试代码更具可伸缩性。 因此,可扩展测试代码的好处是

  • 更快地运行我们的测试
  • 使我们的测试即使对于非技术人员也更具可读性
  • 以更好的方式组织测试代码,避免重复
  • 轻松添加新的测试用例

示例应用

让我们探讨一下Apple工程师共享的一些技巧,这些技巧可通过示例应用程序Expandable-XCUITest使测试代码可扩展 ,该应用程序具有6种不同颜色的按钮,分别是红色,绿色,蓝色,黑色,灰色和黄色。 这是一个非常简单的应用程序,但请想象我们必须测试一些东西,例如

  • 轻按所有颜色
  • 只需点击RBG颜色
  • 点击非RBG颜色。

不可缩放的UI测试如下所示:

  func testTapAllColorNonScalable(){ 
     XCUIApplication()。buttons [“ RED”]。tap() 
     XCUIApplication()。buttons [“ BLUE”]。tap() 
     XCUIApplication()。buttons [“ GREEN”]。tap() 
     XCUIApplication()。buttons [“ BLACK”]。tap() 
     XCUIApplication()。buttons [“ YELLOW”]。tap() 
     XCUIApplication()。buttons [“ GRAY”]。tap()    
  } 

再次测试RGB和非RGB值,我们几乎必须重复同样的事情。 您可以在此处查看测试类Non_Scalable_XCUITestUITests.swift ,并猜测它有多混乱。 通过使用讲座中描述的技术,我们绝对可以做得更好。

编写可伸缩XCUITest的技巧

通过使用一些常见的面向对象的原理(例如抽象和封装),可以共享一些技巧以使测试可伸缩,可维护且更快。 让我们来看一些技巧

抽象的XCUIElement查询

如果存在多次使用XCUIElement查询的情况,请将其存储为变量。 在上面的示例中,我们点击了6次按钮,但唯一改变的是按钮的颜色。 我们可以轻松地将其包装到方法中。

  func tapButton(_ color:String){ 
      XCUIApplication()。buttons [color] .tap() 
  } 

现在,我们可以将颜色的名称传递给方法了。 我们可以走得更远,并将颜色的每个元素存储在数组中并遍历它们。

  func testTapAllColor(){ 
   让颜色= [“红色”,“蓝色”,“黑色”,“绿色”,“灰色”,“黄色”]    
    用于颜色{ 
        tapButton(颜色) 
     } 
  } 

现在,该测试看起来更具可维护性和可读性。

创建对象和实用程序功能

我们可以进一步创建一个Colors类,并将所有数据作为静态成员存储在该类中。 我们可以从测试中访问这些成员。

  颜色类{ 
      静态让颜色= [“红色”,“蓝色”,“黑色”,“绿色”,“灰色”,“黄色”] 
      静态功能tapButton(_颜色:字符串){ 
          XCUIApplication()。buttons [color] .tap() 
      } 
  } 

我们可以从测试中访问这些成员。 我们的测试将如下所示

  func testTapAllColor(){ 
       Colors.colors { 
          Colors.tapButton(颜色) 
        } 
  } 

封装通用测试工作流程

现在,我们必须测试特定的颜色。 我们还可以为RGB和非RGB颜色值定义Swift枚举。

  枚举RBG:字符串{ 
      案例红色=“红色” 
      蓝色外壳=“ BLUE” 
      绿色绿色=“绿色” 
  } 列举Non_RBG:字符串{ 
      黑色案例=“ BLACK” 
      case case =“ GRAY” 
      案例黄色=“黄色” 
  } 

我们可以从任何地方访问RGB和非RGB颜色的原始值。 现在,我们可以向Colors类添加更多实用程序功能。

  静态函数useRGB(_ rgb:RBG){ 
     XCUIApplication()。buttons [rgb.rawValue] .tap() 
  } 
    
  静态函数useNonRGB(_ nonRgb:Non_RBG){ 
     XCUIApplication()。buttons [nonRgb.rawValue] .tap() 
  } 

我们可以在测试中调用那些配置实用程序方法。

  func testRBGBlueButton(){ 
     Colors.useRGB(.blue) 
     Colors.useRGB(.red) 
     Colors.useRGB(.green) 
  } 

既然我们的测试分别点击了RBG和非RBG按钮,将使它更具可读性和可扩展性。

散布XCTActivities以获得更好的测试报告

活动是通过提供有意义的名称将这些操作分组的方式,因此XCTest结果将在结果中使用该活动名称以使其更具可读性。 您可以在此处阅读有关Apple官方文档中活动的更多信息。 在我们的示例中,我们可以添加XCTActivities并在测试报告中使其更具可读性。

  func testRBGBlueButton(){ 
       XCTContext.runActivity(名称:“仅检查RGB颜色”) 
         Colors.useRGB(.blue) 
         Colors.useRGB(.red) 
         Colors.useRGB(.green)       
       } 
  } 

您可以在github上查看整个测试类scalable_XCUITestUITests.swift。

尝试一下

您可以使用带有Xcode 9的Github 可扩展XCUITest上的示例项目自己尝试这些技巧。

  $ git clone https://github.com/Shashikant86/Scalable-XCUItest 
  $ cd可扩展XCUItest 
  $ open可扩展XCUITest.xcodeproj 

希望您已经在使用Swift抽象和封装来使XCUITests更具可伸缩性和可维护性,到目前为止,您对XCUITests的体验是什么? 在下面的评论中分享!

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..