单元测试的一般想法

时间:2011-03-18 05:49:58

标签: unit-testing

这个问题可能有点含糊不清,但现在可以了。我刚刚开始进行单元测试,而且我似乎在挣扎于基本概念。

我正在测试一个检查数据库中是否存在记录的函数。如果没有,它会添加新记录并返回其ID。所以函数编写起来很简单。我可以考虑测试它的唯一方法是使用模拟框架来检查正确的属性/方法是否被调用了正确的次数。

我正在努力的部分是我读过的所有内容都是先讨论编写测试然后再编写函数。但我觉得它只有在我首先编写函数,然后编写反映函数内部工作原理的测试时才会起作用。

这真的有一个黄金法则吗?

无论如何我应该测试基本的交易逻辑多少?

6 个答案:

答案 0 :(得分:4)

也许如果你想在这个级别上发展,你可以先根据合同编写方法的合同而不是测试。 重要的是,您的方法的行为与合同中定义的一样,因为这是其他开发人员所期望的。 特别是边缘情况(例外等)应该进行测试。

如果你要在开发方法的同时改变你的合同,那么,这并不好。因为你没有计划好你的软件,所以你可以重写你的测试=)

测试非常重要,因为当您进行代码更改时,稍后您可以通过尝试开发新内容来更轻松地使用已保存的测试来检测错误。

答案 1 :(得分:3)

  

我正在努力的部分是,我曾经阅读过关于首先编写测试然后编写函数的讨论。但我觉得只有先编写函数然后编写反映函数内部工作原理的测试才能工作。

听起来你患有test-driven development(TDD)常见的鸡/蛋问题。在您拥有代码之前,您不知道要测试什么,并且除非在编码之前编写测试,否则您认为不能进行TDD。

这是 Designer's Block (tm)的一个例子。就像编写器的块一样,通过编码来解决它通常也是好的 - 即使你抛弃所有代码。

破解原型,然后假装它不存在。 (不要发货:)这个原型应该探索你不熟悉的概念,或者没有足够的信息来开始设计。它应该让你熟悉这个问题,以便你可以开始设计。

在您获得概念证明后,代码将对其进行检查。在您的评论中,确定您希望公共界面看起来像什么,哪种架构模式最适合该程序,以及哪些依赖项应彼此隔离(并在您的测试中模拟)。在项目跟踪软件中记录或提交项目规划软件/工作项中的要求。

如果您在审核中发现这些问题时遇到了麻烦,那么您应该尝试招募其他程序员(可能还有识别您业务需求的设计人员/人员)来帮助您完成这些工作。代码导师可能是个好主意。

从该评论中,您应该能够开始编写测试代码。或者你可以开始编写技术规范 - 这个建议同样适用于两者。

(如果您正在组建团队,收集需求并获得用户反馈/执行UATs也是必需的;但这可能是其他人的工作)

修改

请记住,这只是处理此问题的一种方法。另一种方法是简单地放松任何类似清教徒的理想TDD应该如何工作,并简单地与您的代码并行开发测试。同时检查它们。

在没有TDD的情况下进行单元测试也很完美。单元测试比编码您的设计和要求带来更多好处。当您添加新功能或修复错误(回归测试)或移植代码时,它们也是一个巨大的帮助。

答案 2 :(得分:2)

首先编写测试有充分的理由:

  1. 您确保您的测试确实失败了。如果您先编写实现,然后再进行测试,测试将通过,但您不知道它是否真的有效。测试中可能有错误!如果您先编写测试,则可以运行它并确保它失败。
  2. 如果您只编写通过测试所需的代码,您将获得非常高的代码覆盖率。
  3. 如果您先编写测试,包括所需的所有模拟和假动作,您可以更好地了解这些要求。在模拟某个API时,您可能会发现进行API调用或类似的API需要一些额外的信息。
  4. 动机。如果你已经编写了代码,那么很容易就去 Naaah,我不需要测试所有 。错误。如果你走另一条路,这仍然是可能的,但它的抑制阈值更高。
  5. 总而言之,它会感觉很难,但奖励是值得的。

答案 3 :(得分:1)

据我所知,我要说你应该始终牢记你将如何测试这个功能,但首先要对功能本身进行编码。这将允许您找到可能发生的关键部分和最终错误。 您还可以测试功能的输出/输入,并确保它们符合所需的结果 - 黑盒测试适用于此预编码单元测试。

在编写实际方法之前,我一直在努力解决编写单元测试的问题。请记住,我只是一名学生,这只是我的意见。

希望它有所帮助,希望我是对的:)

答案 4 :(得分:1)

我应该测试基本的交易逻辑多少?

根据我的经验,你写的测试越多,你就越快乐。

测试基本的事务逻辑将为您提供类的体验以及它们如何互操作,并让您了解它们的速度,甚至基本事务逻辑的实际工作方式。

它将帮助您更好地编写测试用例,因为练习是完美的。

稍后,谁知道,它将帮助您在升级数据库或完全更改数据库时检测到错误。

答案 5 :(得分:0)

我将特别尝试回答有关测试基本事务逻辑的问题。大多数情况下,我会为层次结构中较高的单元编写单元测试。例如,在基本的模型 - 视图 - 控制器设置中,我的单元测试是测试控制器,而不是底层的DAL。为什么?因为我假设当控制器通过测试时,控制器下面的层也可以正常工作。

但是对于共享库而言有一个例外。在许多项目中共享的库将获得自己的单元测试,例如以确保API的稳定性。

另外,将您的单元测试视为项目中的另一个应用程序。确保你没有在测试中使用c / p代码,不要将一堆测试装置放在一起,而是要花时间设计一个可扩展的漂亮结构。它将为您节省大量时间。