测试驱动开发 - 何时/测试什么?

时间:2013-04-19 08:40:19

标签: unit-testing testing tdd

我正在尝试开始使用TDD但是我立刻不确定我应该测试什么时候和什么。我正在开展的一个新项目中的前两个任务如下。

1)在REST端点上接收一些JSON格式的数据并将其保存在数据库中。说数据是几个车记录 -

  

{       “汽车”: [{               “make”:“福特”,               “颜色”:“蓝色”,               “年”:“2010”,               “for_sale”:是的           },{               “make”:“bmw”,               “颜色”:“黑色”,               “年”:“2011”,               “for_sale”:false           }       ]}

这样数据就会到达REST端点,我需要将它保存在数据库中。我是否需要对此任务进行测试?如果是,那么它应该是什么样的?

2)从数据库中检索一些记录并将其显示在视图/网页中(即使用一些模板系统)。假设记录是上面的汽车记录,它们应显示如下 -

<ul id="cars">
    <li id="car-1">
        <div><span>Make:</span><span>Ford</span>
        </div>
        <div><span>Color:</span><span>blue</span>
        </div>
        <div><span>Year:</span><span>2010</span>
        </div>
        <div><span>For sale:</span><span>Yes</span>
        </div>
    </li>
    <li id="car-2">
        <div><span>Make:</span><span>BMW</span>
        </div>
        <div><span>Color:</span><span>black</span>
        </div>
        <div><span>Year:</span><span>2011</span>
        </div>
        <div><span>For sale:</span><span>No</span>
        </div>
    </li>
</ul>

所以我需要对此任务进行测试,如果是,那么它应该是什么样的?

1 个答案:

答案 0 :(得分:3)

您使用的是哪种语言,平台等?也许我们可以为您找到一些例子。

一开始TDD很棘手,像这样的任务(使用数据库和Web部件)需要在多个级别进行测试。

首先将任务划分为可以进行单元测试的单一职责(可能映射到班级)。例如,一个接受JSON输入的类,并用一个属性对其进行水合,TDD就是这个类。数据库层很难进行单元测试,我们通常使用Repository模式,然后在测试其他类时进行模拟。

数据库单元测试很难,因此请考虑围绕数据库进行“接受”或“集成”测试。这可能是连接到真实测试数据库的测试,放入一些测试数据,再次将其拉出,并验证它看起来是否正确。理论上,你甚至不关心它是什么数据库,只要你存储的东西再次出现,你知道它正在工作。

HTML / web测试最好使用selenium webdriver等工具在高级别上完成,它允许您编写测试代码,激活真实浏览器,与您的页面交互,并断言内容/行为与预期一致。

通过与已经了解它的人进行结对编程,或者通过参加课程或培训课程,可以很好地学习这些东西。还有很多书籍博客和教程,让你可以在沙盒中学习,这比在一个真实的项目中自己学习更简单,在这个项目中,完成工作的压力与学习相冲突。


编辑:Java和Play框架。 好吧,我不知道具体的播放框架,但是从快速看看它可能会为你设置正确的JSON解析,这会将json解析函数减少到样板代码。 TDD在这里没有太大的价值,但如果你愿意,你可以。同样,有一个活动记录样式的数据库层?因此,在您的库提供的测试代码中没有太多价值(并且dbs很难/不可能/无意义*进行单元测试)。


编辑:编辑 - 这显然是icky,显然是Play uses static controller methods which makes it hard to unit test (because you can't inject dependencies - which makes mocking difficult)。我担心如果不进行数小时的研究,我就无法解决这些问题,但集成测试可能就是这里的方法,它可以测试几个代码单元,包括数据库。

总结如下:

  • 不要在样板上冒汗TDD。保持样板被隔离和东西(即控制器只做web东西,然后交给其他类。存储库只保存和检索对象,而不是规则/决策/操作。
  • 当您开始向应用程序的内容添加更多业务逻辑时 - 将其隔离在业务类中(即 - 远离Web或数据库样板),您可以轻松地进行单元测试。绝对是TDD这个东西。
  • 在您的应用中尝试集成测试以测试数据库。在您的应用程序后面有一个真正的测试数据库,使用该应用程序保存,检索它,然后断言它是正确的。
  • 使用像Selenium这样的东西来测试网页。

*根据您的测试信念删除。