高效开发与彻底测试

上一篇 / 下一篇  2007-12-04 08:58:36 / 天气: 晴朗 / 心情: 高兴 / 精华(3) / 置顶(3) / 个人分类:寻常巷陌

51Testing软件测试网@!A(F.z8p+C'u!b6_a~

高效开发与彻底测试一、“千般路”与“磨豆腐”
0|'J4Lu N3d(^051Testing软件测试网9{ ZH5~}d7C


v:IWvu0

L)i8nXMHsY a0很久以前听一个故事:从前有个小伙子,少时有大志,长大后却无好营生,开了个豆腐作坊,每天磨豆腐累得腰酸背疼。每到夜深人静,小伙子辗转反侧,总想找条更好的“事业之路”,可是想过千百条、尝试过几十条路,都走不通。夜不成寝,白天干活更累,小伙子不由慨叹:“晚上想过千般路,白天还得磨豆腐”。

Ji_bA,`fe,r;g0
F1V7{xJiU3s0

Z h"t~/N:]1h[0不久以前看过一篇文章:《CMM欺骗了中国的软件业》,内容是对CMM热的反思。CMM当然不会主动欺骗人,实际上是我们的软件业自己欺骗自己。我们从来不缺少“某某模式”,“面向某某”,“某某认证”等等听起来美妙无比的东西,问题是实际的研发过程中能做得到码?现实是残酷的,美妙的概念漫天飞舞,开发过程仍然是作坊式的,正是:“晚上想过千般路,白天还得磨豆腐”。51Testing软件测试网!pj$Oxt Mr$K3_


VcTCu0

;|"x2Tv?B6j"fh0中国的故事通常都有圆满的结局,现在接着说“磨豆腐”的故事。过了很长时间,小伙子终于面对现实,不再沉迷于不切实际的空想,用心磨好豆腐,闲时琢磨些个窍门,慢慢地,他的豆腐质量越来越好,每天产量也越来越多,作坊越开越大,成了远近闻名的“豆腐老板”,后来,他做起了别的生意,发现年轻时的空想,其实很多都是可行的,因为现在“能力”和“财力”都不同了。

M+k B@t8jM0
'Xm d_#oS,N3C d*|4Ys051Testing软件测试网pXk Va*e(_ c

再说软件开发。我们不反对任何理论、技术、方法、模式等等,但第一,您的企业或团队做得到吗?不要做“如果开发时间延长一倍,就可以做到”之类毫无意义的假设。第二,做了真的有效益吗?效益是指扣除成本之后的收益。如果不具备这两点,那么还是不要整天想着“千般路”,首先想想如何好好的“磨豆腐”吧。51Testing软件测试网@1o!W7k?

51Testing软件测试网;wH H#dQ+\e
51Testing软件测试网%rlNzJw#_x

对于所有软件开发来说,代码编写都是无可逃避的“磨豆腐”。改进代码编写工作,高率效低成本地开发出高质量的代码,对于软件产品能否在激烈的竞争中胜出,对于软件企业的生存和发展,都具有重要的现实意义。51Testing软件测试网U bsHY

51Testing软件测试网n _8d1P*[
51Testing软件测试网qA5u.\{"T

本文是Visual Unit应用的范例项目C++代码文档生成器的主题文档,叙述的正是改进代码编写工作的方法和工具,所有内容均经过实战检验,具有"可行"和"效益"两个特征,"可行"是指较低门槛或没有门槛,凭现有条件即可实施;"效益"是指能产生立竿见影的效果。51Testing软件测试网:an'n"_4j:d"Hh@


4AQ9i"csB[051Testing软件测试网#u.a @7c.H I,QbTg|

本文所援引的范例项目,模拟最糟糕的开发团队,最混乱的开发流程:由很少写代码的测试和预研部门开发,人员不固定,时间也不固定,谁有空就写上一些;没有设计,没有文档,基至也不在代码文件中保存编码人员的信息,成员完全依赖于阅读代码和测试用例来理解其他成员写的代码;除了简单的命名规则外,没有其他规范,甚至连一个函数原则上不能超过50行之类的基本规范也没有(范例中有超过200行的函数CMacro::Unwind(),一万多条路径)。任何开发团队和开发流程都会好于范例项目的开发团队和开发流程,因此,范例所展示的方法和工具,具有"广泛可行性"。51Testing软件测试网%d^#KiKYG


]FuI ]051Testing软件测试网 t FP|@;BM@Rk

本文介绍如何进行高效编码调试和实现彻底的单元测试。编码调试是任何软件开发都无可逃避的工作,在Visual Unit的支持下编码调试,只是把本来就一定要做的工作改变一下方式,不需要多做什么,就可以大幅提高编程效率和质量;另一方面,Visual Unit彻底改变了单元测试难于实施或成本昂贵的局面,无论团队中开发与测试人员的比例是怎么样的,都可以轻松快捷地实现彻底的单元测试。

v@ j,uJ.^J/|1ph051Testing软件测试网!dt?T7H$h0Hw
二、高效编码调试
HA8T%W:]K9m!ez0

B2O8~3Md:Zn0任何软件开发,都离不开编码调试。对于稍为复杂一点的函数,一般来说,编写几行代码,就要执行一下,看它们是否按预想的工作,然后再继续写,写完后还要将各种可能输入都执行一下。如何执行?一般由别的代码来调用,也就是说需要驱动,驱动通常是在开始编写函数实现代码之前建立,这样才能一边编写一边调试。驱动大致可分为自然驱动和专门驱动。

]#j/@y5D+eGB051Testing软件测试网4I1\~$V0u

自然驱动:利用项目中已有的代码作为驱动,通常是在被调试的函数中加断点,从界面执行一个需要调用该函数的功能,调试器中断时就可以调试了;专门驱动:为需要调试的函数编写专门的驱动代码,通过执行驱动代码来执行被调试函数。51Testing软件测试网5M$f)k,v~eK`6u o

