代码之家  ›  专栏  ›  技术社区  ›  Luca Matteis

测试驱动开发不适合我的班级

  •  7
  • Luca Matteis  · 技术社区  · 14 年前

    我有一个我想用TDD构建的类,但是我失败了。这是一个相当基本的类,叫做 SubMissions ,它所做的就是从SQL数据库中获取一些数据。

    所以它有一些方法 getSubMissionForPage() , getSubMissionFromId() 等。。

    我试着用TDD来建造它。我的第一个测试包含一个调用 getSubMissionPage() ,其唯一目的是返回数据。所以让这个测试失败是非常困难的,因为它可以返回任何数据,我无法想出一个方法让它失败。

    我知道让你的测试失败是知道要实现什么的第一步,但是当实际上没有办法让测试失败时,你会怎么做?

    8 回复  |  直到 14 年前
        1
  •  8
  •   Visionary Software Solutions    14 年前

    任何时候依赖外部数据源时,测试都可能失败。如果与数据库的连接断开怎么办?如果表不存在,您试图从中获取数据呢?如果你得到的数据不是你期望的数据呢?

    测试连接到DBs的类比测试HelloWorld.java要复杂一些,因为您需要一些方法来 mock the DB . 你可以了解更多 Mock Objects here .

    简而言之,你的测试/软件总是会失败。如果你不认为你的考试会失败,你就没有认真思考问题的空间。

        2
  •  5
  •   Don Roby    14 年前

    从数据库检索不是从TDD开始的。

    你最好在网上看看TDD的一些例子。鲍勃·马丁的 bowling game scoring 是一个有趣的开始。

    有人说。。。

    我的第一个测试包含对getSubMissionPage()的调用,该调用的唯一目的是返回数据。所以让这个测试失败是非常困难的,因为它可以返回任何数据,我无法想出一个方法让它失败。

    目的不是返回数据,而是返回正确的数据。

    对此进行测试的方法是为它提供一个数据库,该数据库应使它返回一个特定的结果并确保它返回。当然,除非您编写了正确的代码,否则这是不可能的,所以您首先编写测试,然后在看到测试失败后再编写真正的实现。

    TDD涉及数据库的困难之处在于,使用真实数据库进行测试可能会很慢,并且使测试可重复可能会很困难,因为您的测试有时会更改数据。为了解决这些问题,您可以从以下工具获得帮助 DbUnit ,模拟JDBC,使用内存中的数据库,并使用回滚来确保测试不会进行永久性更改。

    但你最好不要从数据库开始。

        3
  •  3
  •   Bob Palmer    14 年前

    TDD的优点在于,如果你发现一个很难写的测试,它就指向了设计中的一个潜在问题。在这种情况下,抽象数据访问逻辑。

    例如,您可以使用依赖项注入将接口发送到数据访问存储库(在测试用例中使用假或模拟),该存储库将允许您将数据访问测试与逻辑测试隔离开来。也就是说,构建一个处理数据访问的SubmissionRepository,而您的submissions类处理业务逻辑,进入您的存储库进行基本的crud和整形操作。

    当然,在某些时候,您需要测试一些数据访问,作为集成测试的一部分,但我总是使用从TDD开始的练习来帮助驱动更多的分离设计。

        4
  •  3
  •   Bill Michell    14 年前

    如果希望测试失败,请让该方法引发RuntimeException。Eclipse将用一个合适的UnsupportedOperationException为您填充方法存根。

    然后要使测试变为绿色,只需让方法返回null而不是抛出。

    在一两个额外的测试迫使您连接到数据库之前,根本不必费心连接到数据库。

        5
  •  2
  •   TofuBeer    14 年前

    好。有一些标准类型的东西需要测试:空字符串和空字符串。如果数据真的可以是任何东西,那么任何东西都是有效的。

    从测试数据库开始可能不是深入TDD的最佳方法。从没有依赖关系的类开始。想象一场国际象棋比赛,你可能会有如下课程:

    • 董事会
    • 正方形
    • 位置(板上正方形的行、列)

    我会先从位置开始,因为它没有依赖关系,然后是正方形,因为它只依赖于位置,然后是木板,因为它只依赖于正方形。

        6
  •  1
  •   Lou Franco    14 年前

    getSubMissionPage不应该只返回任何数据——它应该发出一个特定的请求,然后根据请求返回一些数据。

    您需要将提交配置为使用模拟数据源,然后测试该类是否发出了相应的请求并将数据正确映射到对象中。

        7
  •  0
  •   tim_wonil    14 年前

    您不必为每个方法编写测试。如果你认为一个测试太简单而不能中断,你可以决定不为它编写一个测试。有些人会说你还是应该写一个测试,但我认为有些情况下你不需要写。

    看看这个JUnit常见问题: http://junit.sourceforge.net/doc/faq/faq.htm#best_3

        8
  •  0
  •   AlexR    14 年前
    1. 修改类以引发任何运行时异常并查看测试是否失败。
    2. mofify您的测试期望出现异常并看到测试失败

    (1)和(2)只是一些练习,可以帮助你确定测试是否有效。

    现在扪心自问:考试失败的原因可能是什么?我认为,在你的情况下,理由清单如下: 一。未连接到数据库 2。错误的数据库架构 三。不一致的数据

    以下是模拟这些原因的方法: 一。关闭数据库或更改用于连接的凭据/jdbc URL。 2。删除感兴趣的表或更改其列的名称。 三。使数据不一致有点困难。当数据库约束没有正确定义时,通常会发生这种情况。有时人们这样做是为了使模式更通用。如果不是你的情况,就忘掉3。

    祝TDD好运! 我相信将来你的测试场景会变得更加复杂。