Logo
Section 1 / 8

属性编写入门

从属性开始,更好地理解它们的工作原理,从而更轻松地编写属性。

导入

属性编写入门

从属性开始,更好地理解它们的工作原理,从而更轻松地编写属性。

简介

基于属性的测试要求我们以不同于传统方式的方式来思考测试。正如我们之前所见,属性的核心在于提出关于程序的规则,这些规则应当始终为真。这正是最具挑战性的部分。但仅仅拥有这些规则是不够的。我们还需要找到一种方法,将这些规则转化为可执行代码,以便特定的框架(在我们的例子中是 PropEr)能够运行它们。我们还必须告诉框架应该生成什么样的输入数据来真正考验这些规则,这被称为__生成器__。一旦我们将编码后的规则、生成器以及框架结合在一起,就构成了一个完整的属性。

属性的类型

属性有多种类型,但主要可分为两类:

  1. 无状态属性
  2. 有状态属性

在传统的基于示例的测试中,通常建议从简单的单元测试开始。而在基于属性的测试中,无状态属性相当于这种简单单元测试的对应物。无状态属性非常适合验证独立的、无状态的组件,且不涉及重大副作用。尽管它们也可用于更复杂的有状态集成测试和系统测试,但在这些场景下,有状态属性更为合适。

我们在前一章中看到并讨论的所有属性都是无状态的,尽管略显抽象。在本章中,我们将使内容具体化,了解无状态属性的实际结构,以便能够阅读和理解它们。我们还将介绍 PropEr 提供的内置数据生成器,并学习如何组合使用这些生成器。最后,我们将运行一些实际的属性测试。这将帮助我们掌握如何解读失败测试用例的结果,并学会如何修复问题。

...
属性的类型

属性的结构

所有属性都具有基本相同的结构。更复杂的有状态属性可能会增加额外的内容和特殊调用,但核心结构保持不变。所有属性都需写入包含 Erlang(或 Elixir)测试模块的文件中,并遵循特定的格式。

我们将关注这些模块中的结构,以告知 PropEr 需要测试的规则,以及如何生成用于测试的数据。理解属性结构需要掌握三个方面:

  1. 文件结构
  2. 属性结构
  3. 执行模型

属性测试基础

文件结构