51Testing软件测试网4X%] O Dle U


L~2P x|#?1DH0 

N8t#Pod0

Pz.e#`(M} e8g0自然驱动的主要优点是不需要其他工作就可以直接调试,甚至感觉不到需要驱动,主要缺点是输入数据通常是公共的,即很多代码都使用相同的输入源进行调试,实际输入往往是经过其他代码处理后的中间结果,要针对各种可能输入都进行调试往往很困难,造成调试不全面,程序员的思维受到局限,难于做到全面地考虑各种可能输入。

y$nz_p$|J8bG:t0

a2a;g9VnE Ua051Testing软件测试网m k"W#N0r2T*x3] c
 

N*fv['z K051Testing软件测试网&z| KHSZ'P#v

专门驱动的主要优点是输入数据是专门针对于被测试程序,容易做到比较全面,程序员的思维也会比较全面,对编写功能齐全的健壮的程序很有好处,要针对某种特定输入进行调试比较容易,缺点是需要花费大量的时间来编写驱动代码。

k[{8A.Y{!T%V"a0

H:P ? Kg)]1E:e1FT`051Testing软件测试网6f0Z(D D:@;q
 51Testing软件测试网1mj-o }0VW7^d

R.G5@U6xfR(x_g r;_0显然,自然驱动的主要问题是不全面,代码错误较多,专门驱动的主要问题是编写驱动代码很费时。有没有更好的方法,既不需要编写驱动代码,又能方便且全面地调试?有 !这就是自动驱动,即在Visual Unit的支持下编码调试,不但无需费时间写驱动代码,更拥有多种独特的便利,可以大幅提高编码调试的质量和效率。51Testing软件测试网,IX3f!|{!L4{*e

51Testing软件测试网zF)p}:F|bD s2r

51Testing软件测试网c8uoV]
 51Testing软件测试网2W {[R|6SZ4zb

51Testing软件测试网W g1Wj7L O-bL

Visual Unit是单元测试工具,但也是高效编程调试的支持环境,在Visual Unit的支持下调试,既全面又省时:

E1H$AVX{U0

I7[*HxU0
dOR%S;N-e m0 

f+Q@9\W![ Fx4U051Testing软件测试网.^Hp rY.v&u3p]%_

自动生成驱动代码,但又可以方便地设定调试输入;51Testing软件测试网*|TZ.H5Z&Z3\ X"V2\H

51Testing软件测试网j8[J j/s/?Oy"g


4m lKK8] p+mP`0 51Testing软件测试网}fe7q W1C^Q l/^

51Testing软件测试网J(\u.eT4V+` F

测试用例编辑器列出全部输入,可以很方便地检查是否全面。51Testing软件测试网 X%k` e,n

9Gkn Yy*~*O051Testing软件测试网.e/b*Cy fT%z
 51Testing软件测试网ik\4zvV:]*B

ORkr#C9e S;g0除了上述优点外,在Visual Unit的支持下调试,还可以:51Testing软件测试网 Qu/GKC

T];p,?IG;Z7F0
Q@{^+|f0 51Testing软件测试网's$I3W"r7VGj#?

q3w{ c~oC]0可视化地选择调试输入;51Testing软件测试网*~a&Q7~%u:_P

0E^2mY |[.?.qN051Testing软件测试网)wD*@7s-]/U0s"c o$A)f
 

