TDD:如何测试数据持久化抽象
TDD: how to test data persistence abstraction
问题陈述
假设我想实现一个简单的键值存储,它提供基本的 CRUD 操作。唯一的要求是所有修改都应该在应用程序启动之间持续存在。我不关心特定的持久性机制,因为它可能会在开发过程中发生变化,甚至会因平台而异。
问题
我应该如何测试这样的库/class/模块(以最终成为哪个为准)?
我找到的所有答案都集中在测试特定的数据库解决方案上,但这是我想避免的。我只关心更改 正在 持续存在这一事实,而不是 如何 它们持续存在。
我考虑的解决方案:
- 提取实际的持久化实现,分别测试每个实现,只测试抽象层是否调用正确的方法
我看到这种方法的问题是非常简单的任务需要大量代码,事实上我最终仍然关心特定的持久性机制。这可能会使开发复杂化,尤其是对于像键值存储这样简单的东西。
- 进行一些实际多次启动应用程序的测试,并检查数据更改是否在两次启动之间保持不变
这将准确地测试我所需要的,但这样的测试可能会很昂贵,而且不一定容易编写。
- 仅测试方法是否适用于单个进程,根本不测试持久性
好吧,这个库的全部意义在于测试持久性。比如说,一些用户设置,或者游戏保存。测试它是否在内存中工作并不能测试真正的问题。
也许是我没想到的其他解决方案?
我在这里和其他网站上通读了大部分与持久性和 TDD 相关的主题,但我能找到的所有内容都集中在特定的持久性机制上。
有些相关,但未涉及测试主题:
How many levels of abstraction do I need in the data persistence layer?
持久层是应用程序的 port。因此,您的方法应该是为该端口编写一个适配器,并使用集成测试来测试该适配器。
测试本身不需要多次旋转适配器 - 测试事物是否真正持久就是测试持久性机制本身,这与您无关。在某些时候,您将不得不假设一切正常,并且他们有自己的测试来确保这是正确的。典型的 写入然后读回 测试适用于大多数情况。
一旦适配器存在,您就可以使用多种技术来编写其他测试 - 当它是其他单元的协作者时模拟适配器,或者使用适配器的内存实现(使用合同测试来查看内存中的实现与另一个相同。
问题陈述
假设我想实现一个简单的键值存储,它提供基本的 CRUD 操作。唯一的要求是所有修改都应该在应用程序启动之间持续存在。我不关心特定的持久性机制,因为它可能会在开发过程中发生变化,甚至会因平台而异。
问题
我应该如何测试这样的库/class/模块(以最终成为哪个为准)?
我找到的所有答案都集中在测试特定的数据库解决方案上,但这是我想避免的。我只关心更改 正在 持续存在这一事实,而不是 如何 它们持续存在。
我考虑的解决方案:
- 提取实际的持久化实现,分别测试每个实现,只测试抽象层是否调用正确的方法
我看到这种方法的问题是非常简单的任务需要大量代码,事实上我最终仍然关心特定的持久性机制。这可能会使开发复杂化,尤其是对于像键值存储这样简单的东西。
- 进行一些实际多次启动应用程序的测试,并检查数据更改是否在两次启动之间保持不变
这将准确地测试我所需要的,但这样的测试可能会很昂贵,而且不一定容易编写。
- 仅测试方法是否适用于单个进程,根本不测试持久性
好吧,这个库的全部意义在于测试持久性。比如说,一些用户设置,或者游戏保存。测试它是否在内存中工作并不能测试真正的问题。
也许是我没想到的其他解决方案?
我在这里和其他网站上通读了大部分与持久性和 TDD 相关的主题,但我能找到的所有内容都集中在特定的持久性机制上。
有些相关,但未涉及测试主题: How many levels of abstraction do I need in the data persistence layer?
持久层是应用程序的 port。因此,您的方法应该是为该端口编写一个适配器,并使用集成测试来测试该适配器。
测试本身不需要多次旋转适配器 - 测试事物是否真正持久就是测试持久性机制本身,这与您无关。在某些时候,您将不得不假设一切正常,并且他们有自己的测试来确保这是正确的。典型的 写入然后读回 测试适用于大多数情况。
一旦适配器存在,您就可以使用多种技术来编写其他测试 - 当它是其他单元的协作者时模拟适配器,或者使用适配器的内存实现(使用合同测试来查看内存中的实现与另一个相同。