【问题标题】:Explain unit testing please请解释单元测试
【发布时间】:2011-06-08 16:26:41
【问题描述】:

我对单元测试有点困惑。我看到了自动化测试之类的东西的价值。我认为也许一个很好的例子是帮助我理解的最好方法。假设我有一个我想要单元测试的二进制搜索功能。

现在在测试中,我想知道以下内容:搜索是否找到第一个元素、最后一个元素和其他元素?搜索是否正确比较了 unicode 字符。搜索是否处理符号和其他“痛苦”字符。单元测试会涵盖这一点,还是我错过了它?你会如何为我的二分搜索编写单元测试?

function search(collection, value){
 var start = 0, end = collection.length - 1, mid;
 while (start <= end) {
  mid = start + ((end - start) / 2);
  if (value == collection[mid])
   return mid;
  if (collection[mid] < value)
   end = mid - 1;
  else
       start = mid + 1;
 }
 return mid;
}

单元测试的伪代码会很可爱。

所以,我们可能有:

function testFirst(){
 var collection = ['a','b','c','x','y','z'],first = 'a', findex = 0;
 assert(seach(collection,first),findex);
}
function testLast(){
 var collection = ['a','b','c','x','y','z'], last = 'z', lindex = 5;
 assert(seach(collection,last),lindex);
}

【问题讨论】:

    标签: unit-testing testing


    【解决方案1】:

    不,你没有错过它,这是单元测试旨在告诉你的。通过测试好的和坏的输入、边缘情况等,您有正确的想法。您需要针对每种情况进行一次测试。测试将设置任何先决条件,然后断言您的计算(或任何可能的结果)符合您的期望

    【讨论】:

      【解决方案2】:

      您对单元测试的期望是正确的;这非常关乎验证和验证预期行为。

      我认为很多人都忽略了单元测试的一个价值,那就是它的价值会随着时间的推移而增加。当我编写一段代码并编写一个单元测试时,我基本上只是测试了代码是否按照我认为应该做的,它没有以我选择检查的任何方式失败等等。这些都很好东西,但它们的价值有限,因为它们表达了你当时对系统的了解;他们无法帮助您解决您不知道的事情(我的算法中是否有一个我不知道也不想测试的偷偷摸摸的错误?)。

      在我看来,单元测试的真正价值在于它们随着时间的推移而获得的价值。这个值有两种形式;文档价值和验证价值。

      文档值是单元测试的值,说明“这是代码作者期望这段代码做的”。很难夸大这类事情的价值。当您参与的项目包含大量未记录的遗留代码时,让我告诉您,这种文档价值就像一个奇迹。

      另一个值是验证;随着代码在项目中继续存在,事情会被重构、改变和转移。单元测试提供了您认为以一种方式工作的组件继续以这种方式工作的验证。这对于帮助发现潜入项目的错误非常宝贵。例如,更改数据库解决方案有时可能是透明的,但有时,这些更改可能会导致某些工作方式发生意外变化;对依赖于您的 ORM 的组件进行单元测试可以捕捉到底层行为的关键细微变化。当你有一段代码可以完美运行多年,并且没有人考虑它在失败中的潜在作用时,这真的很有用;这些类型的错误可能需要很长时间才能找到,因为您要查看的最后一个位置是在很长一段时间内坚如磐石的组件中。单元测试提供了对“坚如磐石”的验证。

      【讨论】:

        【解决方案3】:

        是的,就是这样。您提出的每个问题都可以用作测试。将单元测试视为三个步骤。设置一些先决条件,运行一些“正在测试”的代码,然后编写一个断言来记录您的期望。

        在您的情况下,使用某些特定值(或没有值)设置“集合”是设置先决条件。

        使用特定参数调用您的搜索方法正在运行被测代码。

        检查您的方法返回的值是否符合您的预期是断言步骤。

        给这三件事起一个描述你正在尝试做的事情的名字 (DoesTheSearchMethodFailIfCollectionIsEmpty),瞧你有一个单元测试。

        【讨论】:

          猜你喜欢
          • 2016-04-10
          • 1970-01-01
          • 2018-02-15
          • 2013-03-22
          • 2011-09-24
          • 2011-05-16
          • 1970-01-01
          • 2010-12-10
          相关资源
          最近更新 更多