嵌入C语言的测试驱动开发:为什么要调试?-2

上一篇 / 下一篇  2012-07-30 11:43:47 / 个人分类:Linux

51Testing软件测试网*R q-a;T T5d

  很多代码阅读专家审查了这个代码,并得出了可能与您一样的错误结论。闫年的最后一天是该年第366天,而Zune对这种情况的处理是错误的。在 这一天,该函数永远不会返回!我编写了设定年份以及年中天数的代码,看是否像90%的Zune bug专家预测的那样,将天数的布尔代码设定为等于或大于366就能解决问题。代码放入测试装置后,我编写了测试用例(列表2)。和Zune一样,测试进 入了一个无限循环。我采用了经过数千名程序员审核的适当修复方法。出乎我的意料,测试失败了;设定年份与天数的测试认为日期是2009年1月0日。新年前 夜,人们仍会拥有自己的音乐,但Zune仍有个bug。51Testing软件测试网*`:Qk*LHp

kh e[q/b7dyI'G1YP0

  一次测试就可以防止Zune bug。可你怎么知道要去写这样一个测试?只有知道bug在哪里才会写测试。问题是,你并不知道bug在哪里;它们可以在任何地方。所以,这意味着你必须 为所有的部分写测试,至少是所有可能中断的地方。难以想象要考虑到所有需要测试的东西。但不必担心,你不需要针对全年每一天做测试。你只需要一个针对有关 天数的测试。

~d2ug\8H0

  计算机编程很复杂,TDD能够系统化地让你的代码按本意运行起来,并提供能使代码工作自动化测试用例。51Testing软件测试网8?*_i9wY lH

  嵌入设计51Testing软件测试网#k/d4b7X8M~

  当我首次使用TDD时,我认识到,它可能有助于解决一个问题:目标硬件的瓶颈,这是令很多嵌入软件开发人员头疼的事 情。瓶颈有多种形式,你可以使用TDD,在严格的TDD反馈循环期间避免瓶颈的出现。很多嵌入开发工作都已实现了软硬件的并行开发。如果软件只能在目标硬 件上运行,则可能浪费至少一次的时间。例如,目标硬件可能迟至交付期还不可用,推迟了软件的测试;硬件可能昂贵且稀少;或者它本身就有问题。目标硬件还可 能有长的建立时间或长的上传时间。大多数嵌入开发团队都遇到过这些问题,它们会减缓进度,并减少了建立今天复杂系统的反馈。51Testing软件测试网E$|F%u _;c b

  为避免目标硬件的瓶颈,可以采用“双重目标”法,即设计自己的生产代码与测试,使之大部分运行在标准PC上。但双重 目标有自己的风险。开发系统中测试代码的信任度是建立在交付给目标以前的代码上。大多数双重目标风险是源于开发环境与目标环境之间的差异。这些差异包括对 语言特性支持的改变量、不同编译器的bug、运行时库的差异、文件名差异,以及不同的字长等。由于这些风险,你会发现,在一个环境下能无错运行的代码,可 能在另一个环境下出现测试错误。

9em s:xgY0}?_#@:G0

  不过,执行环境中潜在的差异不应成为阻碍采用双重目标方法的理由。相反,你可以在实现目标的路途中解决这些障碍。嵌入TDD周期在不牺牲优点的前提下,克服了挑战。51Testing软件测试网$t,X qk-}j;ED[P

  开发循环51Testing软件测试网9Y] l'@ \$e6x

  当建立与测试循环只需几秒时间时,TDD是最有效的。这种方案为大多数程序员排除了在循环中使用目标硬件的情况。快速反馈的需求将TDD微循环与目标分离开,而运行在开发系统上。图5显示了一个TDD循环,它包含着双重目标的风险,提供了快速TDD反馈循环的好处。51Testing软件测试网f2C0hLo6rbg

/`l1d.OOi? Z'T N051Testing软件测试网 Q5VpM9?N

  表1中所列的各个阶段,预计可以在相应的阶段发现问题。例如,你会发现每个阶段都有助于找到这些问题。第1阶段会在你编程时给出快速反馈,确定 代码做你想要做的事。第2阶段确保你的代码是在两种环境下编译。第3阶段确保代码在主处理器和目标处理器上的运行相同。评估硬件可能需要比目标更多的存储 器,这样才能把测试代码和生产代码都装入地址空间。有时候,如果你有一个可靠的目标硬件,它有空间运行对单元的测试,也可以省略掉第3阶段。第4阶段是在 目标硬件上运行测试。在第4阶段可以引入一些依赖于硬件的单元测试。第5阶段是看你的系统完全整合时,是否如其应该的那样运行。至少让第5阶段的某些部分 自动运行,这是一种好的想法。采用TDD的团队会发现第1阶段中的巨大价值,可能不要实现全部各个阶段。51Testing软件测试网 ude5An+\IXrp

51Testing软件测试网"KH1q:?jgb)i

  嵌入TDD循环并不能阻止所有问题,不过它应有助于在适当的阶段发现大多数刚刚产生的问题。你还应至少每个夜晚手动执行第2至第4阶段。连续的集成服务器(如Cruise Control或Jenkins)都可以观察你的源码库,在check-in后开始做建立工作。

1nY3N/h X.i9qD g0

  TDD有助于确保你的代码做你想要做的事。如果不是这样,如何才能建立一个可靠的系统呢?它帮助你让代码在最开始时 保持正确,它建立一个逐步测试的组件,帮助你维持代码的运行。你在发现、追踪和修改bug上要花掉相当多的时间。很多开发人员现在都用TDD来防止这些 bug的出现。它基本上改变了你的编程方式。

1y+NUv;q0

  TDD能快速地发现小的和大的逻辑错误,阻止bug的产生,并最终得到较少的bug。较少的bug也意味着较少的调试时间,以及较少的缺陷。当新代码危及一个约束或一个假设时,测试会告诉你。然后,有良好结构的测试会成为一种形式的可执行文档。

8b]sF;^5Lj0

  TDD还让你放心,这种信心来自于一个带有完备回归测试组件的彻底测试代码。采用TDD的开发人员称周末不再受干扰,并且睡眠更好。TDD还监控进度,追踪当前的工作,以及做了多少工作。当代码变得难以测试时,它还对设计问题提出早期警告。51Testing软件测试网8TX"`&r U/}1N


TAG:

 

评分:0

我来说两句

Open Toolbar