使用AcceptanceMark自动生成Xcode测试

自动生成测试? 是的,请。

这篇文章展示了如何使用Markdown表为您的软件/应用程序编写业务逻辑 ,以及如何使用名为AcceptanceMark的命令行工具为Xcode 自动生成测试

但是首先,一些背景 。 您的代码可能具有以下测试形式:

  • 单元测试
  • 整合测试
  • 验收测试
  • UI测试

阅读此处 可以很好地了解它们之间的区别。

此外,您可能有一个专门的质量检查小组,并定期手动运行您的应用程序以验证其正确性。

虽然编写好的测试对于构建高质量的软件是必不可少的,但这也需要花费很多时间。 我将向您展示如何更快地测试代码 ,以便您可以将时间花在更重要的事情上!

测试,Xcode方式

在Xcode中,可以通过子类XCTestCase编写单元测试UI测试

假设您的被测系统(SUT)是一种日期格式化程序,需要使用各种可能的语言/输入日期才能正常工作。 测试类可能如下所示:

并将其自动转换为Xcode测试类吗?

好吧, 我已经编写了一个名为AcceptanceMark的工具来 完成该任务

只需在终端上运行此命令:

  amtool -i DateFormattingSimple.md 

该工具将生成如下所示的Swift测试文件:

一些观察:

  • 小时分钟第二列被注释为Int 。 AcceptanceMark还不支持将日期作为内置类型使用,但是可以在此处使用单独的组件,以便日期输入与格式无关。
  • 语言列是语言环境标识符字符串。
  • dateStyle列是一个字符串。
  • dateStylelocalizedDate之间有一个空列。 这称为分隔符列 。 AcceptanceMark将其前面的所有列均视为输入,并将其之后的所有列均视为输出。 AcceptanceMark始终需要分隔符列 。 另请注意,表的第二行的空白列有三个破折号(–)。 这是因为有效的Markdown表对于每一列始终至少具有三个破折号。
  • localizedDate列表示表的唯一输出,在测试中将其视为期望值。
  • 所有列名均使用驼峰式大小写约定,与变量的Swift命名约定一致。

步骤2 :从Markdown文件生成Swift测试类。

先决条件 :要执行此操作, 需要在您的计算机上安装 amtool 请按照 AcceptanceMark GitHub页面上 的说明进行操作, 以编译和安装 amtool

打开终端, cd到测试文件夹并运行以下命令:

  amtool -i DateFormatting.md -l swift3 

如果一切顺利,控制台输出将确认已导出Swift文件:

 导出的swift3代码:/Users/andrea/AcceptanceMark/AcceptanceMarkDemoTests/DateFormatting_DateFormattingTests.swift 

打开文件夹,然后查看感兴趣的文件在其中:

步骤3 :将此文件拖放到Xcode并将其添加到您的测试目标中:

步骤4 :尝试编译并运行单元测试。 出现Swift编译器错误:

 使用未解决的标识符:“ DateFormatting_DateFormattingRunner” 

这是因为测试类现在在项目中,但是缺少测试运行程序。 如我之前所说,这是将表输入传递到SUT(日期格式化程序),并检索输出(格式化字符串)以与期望值进行比较所必需的。

第5步 :创建测试跑步者课程。

请注意,AcceptanceMark会为测试运行程序提供一个模板,作为测试类中生成的代码的一部分:

  • 将名为DateFormatting DateFormattingRunner.swift的新Swift文件添加到测试目标。
  • 从测试类中的模板粘贴并取消注释代码。

第6步 :实施测试运行程序。

日期格式器的输入是DateComponents值, 语言环境DateFormatter.Style

  • 创建一个DateComponents实例,并使用输入结构中的值对其进行配置:
  • 通过使用输入语言字符串作为标识符来直接计算语言环境:
  • 计算DateFormatter.Style 。 这可以通过使用自定义初始化程序创建扩展来完成,该扩展程序接受样式字符串并将其映射到所需的值:

这样,可以直接从输入结构中的dateStyle值计算日期样式:

  • 最后,使用所需参数创建一个日期格式化程序,并使用它来计算格式化日期并返回:

日期格式化程序测试运行器类的整个实现如下所示:

步骤7 :编译并再次运行测试。 这次,所有测试都通过了。

摘要

使用AcceptanceMark进行测试的系统很简单:

  • 编写一个Markdown表,其中包含所有输入和预期输出。
  • 使用amtool生成相应的Swift测试类。
  • 编写测试运行程序(如果需要,映射输入/输出+创建SUT并运行它)。

与传统的单元测试相比,这可以节省大量时间,尤其是在要测试的输入/输出数量很高的情况下。 额外的好处:

  • 编写测试变得部分自动化数据驱动
  • 测试是在整个代码库中以更加统一的方式编写的,并且设计无状态
  • 所有业务规则位于 代码的 一处 ,而不是分散在测试之间。

对于测试运行程序,当SUT的输入或输出不是基本值类型(例如StringFloatIntBool)时 ,需要一些映射才能将它们转换为SUT可以理解的对象。

这可以像从输入字符串标识符创建Locale对象一样简单,也可以稍微复杂一点,它需要通过为扩展程序提供自定义初始化程序来将一组字符串映射到枚举,类或结构。

结论

恭喜您成功! 这篇文章提出了一种工具,可以部分自动化为类编写测试的过程。

访问AcceptanceMark GitHub页面,找到本教程的所有源代码以及有关如何编译和使用amtool的更多信息。

我希望您可以像我已经在做的那样,使用AcceptanceMark来节省项目时间! 这是我最近创建的,希望社区的反馈将有助于它发展成为每个开发人员测试工具包中的出色工具。

如果您对本教程或我如何改进AcceptanceMark有任何反馈,请在评论中让我知道!

有关更多此类故事,请 订阅我的邮件列表

如果您喜欢,请单击下面的so,以便其他人在中此看到此内容。 对我来说意义重大!