【发布时间】:2021-10-27 15:16:19
【问题描述】:
我在 Azure 数据库实例中有一个 TSQL 过程。该过程具有确定 ETL 过程状态的逻辑,并且对当前时间敏感以确定事件是否在界限内。此过程具有复杂的行为,是核心要求。
我必须验证程序的行为。我正在用 Python 编写单元测试,我使用 unittest 来管理测试和 pyodbc 来调用数据库。无论调用过程的时间如何,这些单元测试都必须验证过程的行为。 我需要数据库表现得好像是某个时间,例如“05:30:00”。
我熟悉模拟对象以随时运行测试并删除外部依赖项的概念。我认为这不适用于 Microsoft 数据库,更像是 REST API。另一个考虑因素是我不想定位我想要测试的对象的副本,因为副本可能与原始对象不同。
唯一想到的解决方案(糟糕的解决方案)是:
- 在过程中实现一个变量来保存
DATETIME,并使用具有DEFAULT规范而不是GETDATE()的参数覆盖它。 - 使用一些条件逻辑,仅当会话由运行测试的应用程序帐户进行身份验证时才会执行,使用时间的默认值。
1 的结果是;
- 对过程的所有调用都需要更新
- 现在将包含一个不应该存在的参数
- 使用错误参数调用过程的风险将会增加,并且可能会默默地造成破坏
2 的结果是;
- 测试取决于用户帐户不发生变化,如果我们将安全实施的责任分开并且该人不可用,我们将暂时陷入困境
- 过程较慢
- 可读性降低
这两个选项都很糟糕。有没有人能解决这种问题?
【问题讨论】:
标签: unit-testing stored-procedures azure-sql-database python-unittest