【问题标题】:TDD approach when using a data access layer and an application layer使用数据访问层和应用层时的 TDD 方法
【发布时间】:2015-08-18 06:56:44
【问题描述】:

我是 TDD 新手。我想要一些关于如何对由实现实际数据库访问语句的数据层和其工作仅限于调用数据层方法的应用程序层形成的应用程序进行单元测试的提示。例如:

在我的名为 CassandraDataLayer 的数据层类中,我有一个 retrieveMessage 方法:

class CassandraDataLayer:

    def retrieveMessage(self,message_id):
        #database access statements to retrieve the message
        #returns a Message class instance

另一方面,在我的应用层类 ApplicationLayer 中,我有以下 retrieveMessage 方法:

class ApplicationLayer:

    def retrieveMessage(self,message_id):
        return self.dataLayer.retrieveMessage(message_id)

我必须对这两种方法都进行单元测试吗?

为了测试我的 CassandraDataLayer retrieveMessage 方法,我进行了以下操作:

  1. 我实例化了一个测试数据库。
  2. 我手动将消息插入其中
  3. 然后,我调用retrieveMessage 来尝试检索消息
  4. 最后,断言插入的消息和检索的消息相等。

那么,我该如何测试应用层类的retrieveMessage方法呢?我必须再次使用相同的逻辑吗?这不是多余的吗?

【问题讨论】:

  • 您的测试看起来多余的原因似乎是您的代码是多余的。这可能是由于示例的局限性,但您的应用程序层代码所做的只是返回数据层代码返回给它的内容。因此,您要测试的只是您的编译器/解释器是否正确处理返回语句。也许你需要一个更复杂的例子?编辑:对不起,我错过了 Python 标签。口译员是正确的词。
  • 实际上,这是我的应用程序的第一次迭代。现在,我希望它在控制台上返回结果。所以,在我的数据层和我的应用层之间存在这种冗余并不罕见,还没有任何打印或链接逻辑。所以这是我在我的应用程序中实际拥有的,我只是对这种情况感到困惑。当应用层如此冗余时,我是否必须放弃单元测试?
  • 这是完全可以接受的。我的观点是,由于您的应用程序非常新,并且数据层和应用程序层之间的差异很小,因此很明显测试是多余的。当您添加区分两者的代码时,这两个测试肯定会减少冗余。
  • 好的,谢谢你的回答。
  • 也许你应该把你的答案写成问题的“anwser”而不是评论,这样我就可以解决我的问题

标签: python database unit-testing testing tdd


【解决方案1】:

根据要求,为清楚起见,我将我的两个 cmets 移至此答案。

您的测试看起来多余的原因是目前您的代码相当多余。因为应用程序层的行为只是返回通过数据层返回给它的内容,所以您的第二个测试现在唯一要确认的是解释器是否正确处理返回调用(理想情况下,这是您的代码的不变量: )。

当您继续向应用层添加功能时,TDD 要求您也修改此测试或添加其他测试以测试该功能,因此您的数据层和应用层测试看起来会随着两个 UUT 的使用而减少冗余相同的。

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2014-10-01
    • 2011-07-15
    • 1970-01-01
    • 2015-11-14
    • 2020-11-28
    相关资源
    最近更新 更多