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

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

0yL7f:m.T/uA0  要点

r6F i` `0dMF051Testing软件测试网0``5Nvs|D

  1、为什么你会遇上这些bug?因为它们是你放的。51Testing软件测试网,g S un#sb4Z/Az

R!eq0e.bFA y0  2、在TDD(测试驱动的开发)中,你会在一个严格的反馈循环中,开发测试与生产代码。

6Csj)X{ MJ K-f!m051Testing软件测试网#M6E-_h-q*c7o)bwZ

  3、TDD可能有助于避免恼人的Zune bug。51Testing软件测试网JeE,@Ns _

51Testing软件测试网1N bfY"ey5]'eF-Rp

  4、目标硬件瓶颈有多种形式,你可以在严格的TDD反馈循环中,用TDD来避开瓶颈。51Testing软件测试网*u@V S'w

51Testing软件测试网 ?2K _&TA#U ox?Tl

  5、TDD帮助你确保自己的代码如期望那样运行。但如果不是这样,你该如何建立一个可靠的系统?51Testing软件测试网j-F4}:lsS-j5w(AP

51Testing软件测试网r'VZL`!C-`

  6、TDD快速地发现小的和大的逻辑错误,防止出现bug,使最终得到较少的bug。51Testing软件测试网Tg&f7Nc

51Testing软件测试网q y:It~5jP

  我们的工作方 式都是编写代码,然后努力让它运行起来。先建立,然后改错。测试是以后的事,即写完代码后才要做的事。在不可预期的调试工作上,大概要花掉我们一半的时 间。在日程表上,调试工作都穿着测试与集成的外衣。它是风险与不确定性的一个来源。修正了一个bug可能会产生另一个bug,有时甚至是一连串的bug。

1o,Z'zg.q5B3u051Testing软件测试网#v;CZ$F{(E4M+Wt

  保持调试的统计有助于预测要花多少时间才能消除bug。你要度量和管理bug。看曲线的拐点,拐点表示了趋势,告诉你最后修正的bug要比产生的多。拐点表示的是已经做的事,但你永远不知道是否在代码的某个阴暗角落还躲藏着其它的致命bug。

'BFH9lR051Testing软件测试网O*y*]1QcxV

   可制造性设计的一个方面是确定为什么你会有这些bug。答案很简单:错误是我们放进去的。这就是我们的工作方式。在开发以后的测试时,就会发现问题(图 1)。我们在开发时会制造错误,测试的工作就是找到这些问题。只要仔细地测试,就会发现错误。开发后的测试工作意味着必须找到、修复和管理大量的错误。

5s9hf*X-T%e&I5?0

%~0{L&^1d nn0

图1,在开发以后做测试时,会发现缺陷

3~ g:?1U!sR#@#X/qY0

  这种调试居后的编程程序是当今最常见的编程方式。先写代码,再调试它。调试居后的编程方式有风险。人都会犯错误。你既不能确定bug将在何时现身,也不能确定会花多长时间才能发现它们(图2)。

v-cJ s}P,o0

51Testing软件测试网m7q9k{.`x

图2,人都会犯错误。你无法确定bug何时出现,以及要花多少时间才能找到它们51Testing软件测试网5|Di&eu

   当发现一个bug的时间(TD)增加时,寻找bug根源的时间(TFIND)也会增加,通常增加得更多。如果从错误的引入到发现要花数小时、数天、数 周,甚至数月时间,你已忘掉了当时的背景,必须开始做bug大扫荡。当你在开发周期以外发现缺陷时,就必须管理bug。对于有些bug,发现的时间不会影 响修复的时间(TFIX),但有些代码的运行也可能依赖于bug,修改这些bug会造成其它bug。51Testing软件测试网O ^2L `,iq3n:H d

  短周期以及主动的测试自动化可节省时间和工作量。这时,你再不需要重复繁重而易错的手工测试。有了测试自动化,重复测试几乎不会增加额外工作量。测试自动化快速地探测出副作用,避免了对调试事务的需求。51Testing软件测试网O P:TD0cf(s

51Testing软件测试网wu6\"@@(Il

  另一种方案是TDD(测试驱动的开发),它在一个严格反馈的循环中开发出测试代码与生产代码(参考文献2和3)。一个TDD微循环是:编写一个 测试,未编译时观察该测试,做编译且测试失败,使编译通过,清除任何多余内容,并重复该过程直至结束。编写测试代码与编写生产代码是整合的过程。如果犯了 一个错误,没有通过新测试,你马上就可以知道并改正错误。测试会告诉你是否通过了新测试却产生了某个错误。在设备测试装置中加入自动化测试(图3),就可 以自由地做重复测试。51Testing软件测试网bg1ooZw*Q!I

'`m h@.C X0

图3,测试会告诉你是否通过了新的测试,但却引入了一个bug。自动测试要插入到一个单元测试装置中

B-kJ q-L{5C6G^0

  在TDD反馈回路中做开发与测试时,只能避免一部分bug的出现,但不能完全消除。TDD对设计以及时间的分配方式有着意义深远的影响。51Testing软件测试网bIb`H

  与后调试的编程模式相反,TDD并不包含追踪错误的风险与不确定性(图4)。当发现一个错误的时间接近于0时,寻找 错误根源的时间也会趋于0。刚产生的代码问题通常显而易见。如果不那么明显,则开发人员只要简单地恢复刚做的修改,就可以回到一个可运行的系统。寻找和修 改错误的时间和产生的时间一样少,只有当程序员记忆随时间而模糊,并且有更多的代码依赖于较早的错误时,事件才会变糟。

5u0DY"^W([+r)_0

  TDD为错误提供了即时的通知,可防止出现很多要被迫追踪的bug。TDD可防止出现缺陷,而后调试编程会带来耗时耗力的调试工作。

7~7t"a!m3a1S+HWI0

  Zune bug

E:bBb S5y O4y%Vv0

  TDD可能有助于避免恼人的Zunebug。微软公司的Zune是为了与苹果公司的iPod竞争。2008年12月 31日,Zune变成了“专为一天的程序块(abrick for a day)”。12月31日是新年前夜,是一个闰年的最后一天,这是30G Zune要经历的第一个闰年。很多人都将Zune错误归因于时钟驱动程序中的一个函数。虽然列表1中的代码并非实际的驱动程序码,但它有相同的效果。你可 以从列表1中Zune的无限循环中找到一些端倪吗?51Testing软件测试网 h~%G+V Yw^3s^L

51Testing软件测试网To&|Q/K,~zS;y1a

图4,TDD对于设计以及时间的使用有深远的影响。与调试居后的编程模式比较,TDD

E'F$hdtk#A0

  没有回溯追踪bug的风险与不确定性51Testing软件测试网VG#m/Pr

51Testing软件测试网&fG4t&[$I g.b

图5,对快速反馈的需求使TDD微循环离开目标硬件,而原生地运行在开发系统上。一个TDD循环包括双重目标的风险,但提供了快速TDD反馈回路的好处

~2[6L%dIjQr&d-Hg0

TAG:

 

评分:0

我来说两句

Open Toolbar