单个单元测试应该有多广泛?

时间:2014-10-03 12:50:01

标签: c unit-testing glib

我在C编写了一个应用程序。我是编写单元测试的新手。我将使用glib测试框架。

我在维基百科中读到了这个article。我不确定我的单元测试应该涵盖什么。

我知道我的单元测试应该检查是否有效输入,获得了预期的结果。在为函数编写单元测试时,是否需要完成所有这些工作?

我每次修改时都应该检查每个变量的值吗?因为如果功能被扩展,那么可能会添加更多变量,并且可能会在其他各个地方修改当前变量,因此我将不得不更改测试本身。

请给我你的意见。

1 个答案:

答案 0 :(得分:1)

  

我不确定我的单元测试应涵盖的内容。

对于您的代码,将单元测试看作规范(可运行的文档!)可能会有所帮助。

  • 什么是有效输入?
  • 当代码被赋予有效输入时会发生什么?它是否产生预期的产量? (不要只测试一个有效的输入值;关注可能是1个典型案例,然后是所有边缘案例和极端情况,它们仍应 工作。)
  • 当代码被赋予无效输入时会发生什么?是否产生了预期的错误/错误代码?

  • 代码所依赖的环境是什么?

  • 如果没有正确设置该环境会发生什么?

最后两点实际上是前三个特例。这是因为单元测试不一定要测试单个独立的功能:

  • "输入"并不只是一个函数参数。它可以是您的代码将读取的任何类型的程序状态(即取决于)。
  • 以同样的方式,"输出"不仅仅是函数的返回值。它可以是代码修改的任何变量或程序状态。
  • 您的单元测试可能不会测试一个单独的隔离函数,而是几个函数之间的相互作用,这些函数必须按顺序调用以完成某些操作。阅读文档/规范,这样的单元测试表明,按顺序调用函数是完成任务的适当或甚至建议的方法。
  

每次修改时,我还应该检查每个变量的值吗?

单元测试与他们测试的内容完全分开(通常称为系统测试,缩写为SUT)。也就是说,您的单元测试应该是单独的功能,其中您设置SUT,运行它,然后根据预期结果检查结果。

因此,您的单元测试功能将非常简单:

  • 为您的SUT设置输入。
  • 致电/行使SUT。
  • 读取SUT的输出并与预期输出进行比较。

正如您所看到的,在如此简单的变量过程中没有太多空间可以随时改变它们的值。如果您进行了这样的单元测试,那么它可能太复杂而您可能想要更改它,例如分开了。

更改变量更可能出现在测试代码中(即在SUT中)。但那并不是你放置测试逻辑的地方。这是一个完全独立的功能,它构成了你的单元测试。

(请注意,我非常普遍地说,因为你还没有说过你用于单元测试的框架,所以在某些问题上我可能会稍微偏离。)