使用 GemFire 进行单元测试 - 最佳实践
Unit Testing with GemFire - best practices
对于使用 GemFire 的单元测试服务,我们计划在测试上下文中包含 GemFire 'Regions' 以避免模拟并对 Gemfire 服务器产生任何依赖。可用于实现此目的的最佳实践/工具是什么?
理论上,以下是我们计划的选项:
服务 --> GemFire(嵌入在测试上下文中)
为了 bootstrap 上下文,
ContextConfiguration:添加一个引用 gfe-cache 的 test-applicationContext xml.
Junits 将加载测试上下文和 bootstrap 区域,现在我们可以使用 GemFire 触发 create/fetch/delete 并验证结果。
您所描述的是集成测试和某些东西 Spring Data GemFire 几乎完全按照您的描述进行操作,尽管更直接一些(即注入 GemFire 区域或可能其他 GemFire 组件直接进入测试 类)。例如看看 GemFireTemplateIntegrationTest class along with it's associated Spring (XML) config.
这对于 Spring Data GemFire 在测试中直接使用 GemFire 组件是有意义的。虽然,这在实际应用程序测试套件中可能不太理想,主要是因为我相信良好的关注点分离并围绕我的应用程序使用的依赖项提供适当的外观。
换句话说,正如您在上面提到的,在应用程序中具有以下(传统的 n)层...
UI -> 服务 -> DAO
服务层是纯业务逻辑和规则,与任何数据存储(包括GemFire/Geode)的任何交互(CRUD、查询、函数执行等)都是通过 DAO 完成的。
这使得模拟 DAO 变得非常容易,这样您就可以专注于服务测试的重点,以独立于底层数据存储的行为方式测试业务逻辑和规则。
当然,重要的是进行集成测试以确保与底层数据存储的正确交互,例如 GemFire/Geode,如果只是为了确保正确的事务行为,或者你的 OQL(查询)语句格式正确。
但是,在实现 DAO 时有很多选择。
您可以将区域注入您的 DAO 并直接在区域上执行操作(CRUD、查询等)。
如果您正在使用 Spring Data GemFire,您可能更愿意保护您的 DAO 不直接使用 GemFire/Geode API 使用 GemfireTemplate (in case of interface breaking changes introduced by GemFire/Geode, or to wrap GemFire/Geode Exceptions in Spring's convenient and consistent (across data stores) Exception class hierarchy, which is useful if you ever swap out data stores). See here 获取更多详细信息。
最后(但并非最不重要),您可以使用 Spring Data GemFire 的 extension of Spring Data Common's Repository abstraction with support for GemFire/Geode. This makes implementing DAOs (a.k.a. Repositories) as simples as defining an interface that extends GemfireRepository.
您的选择取决于您喜欢的抽象级别,每个选择都会稍微改变您处理集成测试的方式。
作为最后的花絮,这并不妨碍您仍然编写真正的单元测试。
Spring Data GemFire 使用 custom test framework (with mocks and stubs) to simplify Unit Tests involving GemFire components (such as Regions, AEQs, Gateways, etc). This "custom test framework" is rooted in the GemfireTestApplicationContextInitializer and the associated GemfireTestBeanPostProcessor。如果您遵循逻辑,您将开始了解它是如何工作的。
此自定义测试框架对于测试在 Spring Data GemFire 1.9 中使用 SDG's XML namespace. However, it is becoming increasingly popular to put configuration meta-data, even for GemFire/Geode components into Spring config now, something I am looking to enhance/simplify 创建和初始化的 GemFire 组件的有效性非常有用。
此外,我希望,在某个时候,我已经开始的工作,将 Spring Data GemFire 的 自定义测试框架提升并重构为一个单独的, Spring Data GemFire 的顶级 Spring 项目扩展,因为这类问题已经被问了很多。
无论如何,希望这能给您一些想法,如何以简单、简洁和一致的方式最好地为您的应用程序进行测试。
干杯!
对于使用 GemFire 的单元测试服务,我们计划在测试上下文中包含 GemFire 'Regions' 以避免模拟并对 Gemfire 服务器产生任何依赖。可用于实现此目的的最佳实践/工具是什么?
理论上,以下是我们计划的选项:
服务 --> GemFire(嵌入在测试上下文中)
为了 bootstrap 上下文, ContextConfiguration:添加一个引用 gfe-cache 的 test-applicationContext xml.
Junits 将加载测试上下文和 bootstrap 区域,现在我们可以使用 GemFire 触发 create/fetch/delete 并验证结果。
您所描述的是集成测试和某些东西 Spring Data GemFire 几乎完全按照您的描述进行操作,尽管更直接一些(即注入 GemFire 区域或可能其他 GemFire 组件直接进入测试 类)。例如看看 GemFireTemplateIntegrationTest class along with it's associated Spring (XML) config.
这对于 Spring Data GemFire 在测试中直接使用 GemFire 组件是有意义的。虽然,这在实际应用程序测试套件中可能不太理想,主要是因为我相信良好的关注点分离并围绕我的应用程序使用的依赖项提供适当的外观。
换句话说,正如您在上面提到的,在应用程序中具有以下(传统的 n)层...
UI -> 服务 -> DAO
服务层是纯业务逻辑和规则,与任何数据存储(包括GemFire/Geode)的任何交互(CRUD、查询、函数执行等)都是通过 DAO 完成的。
这使得模拟 DAO 变得非常容易,这样您就可以专注于服务测试的重点,以独立于底层数据存储的行为方式测试业务逻辑和规则。
当然,重要的是进行集成测试以确保与底层数据存储的正确交互,例如 GemFire/Geode,如果只是为了确保正确的事务行为,或者你的 OQL(查询)语句格式正确。
但是,在实现 DAO 时有很多选择。
您可以将区域注入您的 DAO 并直接在区域上执行操作(CRUD、查询等)。
如果您正在使用 Spring Data GemFire,您可能更愿意保护您的 DAO 不直接使用 GemFire/Geode API 使用 GemfireTemplate (in case of interface breaking changes introduced by GemFire/Geode, or to wrap GemFire/Geode Exceptions in Spring's convenient and consistent (across data stores) Exception class hierarchy, which is useful if you ever swap out data stores). See here 获取更多详细信息。
最后(但并非最不重要),您可以使用 Spring Data GemFire 的 extension of Spring Data Common's Repository abstraction with support for GemFire/Geode. This makes implementing DAOs (a.k.a. Repositories) as simples as defining an interface that extends GemfireRepository.
您的选择取决于您喜欢的抽象级别,每个选择都会稍微改变您处理集成测试的方式。
作为最后的花絮,这并不妨碍您仍然编写真正的单元测试。
Spring Data GemFire 使用 custom test framework (with mocks and stubs) to simplify Unit Tests involving GemFire components (such as Regions, AEQs, Gateways, etc). This "custom test framework" is rooted in the GemfireTestApplicationContextInitializer and the associated GemfireTestBeanPostProcessor。如果您遵循逻辑,您将开始了解它是如何工作的。
此自定义测试框架对于测试在 Spring Data GemFire 1.9 中使用 SDG's XML namespace. However, it is becoming increasingly popular to put configuration meta-data, even for GemFire/Geode components into Spring config now, something I am looking to enhance/simplify 创建和初始化的 GemFire 组件的有效性非常有用。
此外,我希望,在某个时候,我已经开始的工作,将 Spring Data GemFire 的 自定义测试框架提升并重构为一个单独的, Spring Data GemFire 的顶级 Spring 项目扩展,因为这类问题已经被问了很多。
无论如何,希望这能给您一些想法,如何以简单、简洁和一致的方式最好地为您的应用程序进行测试。
干杯!