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

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

51Testing软件测试网Im?7^i$O)m

  要点

so(gEy6J4e7M6O051Testing软件测试网a!|9E*gR7C:N$R`

  1、为什么你会遇上这些bug?因为它们是你放的。51Testing软件测试网3[x5y^&bp'J&KG

b!bgJ*s0  2、在TDD(测试驱动的开发)中,你会在一个严格的反馈循环中,开发测试与生产代码。51Testing软件测试网)}_ E1a1b{7Fb

P/p [Mh2C"i0  3、TDD可能有助于避免恼人的Zune bug。

@0Z%f4YB%jrjZ0

%C+uX$Y8gw e0  4、目标硬件瓶颈有多种形式,你可以在严格的TDD反馈循环中,用TDD来避开瓶颈。51Testing软件测试网~gZ"aY&L

51Testing软件测试网O`Yf3O

  5、TDD帮助你确保自己的代码如期望那样运行。但如果不是这样,你该如何建立一个可靠的系统?

eAY#@ z9w)U0

jbMo qv&tzZ0  6、TDD快速地发现小的和大的逻辑错误,防止出现bug,使最终得到较少的bug。

y+JTx Z*?051Testing软件测试网3D`] F6e9KL M2b#H.k'K

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

51Testing软件测试网5G!p.eg&I Kr+J5Wr*N

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

:I,GP.pRj r!L U T051Testing软件测试网 ^.[r(yc x7]y

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

[*g7n~!q1OM-O0

图1,在开发以后做测试时,会发现缺陷51Testing软件测试网0uI!yXy{$]

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

}1@*u2R:A'qo0

51Testing软件测试网+@|Rh3mW)t `s#y{

图2,人都会犯错误。你无法确定bug何时出现,以及要花多少时间才能找到它们51Testing软件测试网X*Q7}!L RB&W

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

{3e{YfL0

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

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

X(v'XR#p%n{,Er0

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

b u'{P5p-zp r0

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

E!O['e4Mp0

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

  TDD为错误提供了即时的通知,可防止出现很多要被迫追踪的bug。TDD可防止出现缺陷,而后调试编程会带来耗时耗力的调试工作。51Testing软件测试网wmdQE9a:A;_;Sd

  Zune bug51Testing软件测试网6},NsvG;R'f

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

51Testing软件测试网c4lGc[S8o

图4,TDD对于设计以及时间的使用有深远的影响。与调试居后的编程模式比较,TDD51Testing软件测试网q5k.F5[&[ALly

  没有回溯追踪bug的风险与不确定性

!VwJh.^:Y&H6z0

DM}%IY$]g0

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


TAG:

 

评分:0

我来说两句

Open Toolbar