51Testing软件测试网Hp@c4r"}"mD 就要完成所有的单元测试的任务了,做了将近三个月的时间,如果放在以前我有一肚子苦水要述说,不过经历了一些思想上的洗礼之后,不在那么单纯,只为把手头工作做的更加出色而已!
wna;[1zyCy051Testing软件测试网w}ubS&w7DwH'd4XW 这是单元测试最后一篇了,来做个总结把!51Testing软件测试网,cCu
L\5^IgD
51Testing软件测试网9Jb.w5g0}`f%u*d 目录:51Testing软件测试网"m_ I
~_7^$U8h
51Testing软件测试网J;T8PvAk 好的单元测试应该具有的特点51Testing软件测试网1KE/iRv
r*]-DL
单元测试的命名规范
1tY!j|P5Ljf0 建立自己的公共调用库51Testing软件测试网3dqB#] Fj0{u
单元测试带给我的思考和感悟51Testing软件测试网Z"lBp0F"`&m%W[(P5z$j
总结图示51Testing软件测试网.e@.u$jf:jm'N*R
51Testing软件测试网P*hY.K%NQ+I
H 1、好的单元测试应该具备的特点
CM {qgI0v+e7V3Gw051Testing软件测试网k
Q8Z4nW
] Q7P6X4? 一个好的单元测试一定有它具备的特点,下面就来说说那些主要的特点!51Testing软件测试网yqxBhY6?e
51Testing软件测试网wVQ*df,} fSw 主要概括为 → A-TRIP原则:
&T/h
t\(zD4wH U0I&b&D+Cfbd;i6?0 自动化 → Automatic51Testing软件测试网9V`~g1y8m9_f2~A
ZVg(a,`0 彻底性 → Thorough
0ap6@Vv*u0#f3_@)?|s s3i0 可重复性 → Repeatable51Testing软件测试网4]7W:R,zNA"^W
51Testing软件测试网%j3aU^F0kjD 独立性 → Indepentdent51Testing软件测试网*`DV4R$r*z r8l
51Testing软件测试网j].JJ&j 专业性 → Professional51Testing软件测试网oSC{ T'p
#t:S
^hA*D0 恰到好处的单元测试会使你的工作轻松,代码整洁干净,乱用,没有准则的用会浪费你大量的时间,不但没有效果还会是工期延误,所有了解单元测试很重要!
zd5x*O\hkK0 }LAGI)mf0 ① 自动化51Testing软件测试网&p+C*qQ
Kwc+L
P%Tj8@V$o0 a)不需要人的参与,有的时候只是轻轻的点击一个按钮就能自动执行,所以自动化的标志是不能比点击一个按钮的过程还要复杂!
6SS.npn9a[
KE0$I+vI%iLS4Tr4C?0 b)在签入其它的测试代码时不能对现有的代码造成影响!51Testing软件测试网3N$vzoZ3Z0g
;Gx5i)nW0h0 c)能够自动识别测试是失败还是成功(VS2008以后的版本都集成了这个功能)!51Testing软件测试网EC DB)Ap9Q
51Testing软件测试网Q-yen1q d)在任何时候,任何地方都能自动运行(所以“Moles”技术就是关键)!
Gif {2[b+x p$`0:v7Dz"x8h3aQ0 核心:执行测试代码和检查测试结果都必须自动化(VS2008以后版本都实现这个功能了)!51Testing软件测试网"t0|BB`0U
51Testing软件测试网E y&dhOK 总结:I,不要引入一个由于需要手动步骤而打破单元测试的自动化模型的测试!51Testing软件测试网lz2iUu%]%NJ
51Testing软件测试网1jE G-uTw$i ufF II,对于测试所需要的任何条件(大部分是数据库)都应该让它成为自动化测试的一部分,如果有需要可以使用Mole技术!
D7zc%T9k1?ci+~051Testing软件测试网oX7{*?fl$R9D-}9k+z9jg ② 彻底性51Testing软件测试网g{.HY:X-EV WaA
51Testing软件测试网7d/Xj1`&mb7b#uw 所谓的彻底性就是说你的测试案例必须要考虑的全面,应该把可能出现的问题都做成测试案例!51Testing软件测试网-x*A8pJ`
f
M*v:|hj/ba
`-Qz0 具体从哪些方面着手,可以参阅这篇:走进单元测试:测试需要从哪些方面着手
,Ex+M.O a1^051Testing软件测试网Yf$Xwa8y$Y|,S't ③ 可重复性
2e
}tiCbk01dw*O:d7T'M#LCJM0 a)每个测试案例应该独立于所有的其它测试,而且必须独立于周围的(系统)环境!
gi'N&Ob~UB0BXWo"\ D%V+KypD0 b)测试代码能够一次又一次的运行,在不修改代码的前提下都能产生一样的结果,否则有BUG!
\5sWOD051Testing软件测试网s*sFy6M;}1c/R c)不要把测试代码写死,应该写的更加灵活一点,运用封装,重构等等的思想!
9n6I+RgY6r8@er K0["v&iO~,]7IU3P0 d)不要让测试本身也出现BUG,确保测试代码的正确性!51Testing软件测试网9Dp u4mq1p
A}4?
51Testing软件测试网.`4w5q&w&}N$y;~1q5e ④ 独立的
!s/fAs,^0(r.Pi-Q!g'rS0 a)每个测试应该有很强的针对性,也就说一个测试只能测试一个方面的内容!51Testing软件测试网$EY9Zf*\ J[
P1t os&a6O[0 b)每个测试应该独立于环境(软件所处的系统环境)和其它测试!
9]\j@ q3aNGG051Testing软件测试网d0mL+_yV [-l.tO 总结:I,每个测试都不能够依赖于其它测试,你可以在任何时间运行这个测试而不受其它测试的影响,每一个测试都应该是一座孤岛!
pI7n\^Iwm%e051Testing软件测试网\Kyd-e.E II,所以测试一个函数都有很多个测试方法,只有这样才是真正的测试!51Testing软件测试网6DTE1KggQAk
4[VV*o3ZBm3q As0 ⑤ 专业的
4Awu(@{}$p T1Fjb051Testing软件测试网'M]
k8h)[qWn$Q/GZA a)所谓的专业就是你的测试代码应该跟你的开发代码保持一样的风格,如:简洁明了,封装,解耦,不要出现“Hard Core”,要灵活一点!
;OB1Nvv3hcE03`r9LzmJ1v D0 b)拒绝编写冗余的测试代码,千万要小心不要掉进这个陷阱,因为像我们这样的新手在初期都不会注意到这样的问题,所以我们要牢记在心里!
R!FBoRUr051Testing软件测试网Dxg c9q4z?;{ c)遵循普遍规则:1.维护封装 2.降低耦合!
L[|8|'Lb0~
_c0St'\?0 总结:不管怎么样你都应该认认真真的对待单元测试,代码的质量要求都应该跟开发代码同等水平,这是作为开发者必备的素质!
ob Od p0uK4`0q o051Testing软件测试网*NyL#b7NC 2、单元测试的命名规范51Testing软件测试网8Rz_ Dj `o'Lhi
51Testing软件测试网}Vf*n'T\m 在我们项目的中,可能需要测试的方法有成千上百个,而每一个测试方法都有可能写三个以上的测试案例,那么怎么来维护这么测试案例呢?51Testing软件测试网
Eg0tT5`2Q
51Testing软件测试网r.Xb2_S 所以我们应该规范方法的命名方式,那么其他人在阅读你的测试代码时,直接通过方法名就能知道你的测试案例是测试哪个方面的了!
@"?.U5YdI051Testing软件测试网ZL1Dc3@u&@ Note:单元测试案例类似于一个可执行文档,可以帮助其它的开发人员了解方法的作用!51Testing软件测试网&q:w-gU|3f;Av
pGH3Ol4S-p:cD0 在我们的项目中是这样规定的:方法名 + _ + 你测试是哪个方面的内容 + _ + 产生的结果!51Testing软件测试网8aG Mbm+P&H6~3BI3i7P
1u
x}w X0 下面我就举个列子,下面的测试方法命名就是针对这个函数来命名的,如:
+n;jDS'n%K7o-O7u6a ~051Testing软件测试网8fR*m
R_,zV&QJd3K6N@(Qub Z`01 publicDataSet GetDetails(intID)51Testing软件测试网0a3F(q
J$Kj
|6ER 2{ )a
Y)hfz-Q03 // 方法的作用:这个一个获取数据,并包装成一个DataSet的方法,传入的参数是一个bondAppID,那么我们怎么来设计案例和命名方法名呢? 5} |
(Jjld{ [0 ① 首先设计你的测试案例
g?(}oFJ00E-e9Q(QM\5q0 看到这个方法我就会有这几个想法:1,最大值 2,最小值 3,刚刚好的值 4,随便一个值 5,还有的测试案例会随着你代码中的逻辑而产生!
~|A(X6_04Y Wk%t%F&_0 下面是我的测试案例以及方法名的命名,测试方法是上面的那个:51Testing软件测试网 RPG |~"H1r-z6`/G"K
9u1C.No8~7G'Y/L$\051Testing软件测试网 ms(lO%y+oQ-ncMv
/// <summary>51Testing软件测试网%g.[F2ezQ
/// Input valid bond ,but the cheque is presented Status.51Testing软件测试网)_L6`:d [ HO
///</summary>51Testing软件测试网Pm+p{NhXl|8`
[TestMethod()] //如果你预期有数据返回,那么就应该在最后面加上“RecordFound”,这样别人看的时候就能一目了然了!51Testing软件测试网i`$M!I&k6vL
public void GetDetails_CheckPresentedStatus_RecordFound()
c7g;lL9|0 {51Testing软件测试网0KO9^],JpP4y
//To Do.
"WH/Y0[2lIBV2T0 }51Testing软件测试网J_+HysS,@ Zf'V
.M S,L8L#p7]0 /// <summary>
AW:@;OOZ#xi%U0 ///Cancel Status.
"@f3`.f4f8W0 ///</summary>
tbx~oj-_0 [TestMethod()]
ug/jP ?O5{en"a0 public void GetDetails_CheckCancelStatus_RecordFound()
)`a
j5SUM q;D0 {
4S:FI&X5[/LX8~
w0 //To Do.51Testing软件测试网Zaw8Zv
l
}
#B+vO7n.G_(X,^0
K5K!yt+g0 /// <summary>
d3|0n$N @0 /// Input max.
2a OyW\w6i5k0 ///</summary>
^K:P
|0@1p0 [TestMethod()]51Testing软件测试网 W_@ Nd0~1xg|&I@
public void GetDetails_CheckDetailsByMaxBoundaryValue_NoRecordFound()
0w&s#d|b0 {51Testing软件测试网J @C{`
//To Do.
8K_I4s{;@/S
]0 }51Testing软件测试网e
u'iWM-d2l
51Testing软件测试网-EP$O r5j
v,v
/// <summary>
G,j;NZ5U*oU@0 /// Input min.51Testing软件测试网b6o+W'{6BW
///</summary>51Testing软件测试网IT2F}v
d,[6s7m}+T
[TestMethod()]
_ s
S7|0TT#U0 public void GetDetails_CheckDetailsByMinBoundaryValue_NoRecordFound()
*^I*B+Y(AZ YJ0 {
,SnZ1y4W0 //To DO.
%Vr R H6U R}9[0 }51Testing软件测试网Ve ?;\0_
v4h%{ U*K
51Testing软件测试网 Y&h(s-C*b^&T
/// <summary>51Testing软件测试网:Za^(nw9H%X
/// Any bondID.51Testing软件测试网0P"C1Hy?Y
///</summary>51Testing软件测试网)lkjd,DK
[TestMethod()]
5CDO;L6[0 public void GetDetails_CheckDetailsByAnyBondID_NoRecordFound()
G1c{+b+u-li7@(s0 {
.d4^w&TP%n0 //To Do.51Testing软件测试网`uw!T8~[
j
}