【问题标题】:Database unit testing - How to mock the time within a procedure数据库单元测试 - 如何模拟过程中的时间
【发布时间】: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


    【解决方案1】:

    程序不会在程序内使用GETDATE() 访问时间。 DATETIME 将提供给由外部作用域提供的过程参数

    这将需要一些重构,但意味着该过程随后是可单元测试的。希望我能更快地想到它:/

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多