!P}Qq?6s4gv Y%Q0

JMG%lN2t:S0调试过程中还可以切换输入;51Testing软件测试网Z4BE+j9?B8h ~

z%t p4Pur0
`$jg Ue R D]r0 51Testing软件测试网3[Lop fA

51Testing软件测试网!MC2uR}8v/YzR"o

无限制的后退,重复。51Testing软件测试网;v_4h:I![ R^

u y%s5Xz0t$y*iu051Testing软件测试网7whAG q:F]
 51Testing软件测试网*_)qAk7M U^

51Testing软件测试网e] UU;~!V/R#e(p#X

上述仅是免费的个人版的功能,对于企业版用户,实际上大多数单步调试都可以省略:

-e$Ts.t#s'EH ~051Testing软件测试网l$nZOi4f!y

51Testing软件测试网 mL6P6t [eb dX
 51Testing软件测试网PoUcK,w

B+g+FH9R"nG0自动输出参数、成员变量的输入输出值,返回值,用户也可以用简单的语法输出任何变量或表达式的值,这些数值都是上下文相关的;51Testing软件测试网Z)_&dG~|5H

51Testing软件测试网 ~ i/[?BnL5K


,]OF2xu3|;p&Nc1y0 51Testing软件测试网fh8S VI

x R:b[W/C6{0q n0显示在一个用例下,程序所执行的代码,可以很方便地查看程序是否按预想的流程执行。51Testing软件测试网.[#?th3M#iB

51Testing软件测试网;j3xMG R&bC [q

51Testing软件测试网 TB&ip)f"z/MA7v
 51Testing软件测试网)z5v K:Z B\ \}0ak2j

51Testing软件测试网LC+j9~ qcN5r

程序无论多复杂,无非就是执行一些代码,读写、计算一些数据,因此,上述两方面信息已完整地描述了程序行为,一眼就能看出程序干了什么,通常可以很快判断程序是否按预想的工作并找到出错原因,比单步调试要快得多。

8E*q(H+^[,RZK0

W4a)xUk0
LH3I4F7}!VVE'aZ0 51Testing软件测试网NP9[-E+x2V;Q8^y

51Testing软件测试网8Mk`B!Ai&z

下面以实例来进一步分析三种调试方式的优缺点。这里所用的示例是范例项目中的CExFunction::ParseOneParameter()函数,这是一个很普通的函数,读者也可以随便拿其他有些复杂度的代码来比较。该函数的功能是解析C++代码中的一个参数,原形如下:51Testing软件测试网CLD sSMi

p"[4N7K\2zw i0qg_0
*Cbw-I @$R cYm'v3| p0 51Testing软件测试网q,bik hw]t&b

51Testing软件测试网/w2A[M8J

PARAMETER* CExFunction::ParseOneParameter(CTokenList& iList);

$hJ!x\+li9FwW0

g*LS1nsvC~(s051Testing软件测试网5o2MB M"ER?
 

OPZ _,w"V+s-V%K051Testing软件测试网(ia%eMm-v

PARAMETER 是保存一个参数对象的结构,定义如下:51Testing软件测试网)Wg'^m0f

51Testing软件测试网wa0_1h {@ e$K5g


tl1X&ntl0 

~_dO;yfcCX~wc051Testing软件测试网j`q F;Nc?sD

struct PARAMETER51Testing软件测试网%[9Z#i2gD:G

51Testing软件测试网gM:X/q!h0mY


5p,t+_4M9EdnY0 

u!C8c7P#h0

R~+Yw\7IK0{

A8Ba"f Stz1X(J^051Testing软件测试网i2i,|td;sIi.z O


4H~v,L!R7Rg0 51Testing软件测试网??+i$T4`dA%DN7O

:u O'I#yT1O R0CString type; //参数类型51Testing软件测试网u6Y5z-G;[%P/D)`

G @]HJs i0
C7o N;M{"I lq8u V;s0 

h%@xNc H#`#e051Testing软件测试网px`-qE HAJ

CString name; //参数名51Testing软件测试网7Q/J1Q er'M,o^;G,m6W3] P

51Testing软件测试网+d#R#E3Ib ES6qu

51Testing软件测试网 RSAI tv
 51Testing软件测试网2}Pax"A4eG

51Testing软件测试网gKtCd4G%s

CString defVal; //缺省值

J9M"e B:[8_I0

Mb|.\m;_051Testing软件测试网0\qopOp
 51Testing软件测试网6D6V"Ro(xLl!B

V4K9@3X|zU I0CString array; //如果参数是数组,保存[]及[]内的文字常量51Testing软件测试网bw.q:_9Jtu5v&\

51Testing软件测试网:d j)d5~!q5P

