何时选择基于示例的测试和基于 属性 的状态测试
When to choose Example based testing and property based for Stateful Testing
这些天我主要在 Android Studio 中对 Android SDK 进行单元测试,并使用 Jqwik 这是 JUnit 上基于 属性 的测试工具平台.
在与前辈一起探索不同的测试技术方法时,我了解了基于示例的测试和基于 属性 的测试。我想知道什么时候选哪个。
分享此内容的目的:如果我的想法正确,double-check 与社区分享。
符号:
EBT = Example-Based 测试;
PBT = Property-Based 测试;
我的理解:EBT 用于检查功能是否按预期工作,而 PBT 通过伪造给定的先决条件(输入) 针对不变量(域行为)
我的感受:我觉得 Jqwik 工具就像是 JUnit 的参数化测试,但效果更佳
示例库测试
优点:
与 PBT 相比,程序员可以很容易地看到哪些测试通过了指定的名称,只是显示了尝试的总次数,我们可以记录生成的测试用例,但 JUnit 的方法更直观吸引人且易于遍历和通读
可以轻松阅读和理解测试用例本身中提到的输入,与 PBT 相比,我们必须从 Jqwik 获取所有 Arbitraries 的地方查看 Provider 方法。
适用于测试没有任何依赖项组合的状态机。
Non-Tech 人如果知道域组件的工作原理,就很容易理解状态机的工作原理
缺点:
- 通常不会涵盖所有边缘情况,正如 Jqwik 的作者在关于 EBT 的演讲中也说过“它不能信守承诺”
- 当有大量组合要涵盖时,这不是最佳选择
- 在基于示例的测试中,我们真的靠直觉,因为每个程序员都用不同的测试用例覆盖测试,相比之下,PBT 有点详尽无遗。
基于属性的测试
优点:
- 适合随机和特定的输入数据生成。
- 当独特的测试用例有很多组合时非常好,因为它工作得很好。
- 这不仅仅是关于详尽的集合输入组合,而是 PBT 的一个子集
缺点:
对于 PBT,我观察到的主要缺点是测试用例的可读性:
- 难以阅读和遍历生成的测试用例,因为它只是日志
- 测试用例的当前输入是什么,我们必须查看
Provides
注释函数。
对我来说,这通常不是 either-or 问题,但示例和属性通常是相辅相成的。虽然示例是被测代码的预期行为的良好起点,但属性让我对功能的广度以及边缘和角落情况下的预期行为有足够的信任。
在某些情况下,示例最好用属性代替,例如,当许多示例可以转换为一个或几个属性时。即使这样我还是倾向于保留一些例子,因为它们更容易理解。
这些天我主要在 Android Studio 中对 Android SDK 进行单元测试,并使用 Jqwik 这是 JUnit 上基于 属性 的测试工具平台.
在与前辈一起探索不同的测试技术方法时,我了解了基于示例的测试和基于 属性 的测试。我想知道什么时候选哪个。
分享此内容的目的:如果我的想法正确,double-check 与社区分享。
符号: EBT = Example-Based 测试; PBT = Property-Based 测试;
我的理解:EBT 用于检查功能是否按预期工作,而 PBT 通过伪造给定的先决条件(输入) 针对不变量(域行为)
我的感受:我觉得 Jqwik 工具就像是 JUnit 的参数化测试,但效果更佳
示例库测试
优点:
与 PBT 相比,程序员可以很容易地看到哪些测试通过了指定的名称,只是显示了尝试的总次数,我们可以记录生成的测试用例,但 JUnit 的方法更直观吸引人且易于遍历和通读
可以轻松阅读和理解测试用例本身中提到的输入,与 PBT 相比,我们必须从 Jqwik 获取所有 Arbitraries 的地方查看 Provider 方法。
适用于测试没有任何依赖项组合的状态机。
Non-Tech 人如果知道域组件的工作原理,就很容易理解状态机的工作原理
缺点:
- 通常不会涵盖所有边缘情况,正如 Jqwik 的作者在关于 EBT 的演讲中也说过“它不能信守承诺”
- 当有大量组合要涵盖时,这不是最佳选择
- 在基于示例的测试中,我们真的靠直觉,因为每个程序员都用不同的测试用例覆盖测试,相比之下,PBT 有点详尽无遗。
基于属性的测试
优点:
- 适合随机和特定的输入数据生成。
- 当独特的测试用例有很多组合时非常好,因为它工作得很好。
- 这不仅仅是关于详尽的集合输入组合,而是 PBT 的一个子集
缺点:
对于 PBT,我观察到的主要缺点是测试用例的可读性:
- 难以阅读和遍历生成的测试用例,因为它只是日志
- 测试用例的当前输入是什么,我们必须查看
Provides
注释函数。
对我来说,这通常不是 either-or 问题,但示例和属性通常是相辅相成的。虽然示例是被测代码的预期行为的良好起点,但属性让我对功能的广度以及边缘和角落情况下的预期行为有足够的信任。
在某些情况下,示例最好用属性代替,例如,当许多示例可以转换为一个或几个属性时。即使这样我还是倾向于保留一些例子,因为它们更容易理解。