Swift中基于属性的测试-使用SwiftCheck

在上一篇文章中,我们描述了一种称为基于属性的测试的测试方法。 我们不用编写示例来测试我们的代码,而是编写输出必须具有的属性。 我们可以继续编写约束该输出的属性,直到我们对我们的软件需要做什么进行准确的说明。

Swift中基于属性的测试—简介
这是Swift进行的基于属性的测试(PBT)系列的第一部分。 在这第一篇文章中,我们将… medium.com

尽管无需任何库就可以执行这种类型的测试,但是有些工具可以帮助我们简化这些任务。 在Swift中,我们可以使用SwiftCheck (一种秉承Haskell的QuickCheck精神的开源库)。

在您的项目中包括SwiftCheck就像使用CocoaPods一样容易。 只需添加pod 'SwiftCheck', '~> ' ,将替换为该库的最新版本。 安装好吊舱,就可以开始了!

使用SwiftCheck编写基于属性的测试

在上一篇文章中,我们使用了String串联示例。 我们可以使用SwiftCheck重写三个基于属性的测试:

让我们分解一下这些测试的结构:

  1. 我们必须通过扩展XCTestCase并添加带有test前缀的方法来创建常规的单元test
  2. 在每个单元测试中,我们创建一个带有Stringproperty ,该property描述我们要测试的内容。
  3. 使用运算符<- ,我们调用forAll ,它收到一个闭包。 此闭包接受许多参数,这些参数的类型实现Arbitrary协议。 现在不用担心,该库为我们扩展了基本的Swift类型。 这个闭包的参数将是用于基于属性的测试的随机字符串(在上randomString()文章中,我们是使用randomString()创建的)。
  4. 在闭包的主体中,我们执行要测试的方法或函数。
  5. 最后,我们不需要编写断言,而是返回Testable表达式。 在我们的例子中,我们从正在执行的比较中返回一个Bool

运行这些测试将多次执行我们的闭包。 默认情况下,每个属性都会运行100次,尽管可以增加或减少此数目。

如您所见,使用SwiftCheck编写基于属性的测试非常容易。 在这些系列的最后一篇文章中,我们将展示如何约束这些测试的输入(有时我们可能会对输入类型的某些子集感兴趣)以及如何为我们的自定义类型提供输入。