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

Unit testing 测试驱动开发-何时/测试什么?,unit-testing,testing,tdd,Unit Testing,Testing,Tdd,我正在尝试开始使用TDD,但现在我不确定什么时候应该测试什么。我正在从事的一个新项目的前两项任务如下 1) 在REST端点上接收一些JSON格式的数据,并将其保存在数据库中。说数据是几辆车的记录- { “汽车”:[{ “制造”:“福特”, “颜色”:“蓝色”, “年份”:“2010年”, “待售”:真实 }, { “制造”:“宝马”, “颜色”:“黑色”, “年份”:“2011年”, “待售”:虚假 } ]} 因此,数据到达REST端点,我需要将其保存在数据库中。我需要为这个任务进行测试吗?如果

我正在尝试开始使用TDD,但现在我不确定什么时候应该测试什么。我正在从事的一个新项目的前两项任务如下

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

{ “汽车”:[{ “制造”:“福特”, “颜色”:“蓝色”, “年份”:“2010年”, “待售”:真实 }, { “制造”:“宝马”, “颜色”:“黑色”, “年份”:“2011年”, “待售”:虚假 } ]}

因此,数据到达REST端点,我需要将其保存在数据库中。我需要为这个任务进行测试吗?如果需要,应该是什么样的

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

  • 品牌:福特 颜色:蓝色 年份:2010年 出售:是的
  • 品牌:宝马 颜色:黑色 年份:2011年 出售:否

那么,我需要为这项任务进行测试吗?如果需要,它应该是什么样子的?

您使用的是什么语言、平台等?也许我们可以为你找到一些例子

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

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

DB单元测试很难,所以在数据库中考虑一个“接受”或“集成”测试。这可能是一个连接到真实测试数据库的测试,放入一些测试数据,再次取出,并验证它是否正确。理论上,你甚至不在乎它是什么数据库,只要你存储的东西再次出来,你就知道它在工作

HTML/web测试最好在高层使用工具进行测试,例如,它允许您编写测试代码,启动真正的浏览器,与页面交互,并断言内容/行为符合预期

通过与熟悉结对编程的人进行结对编程,或者通过参加课程或培训课程,可以很好地学习这些知识。还有很多书籍、博客和教程,让你在沙箱中学习,这比在真正的项目中尝试自己学习要简单,因为完成任务的压力与学习相冲突


编辑:Java和Play框架。 好的,我不知道具体的play框架,但是快速查看一下,如果设置正确,它可能会为您进行JSON解析,这将JSON解析函数简化为样板代码。TDD在这里没有太大的价值,但是如果你愿意,你可以。类似地,有一个活动记录样式的数据库层?因此,测试您的库提供的代码没有太多价值(而dbs对于单元测试来说是困难的/不可能的/无意义的)


编辑:编辑-这显然是令人讨厌的。我担心,如果不做几个小时的研究,我就无法帮助了解具体情况,但是集成测试可能是一种方法,它可以一起测试多个代码单元,包括数据库

总而言之:

  • 不要在样板上浪费时间。保持样板文件的独立性和独立性(即控制器只做web工作,然后移交给其他类)。存储库只保存和检索对象,而不是规则/决策/操作
  • 当你开始向你的应用程序添加更多的业务逻辑时,把它隔离在业务类中(即远离web或db样板),这样你就可以轻松地进行单元测试了。当然,TDD就是这样
  • 尝试跨应用程序进行集成测试以测试数据库。在应用程序后面有一个真正的测试数据库,使用应用程序保存某些内容,检索它,然后断言它是正确的
  • 使用Selenium之类的工具来测试网页

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

@AndrewM,如果应用程序是用java编写的,基本上您是说类的作者也应该编写一个
存根
。1)
存根
可以作为另一个作者的不同类中缺少的方法的补充。2) 当单元测试时,
stub
可以用来确定错误是在调用作者类的方法还是另一个类的被调用方方法中3)可以伪造数据并将其提供给你的类方法(例如:飞机雷达数据)。所以,基本上是粒度级别的单元测试。TDD方法中是否不需要集成测试(不包括DB)?优势?
<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>