单体测试指南-1

上一篇 / 下一篇  2012-07-26 13:40:33 / 个人分类:杂谈

]w6F3aE9z7b0  1、单体测试应该小并且快51Testing软件测试网d)d eS JwRz

51Testing软件测试网y#D7O gLwT+P

  理想情况下在每次代码签入之前都要执行下测试套件。测试快就可以降低开发周转时间。

;k ^ G9^1u*I*X051Testing软件测试网as)W%p f-Zk[

  2、单体测试必须完全自动化,不需要交互

:e;iX+XyQ051Testing软件测试网 b2PSU,hy|

  测试套件通常经常执行,必须完全自动化才有用。如果结果需要人工检查,该测试就不是真正的单体测试。

L [g nNZq z8\S051Testing软件测试网hR.`&V!?*Cr6vW N)h

  3、单体测试应便于运行

t$]g1\7J&jd9_zk0

3z&r6o(~B0  开发环境应该配置成通过一个单独的命令或者一个按钮点击就可以运行单独的测试和测试套件。

Nv7|7X4k)z0

9f |j3j$i+hJ2B0  4、评估测试

)ZL#zWK,Cl051Testing软件测试网-`~kDq%W

  对测试的运行进行覆盖分析从而得到执行覆盖并调查代码的哪些部分执行,哪些部分没有执行。51Testing软件测试网hei,P*ycj

51Testing软件测试网Dh:| U0d.h&b.RZ

  5、立刻修复失败测试51Testing软件测试网n.B FF(v&dYQL p:P

51Testing软件测试网%J~$g(ynO

  每个开发者都应该确保在签入后新的测试以及所有既有的测试都可以成功运行。51Testing软件测试网yP\$_ e.NN[

51Testing软件测试网*bP}OU+ev

  如果在日常测试执行中有一个测试失败了,整个团队必须停下手头的工作来保证问题得到解决。51Testing软件测试网H5}`3PDQ

d0s'i%k D^x0  6、保持测试在单体层

|h(Lh3?{:diA051Testing软件测试网0Eop-a sj3R oL

  单体测试和类的测试相关。每个普通类都要有一个测试类,类的行为应该在隔离的条件下测试。应该避免使用单体测试框架测试整个工作流程,因为这样的测试会很慢并很难维护。会有需要流程测试的地方,但不应该作为单体测试的一部分,它必须独立地设置和执行。

e#X fML9}0

~0b)?\&\'E1}z0  7、从简单开始

8TgJ3i)A0XE8bE ~051Testing软件测试网HWb5n:E%UfQ

  一个简单的测试要比根本没有测试好。一个简单的测试类可以建立起目标类的测试框架并可以验证编译环境、单体测试环境、执行环境和覆盖分析工具是否具备以及是否正确,从而可以证明目标类是否是程序集的一部分以及是否可以访问。51Testing软件测试网zD c3@M`

(xI!zxis7U W0  单体测试的入门程序可能像这样:

y&Y S"t+OQ0
void testDefaultConstruction()
y;v|W7_ GU0{
n$N%q7EE(AM4~ q0    Foo foo = new Foo();51Testing软件测试网GZ WCv*rR
    assertNotNull(foo);51Testing软件测试网;UP:\ R2e;Vu
}
51Testing软件测试网LV/o6G?`!ubYM

  8、保存测试相互独立

c5[g}'lD0

koT4A4~s P,{7`1t1]0  为了确保测试健壮并简化维护,测试不能依赖其它测试以及测试执行的先后顺序。

S;{X H~'T*Fe0

,|"wS Q'w9@J7u0  9、测试类和被测试类尽量近51Testing软件测试网a3[vK!s3~

51Testing软件测试网eR]5k:_c7TZ e;V

  如果被测试类是Foo,那么测试类就应该命名为FooTest(而不是TestFoo)并同Foo放在同一个包里面。将测试类放在单独的目录下会使其难于访问和维护。51Testing软件测试网L*W(b D:mbN#[ N6o

51Testing软件测试网[E7H$l&rj7F

  确保编译环境的配置可以使得测试类不会进入生产库或执行文件中。

6Gi}X0e7l`6\051Testing软件测试网0JC9u?-p)@

  10、合理命名测试

F tV q(J-KG0

9e{D"HqN I R e%{0  确保每个测试方法测试一个明显的类功能并据此命名测试方法。典型的命名规则是test[what],比如testSaveAs(), testAddListener(), testDeleteProperty()等。51Testing软件测试网 q@/Qq/opz u5x(n

igb'Q4|6{0  11、测试公开API51Testing软件测试网G*d)r9jl)TDj2LPZ

51Testing软件测试网9bw$C4Htw+q~

   单体测试被定义为通过公开API测试类。有些测试工具可以实现类的私有方法的测试,但由于这会使得测试太过繁琐并更难于维护因此需要避免。如果有一些类 的私有方法需要显示地进行测试,考虑将其重构成工具类的公开方法。要这样做就应该要改进总体设计,而不是仅仅为了帮助测试。51Testing软件测试网tzv)|(c9t

m5o"x mnz d0  12、以黑盒考虑

|5fM*`9POU0

"y;]uw*V g;z9I2R0  作为第三方的类使用者来测试该类是否满足需求。尝试着让它失效。

H{3E#vM/_0

:sH@_"b!]Ts0 13、以白盒测试考虑51Testing软件测试网%R lM } A,s ob

51Testing软件测试网K^M` J\ v1`r-|

  毕竟,开发者写测试的同时也写了被测试类,需要特别注意测试复杂逻辑。

0BU#RWCm({kZ0

%KW'ui7d;v%^%eX0  14、微不足道的类也要测试51Testing软件测试网+JY-U0h.Z,[p%P2Y

Km9l1y t@R:L ~0  有人会推荐测试所有主要的情况,而可以忽略诸如简单的类似setter和getter等微不足道方法。 然而,应该测试微不足道方法情况有几个原因:

%p#[g%ugX0

/fAG.s2\(P)A(s F]0  ● 很难定义微不足道。对不同的人可能有不同的含义。51Testing软件测试网]5jo&}-Za6l&Ce5x

51Testing软件测试网1r6~#[1a!T

  ● 从黑盒测试的角度看无法知道代码的哪部分是微不足道的。

M+SB'Rbpx051Testing软件测试网F&U8|b$U8X+I

  ● 由于拷贝-粘贴操作,微不足道的代码也可能包含错误。

h`(|*?'~,XW051Testing软件测试网"wl+s;e-vp

,LJ{#F]0
private double weight_;51Testing软件测试网 [;W+L8T2J,C&O3U
private double x_, y_;51Testing软件测试网G@@ H!RJD3{ S
public void setWeight(int weight)
dRW$~2a.}.V T J,G&U0{51Testing软件测试网V!Vlg~K
   weight = weight_;    // 错误51Testing软件测试网;NSC)nl6Q#Y$l!_o9t
}
Pk S;|8ART c'e\0public double getX()51Testing软件测试网 {w'jX2p D+k}
{
{ULd;JOqG0   return x_;51Testing软件测试网$@s%r }/[1Q
}51Testing软件测试网3@+Q1_S9E `$~-v
public double getY()
+IBm ]t??:mR0{51Testing软件测试网*`#C^d!oY Y
   return x_;    // 错误
}AiY:gX0}

4L,S1r%e5}p_%F*A0  建议就是测试所有代码,毕竟微不足道的代码很容易测试。51Testing软件测试网DFI ls { A

6MUn0b3?\)k1d&@:_0  15、首先关注执行覆盖率51Testing软件测试网~;t"iCatkJ"T

.z"n%g1tg5E#S$D:G2Ju0  执行覆盖不同于实际代码覆盖。一个测试的最初目标应该保证高的执行覆盖。这可以确保代码在某些参数下真正执行。有了这个,就可以去改善测试覆盖了。注意实际代码覆盖很难确定(通常都很接近0%)。51Testing软件测试网&^J W/x*N,f"E9i5A

DLO:{W0  考虑下面这个公开方法:

x1n/jA1G8\,Gn0

uJGhl'o)JlZ&o0

N I7^ v Q+w$H0
void setLength(double length);

:QNg[kK0  通过调用setLength(1.0) 你就可能得到100% 的执行覆盖率。为了达到真正100%的实际测试覆盖,必须使用所有可能的double值来调用该方法以确认它们的正确行为。这显然是不可能的。

5u"{ m ue)^;sz0

,f(IR"[d w2X!Y"_0  16、覆盖边界情况

.j} KIX;f0

5o W^Oe pQu0  确保覆盖参数边界的情况。对于数,测试负数、0、正数、最小、最大、NaN、无穷等情况。对于字符串,考虑空字符串、单个字母的字符串、非 ASCII的字符串、多字节的字符串等情况。对于集合,测试空集合、单个元素集合、第一个、最后一个等。对于日期,考虑1月1日、2月29日、12月31 日等。被测类会提示各个具体情况下的边界情况。由于这些都可能是错误的根源,因此要尽可能多地测试这些情况。

_9d)xJ@be7l[.te051Testing软件测试网X8^5vfeFdXB%C

  17、提供随机数生成器

L h1D5baf6{e0

m1O*C)sgj^#n&X0  在覆盖了边界情况后,进一步提高覆盖率的一个简单方法就是产生随机数以使得每次测试都可以使用不同的输入执行。

d[M;f1Ubs4I }1Q.e051Testing软件测试网m a-Z0ksBF)h!L;N

  为了实现这个目标,可以提供一个生成double、integer、 string和dates等类型随机数的实用类。生成器必须可以从各个类型的全范围内生成值。

?e9i#z#|0

]Z1T Xn{,@0  如果测试很快,可以考虑在一个循环内运行尽可能多的组合。下面的例子就是验证通过一次大端和一次小端转化是否可以得到原值。由于测试很快,每次可以根据不同的值执行100万次。51Testing软件测试网nC8ZI,D\5B

51Testing软件测试网UD }o_1C$G!e6b

51Testing软件测试网 W!R&d!H6j}

void testByteSwapper()
VPMpDe0{
9h\|1R8otH#N0    for (int i = 0; i < 1000000; i++)51Testing软件测试网5q%MV4]'OLMS'M:k(n
    {
2\u N6XTd$p,u+Xq'x,Uq0          double v0 = Random.getDouble();51Testing软件测试网.R#v.Y~"\ E(@
          double v1 = ByteSwapper.swap(v0);51Testing软件测试网m7p9eB j
          double v2 = ByteSwapper.swap(v1);51Testing软件测试网D1s['HX~
          assertEquals(v0, v2);
)ZS W+j7u WH0    }
i&}%{!Z C-d0}

TAG:

 

评分:0

我来说两句

Open Toolbar