数据库单元测试 - 如何模拟过程中的时间
Database unit testing - How to mock the time within a procedure
我在 Azure 数据库实例中有一个 TSQL 过程。该过程具有确定 ETL 过程状态的逻辑,并且 对当前时间敏感 以确定事件是否在范围内。此过程具有复杂的行为, 是核心要求。
我必须验证过程的行为。我正在 Python 中编写单元测试,我正在使用 unittest
来管理测试,并使用 pyodbc
来调用数据库。这些单元测试必须验证过程的行为,而不管调用过程的时间如何。 我需要数据库表现得像某个时间,例如“05:30:00”。
我熟悉模拟对象的概念以随时 运行 测试并删除外部依赖项。我认为这不适用于 Microsoft 数据库,例如更像是 REST API。另一个考虑因素是 我不想将我想要测试的对象 的副本作为目标,因为副本可能与原始副本不同。
想到的唯一解决方案(不好的解决方案)是:
- 在过程中实现一个变量来保存
DATETIME
并使用具有 DEFAULT
规范而不是 GETDATE()
的参数覆盖它。
- 使用一些条件逻辑,仅当会话由 运行 进行测试的应用程序帐户验证时才执行,使用时间的默认值。
结果 1 将是;
- 所有对该过程的调用都需要更新
- 不应该存在的参数现在包含了
- 使用错误参数调用过程的风险会增加,并可能造成严重破坏悄悄
2 的结果是;
- 测试依赖于用户帐户不变,如果我们分离安全实施责任并且该人不在,我们将暂时陷入困境
- 过程较慢
- 可读性降低
这两个选项都很糟糕。有人解决过这种问题吗?
过程 将不会 从过程中使用 GETDATE()
访问时间。 DATETIME
将提供给外部范围 提供的 过程参数。
这将需要进行一些重构,但意味着该过程随后可以进行单元测试。希望我能更快地想到它:/
我在 Azure 数据库实例中有一个 TSQL 过程。该过程具有确定 ETL 过程状态的逻辑,并且 对当前时间敏感 以确定事件是否在范围内。此过程具有复杂的行为, 是核心要求。
我必须验证过程的行为。我正在 Python 中编写单元测试,我正在使用 unittest
来管理测试,并使用 pyodbc
来调用数据库。这些单元测试必须验证过程的行为,而不管调用过程的时间如何。 我需要数据库表现得像某个时间,例如“05:30:00”。
我熟悉模拟对象的概念以随时 运行 测试并删除外部依赖项。我认为这不适用于 Microsoft 数据库,例如更像是 REST API。另一个考虑因素是 我不想将我想要测试的对象 的副本作为目标,因为副本可能与原始副本不同。
想到的唯一解决方案(不好的解决方案)是:
- 在过程中实现一个变量来保存
DATETIME
并使用具有DEFAULT
规范而不是GETDATE()
的参数覆盖它。 - 使用一些条件逻辑,仅当会话由 运行 进行测试的应用程序帐户验证时才执行,使用时间的默认值。
结果 1 将是;
- 所有对该过程的调用都需要更新
- 不应该存在的参数现在包含了
- 使用错误参数调用过程的风险会增加,并可能造成严重破坏悄悄
2 的结果是;
- 测试依赖于用户帐户不变,如果我们分离安全实施责任并且该人不在,我们将暂时陷入困境
- 过程较慢
- 可读性降低
这两个选项都很糟糕。有人解决过这种问题吗?
过程 将不会 从过程中使用 GETDATE()
访问时间。 DATETIME
将提供给外部范围 提供的 过程参数。
这将需要进行一些重构,但意味着该过程随后可以进行单元测试。希望我能更快地想到它:/