【问题标题】:Stubbing objects with input arguments使用输入参数存根对象
【发布时间】:2010-10-12 10:00:22
【问题描述】:

所以,我正在尝试存根数据库连接器以便为其编写测试。问题是数据库连接器是一个非常薄的层,对它的查询有点开放。我希望我的代码能够从数据库中请求一个变量,并且连接器应该可以接受。此调用的签名如下所示:

dim = getDimension(self,dimensionName,otherIndentifyingInformation)

(这一切都在 MATLAB 中 - 希望答案与语言无关,或者至少在 MATLAB 中并非不可行。)

当我在我的代码中使用它时,dimensionName 是存储在数据库中的少数东西之一。如果代码调用它,但它不存在,那很好。这里的问题是我想测试一些对getDimension 进行两次调用的代码,例如:

alt = conn.getDimension('alt',otherID);
str = conn.getDimension('str',otherID);

出于(希望)显而易见的原因,altstr 不能保证相同。事实上,它们通常不是。

所以,我的问题。如果我想存根 getDimension 以返回良好的测试值,我该怎么做?创建getDimensionAlt 似乎很麻烦,因为可以从数据库中输出的东西的数量是无限的,维护起来会很痛苦。有没有比将逻辑放入我的存根对象更好的方法?这似乎是错误的处理方式......

编辑:建议设置一个 testDB。那么,我不必为每个测试用例设置一个 testDB 吗?在每个测试中,我必须创建一个数据库连接,将其作为存根返回,运行测试,然后清理数据库连接。这似乎对每个测试来说都是很多开销,尤其是当它甚至不是我正在测试的系统时。

我想可以设置一个 testDB,并每次都用适当的值填充它。这是好的做法吗?

编辑 2:也许我的问题不清楚。我有一小段代码正在尝试测试。它并不比上面那两行复杂很多,我想干净利落地测试一下。问题是对getDimension 调用的存根取决于参数。我不需要将此存根用于其他测试。

我认为答案可能是“在你的存根中有简单的逻辑是可以的”。这一切都被 MATLAB 中没有匿名类或存根框架这一事实所迷惑,所以这很难,但我想确保在我开始在 MATLAB 中编写存根框架之前,我正在做的事情在概念上是清晰的。

【问题讨论】:

    标签: unit-testing testing matlab tdd stub


    【解决方案1】:

    如果您要进行自动化集成测试或验收测试,我认为设置 testdb 是一个好主意。这通常需要您同时测试整个堆栈(UI、应用程序、数据库、服务等)的测试。

    单元测试完全不同,它们是在开发过程中使用而不是在测试过程中使用,因此它们应该更快地运行、更快地更改和更快地编写。让单元测试只依赖于他们正在测试的一小段代码通常是个好主意。这使得它们不那么脆弱,更容易理解,并使开发人员更愿意经常运行它们。

    在单元测试中使用存根是个好主意。您似乎遇到的问题是,如果您想为许多测试重用存根,它们的行为可能会变得非常复杂,在最坏的情况下,您正在重建它们应该代表的东西。如果您一次测试过多,也会发生这种情况。

    对此的解决方案是拥有更多更小的存根,这些存根只实现一个或几个测试的行为,并且让您的测试只测试一个行为。一次测试大量行为的测试也很有用,但它们不是单元测试,您应该将它们移至集成测试套件(并且可以在真实数据库上运行)。我不确定 matlab,但在许多语言中,您都有模拟框架,您可以使用它来处理创建存根和为您设置行为。

    【讨论】:

      【解决方案2】:

      您能否设置一个具有已知值的测试数据库,然后针对它执行一组已知的查询(具有已知的预期返回值)?

      【讨论】:

      • 我澄清了我的帖子 - 我对此有些疑虑。你能扩展一下这个想法吗?
      • 我想我不明白为什么要对具有真实(已知)值的真实(微小)数据库编写真实测试应该很容易时要存根它。用测试所需的一切填充数据库并对其进行测试。大概这将是一个小型数据库。
      【解决方案3】:

      我对类似问题的回答Creating mock data for unit testing

      您可以拥有 Builder 类 帮助您构建实例 需要 / 在这种情况下你会使用 与存储库有关。有 生成器使用适当的默认值,并且 在您的测试中,您可以覆盖什么 你需要。这可以帮助您避免需要 把每一个案例 “数据”混为一谈 测试(引入问题, 因为通常情况下 不兼容不同的 测试)。

      更新1:看看 www.markhneedham.com/blog/2009/01/21/c-builder-pattern-still-useful-for-test-data

      还要检查这个答案,关于与外部系统的整体单元测试关系:How can I improve my junit tests

      请注意,还有一种使用内存数据库(如 dbunit)的替代方法。由于后面的链接中提到的原因,我更喜欢构建器。

      【讨论】:

        猜你喜欢
        • 2020-08-22
        • 2019-04-08
        • 2020-11-24
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 2018-03-12
        相关资源
        最近更新 更多