51Testing软件测试网uo(o2DT
 51Testing软件测试网)@k R~]&L6m

51Testing软件测试网} oX \R6~ C B*N,k

};

-HW@\;k^;R051Testing软件测试网F9m MG(V ZY*E1W

51Testing软件测试网2Rh_hQ,c(H
 

&E1bd)X ~*p051Testing软件测试网{oMLT#W7@)~&}Y!P$G

参数iList是一个输入参数(范例的命名规则是用i表示输入参数),传递由C++代码中的一个参数经过词法分析转换获得的记号对象序列,例如参数int* pi,将转换为三个记号对象,分别对应于:int, *, pi。该函数将记号对象序列解析到一个PARAMETER结构的指针中,并作为返回值返回。51Testing软件测试网 f*[!k^/{t s

vL gBC_Q051Testing软件测试网 Sc8CCy$E:^r
 51Testing软件测试网 vDp,w!G9imu!N4k5_.X-g

'Ej{ f z.a,H0在这个示例中,如果要进行比较全面的调试,输入至少要考虑以下可能:

4cz!B L)du4z051Testing软件测试网S%L(sy:|y-_i

51Testing软件测试网 hm_;QVP&]:s4b0C
 

9Ep/i7|}'I7l0

|f2FUJ7h0普通输入,如int i;51Testing软件测试网So6z3VV#yN7C

51Testing软件测试网"^6n|0A{


P!^9G;wN\0 

u@ A@tu,x051Testing软件测试网!B!V0pXz

类型中有符号,如int* pi;

z&AF4\;~V/sk-h0

0S&P:_Al P&v'p0
:Xx"MZ'x!Q0 51Testing软件测试网As pp @PY8H-m'S

xTtu/b|t`?'BW0类型中有多个符号,如int*& pi;51Testing软件测试网D|9b:J#v;r8M,eW%m ]

51Testing软件测试网Q3Vea4U*v!P

51Testing软件测试网8r+H5F|u+Vr#p4n.|
 

.a0]7k2y4D5S#X O([%j-Ew b051Testing软件测试网[:AV F3ad6I3_

模板类,如CList list;51Testing软件测试网4V5C u4a4oH

_t5l6a u*O051Testing软件测试网u"s;}?.EAN
 

0i3x%db8MI}2wf0

f ~9~jJ'|nl5[0带缺省值,如int i=0;51Testing软件测试网ORV6f%~-ez}R

~JXT?7Rg1A051Testing软件测试网&~RjCHI
 51Testing软件测试网,D"g:?x-p9J/_

#ck-Y [ L*V4v}(p4b0数组,如int ai[10];

(} y%A,v h051Testing软件测试网 D-^ X@)M~!P ~$K

51Testing软件测试网'j4Xc!_9|0~.x
 

/y]%S)dC6d0

V G3s ryP^ S0类型有多个单词,如const unsigned int& i;51Testing软件测试网*v F4N&U)@u:wg:gOw

-T wW^ At0
0baT(X2A&at%K0 51Testing软件测试网;p#h%_e#w/m hA(v

51Testing软件测试网.g_!VU.r(X+]lK/J

缺少参数名,如const int;

H+rns`0

~3P5s7k1Cr ?:R051Testing软件测试网+CW Y3Z X/FsDts
 51Testing软件测试网9ex6`Gs

bYyr$J!liqI0我们在编写这个函数的实现代码前,首先建立调试驱动,以例边编码边执行调试。

(Ks8@cD'[#q-W051Testing软件测试网!iOi@1g


)}$YW1C+^c0自然驱动
f+_]jY+UvQo051Testing软件测试网-_lW3oT

51Testing软件测试网:FK;t-[9i0w

假设界面和要调用这个函数的其他代码都已完成。在函数的入口处插入断点,以调试方式运行工程,在界面中选择要生成文档的工程目录,点击"生成文档",程序中断时就可以调试了。这种方式相信所有程序员都很熟悉,并且很多人都会认为这种方式最省时.

.Up#Wp;\V0

1m:o`*J4W,nA0 51Testing软件测试网:halj E^#X


TAG: 寻常巷陌

 

评分:0

我来说两句

日历

« 2024-03-09  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 3529
  • 日志数: 7
  • 建立时间: 2007-06-08
  • 更新时间: 2008-06-26

RSS订阅

Open Toolbar