unit-testing - 数据库单元测试 - 如何模拟过程中的时间
问题描述
我在 Azure 数据库实例中有一个 TSQL 过程。该过程具有确定 ETL 过程状态的逻辑,并且对当前时间敏感以确定事件是否在界限内。此过程具有复杂的行为并且是核心要求。
我必须验证程序的行为。我正在用 Python 编写单元测试,我用unittest
它来管理测试和pyodbc
调用数据库。无论调用过程的时间如何,这些单元测试都必须验证过程的行为。我需要数据库表现得好像是某个时间,例如“05:30:00”。
我熟悉模拟对象以随时运行测试并删除外部依赖项的概念。我认为这不适用于 Microsoft 数据库,更像是 REST API。另一个考虑因素是我不想针对我想要测试的对象的副本,因为副本可能与原始对象不同。
唯一想到的解决方案(坏解决方案)是:
- 在过程中实现一个变量以
DATETIME
使用带有DEFAULT
规范的参数而不是GETDATE()
. - 使用一些条件逻辑,仅当会话由运行测试的应用程序帐户进行身份验证时才执行,使用时间的默认值。
1的结果是;
- 对过程的所有调用都需要更新
- 现在将包含一个不应该存在的参数
- 使用错误参数调用过程的风险会增加,并且可能会默默地造成破坏
2的结果是;
- 测试取决于用户帐户不变,如果我们将安全实施的责任分开并且该人不可用,我们将暂时卡住
- 较慢的程序
- 降低可读性
这两个选项都很糟糕。有没有人能够解决这种问题?
解决方案
程序不会从程序内访问时间GETDATE()
。将DATETIME
提供给由外部作用域提供的过程参数。
这将需要一些重构,但意味着该过程随后是可单元测试的。希望我能更快地想到它:/
推荐阅读
- numpy - Matplotlib - 10 x 10 矩阵仅填充最后一个实例
- asp.net-mvc - 过滤以防止控制器构造函数或 Initialize 执行
- android - Android底部导航栏可见性
- python-3.x - 从屏幕抓取图像到 numpy 数组并将其显示为黑白图像
- airflow - 气流:DAGS 数量的实际限制
- r - 来自 chisq.test 的 p 值矩阵
- git - 无法将 git 更改推送到远程
- arrays - 需要帮助过滤数组?
- javascript - 在 CSS 中显示悬停状态时遇到问题
- .net - 从 CefSharp 中的 iframe 返回 .net 调用被阻止