Logo
Section 1 / 8

属性编写入门

从属性开始,深入理解其工作原理,从而更轻松地编写属性。

导入

属性编写入门

从属性开始,深入理解其工作原理,从而更轻松地编写属性。

简介

属性测试要求我们以不同于传统方式的方式来思考测试。正如我们之前所见,属性的核心在于提出关于程序的规则,这些规则应当始终成立。然而,我们需要找到一种方法将这些规则转化为可执行代码,以便特定框架(PropEr)能够运行和验证它们。同时,我们还需要告诉框架应该生成什么样的输入数据,以真正考验这些规则的有效性。这被称为__生成器__。一旦我们将编码后的规则与生成器结合,就构成了一个属性。

属性的类型

主要有两种类型的属性:

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

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

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

...
属性的类型

属性的结构

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

我们将关注这些模块中的结构,以便让 PropEr 知道需要测试的规则,以及应使用何种数据生成方式来测试这些规则。理解属性结构需要掌握三个方面:

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

属性测试基础

文件结构