编写综合的单元测试-1

上一篇 / 下一篇  2012-07-04 11:58:59 / 个人分类:杂谈

 每个用例编写一到二个断言是单元测试最佳实践的常见内容.那些这么认为的是极少和只展示一个单元测试的人。因此如果你采纳他们的建议,为一个很小的运算你都需要大量的单元测试去保证质量。这篇文章意图通过例子展示,一个测试用例多个断言是有必要和有价值的。51Testing软件测试网B(A8sGX.bpB

  Person这个对象在数据绑定场景中经常出现,我们来看下。51Testing软件测试网wB5^ qF

@4fW9YB.\ B0

  测试FirstName

$Hay0GW;VC+r0

  第一个来测试FirstName这个属性的设置,开始如下:51Testing软件测试网9JJYt5q_@3?O:CR t

[TestMethod]51Testing软件测试网{;d)?,dM.qGNn6s
public voidPerson_FirstName_Set()
fxKCuY7gwu0{51Testing软件测试网J2k$QT+MIJs
      varperson =newPerson("Adam","Smith");
xI4U5L!M#~!W0      person.FirstName ="Bob";51Testing软件测试网)l[3T1fsT| }
      Assert.AreEqual("Bob", person.FirstName);
uva0x0UUy(Ip0}

  接下来我们来测试FirstName的改变通知。

JJ`6K:\W!Iu0
[TestMethod]51Testing软件测试网'WTQ#T2L/h0D
public voidPerson_FirstName_Set_PropertyChanged()
Am9@^*L T3n:i/o0{51Testing软件测试网L{6T3`$R8K:bX
      varperson =newPerson("Adam","Smith");51Testing软件测试网)N&DM^i)G/d#x
      vareventAssert =newGranite.Testing.PropertyChangedEventAssert(person);51Testing软件测试网~R1^i_U;P
      person.FirstName ="Bob";
]Q:{'zP9H#~0zZ0      eventAssert.Expect("FirstName");51Testing软件测试网 a*hd}'S
}

  当我们执行这个测试时,会得到一个失败提示信息“期望的属性名‘FirstName’,但接收到的是’IsChanged’”。显然,设置FirstName的属性触发了“IsChanged”标记,我们需要把它考虑在内。因此我们把它加入:51Testing软件测试网QY zX;i

[TestMethod]
,z@u%u'{Z?0public voidPerson_FirstName_Set_PropertyChanged()51Testing软件测试网FR6W8S\)S]V)z
{51Testing软件测试网f,j-g tK8x*@!uc
      varperson =newPerson("Adam","Smith");51Testing软件测试网C1d O*md!D|_q
      vareventAssert =newGranite.Testing.PropertyChangedEventAssert(person);
8^Enx | L7y&B C0      person.FirstName ="Bob";51Testing软件测试网X%?|z:C%t,bi
      eventAssert.SkipEvent();//this was IsChanged
LtM"l+V@8I/JD4h pY0      eventAssert.Expect("FirstName");51Testing软件测试网vD i4v$Q-A"|
}

  鉴于以上两个测试,我们考虑当FirstName被修改时还有其他什么属性会改变。查看API,IsChanged和FullName属性会变化。51Testing软件测试网3e)FG%w3FY5p N!s

  [TestMethod]51Testing软件测试网)j'Uh8y"Q$S

public voidPerson_FullName_Changed_By_Setting_FirstName()
h.f#|_0A!g.N-gVm0{
B J __`e@^5q/f*u0      varperson =newPerson("Adam","Smith");
H:o[S7UdOot0      person.FirstName ="Bob";
HxS4i&~7Q[4AI#Q a'z0      Assert.AreEqual("Bob Smith", person.FullName);51Testing软件测试网t gk?1_*k;W9Zq
}51Testing软件测试网^1`XX;j]D.i

.c's%vDOT5xDj0[TestMethod]51Testing软件测试网j[p7s ?
public voidPerson_IsChanged_Changed_By_Setting_FirstName() {       varperson =newPerson("Adam","Smith");51Testing软件测试网V2p9y!Tz7w&E
      person.FirstName ="Bob";51Testing软件测试网 [1ll t Lbh
      Assert.IsTrue(person.IsChanged);51Testing软件测试网+dY3XWR#u9q'k(U#R
}
g"xh}h.b p \051Testing软件测试网'XU|o#G T

  当然,如果这些属性改变了,我们需要获取到属性改变通知:51Testing软件测试网"f*J(Vl1GB&G/^

51Testing软件测试网 P)Aft ?!X

  [TestMethod]

:e5^;Q3ND&R)XT5sD051Testing软件测试网L*x u ER+T*]

Yr }/}o9\2N ~0
public voidPerson_IsChanged_Property_Change_Notification_By_Setting_FirstName()
k w7c&v [&C M0{
J k [ x(|']9V:z0      varperson =newPerson("Adam","Smith");
LSuRF)vPy0      vareventAssert =newPropertyChangedEventAssert(person);51Testing软件测试网.C#bJ0lF:y
      person.FirstName ="Bob";51Testing软件测试网0H8t z t Ar{N v
      eventAssert.Expect("IsChanged");51Testing软件测试网%Ia1S2ieJx
}51Testing软件测试网Jv*c2g%Q@$b
[TestMethod]51Testing软件测试网 AdH V;B4YT tWa
public voidPerson_FullName_Property_Change_Notification_By_Setting_FirstName()51Testing软件测试网8R+c {n9y
{51Testing软件测试网n L0XGl9_5h
      varperson =newPerson("Adam","Smith");
w }Q(N#DX9k4f!kO0      vareventAssert =newPropertyChangedEventAssert(person);51Testing软件测试网9J_+s};N q'm1n
      person.FirstName ="Bob";51Testing软件测试网$~.W9z.F~G
      eventAssert.SkipEvent();//this was IsChanged
D,H1t8d"[Q0      eventAssert.SkipEvent();//this was FirstName51Testing软件测试网&f5lTQe5z
      eventAssert.Expect("FullName");
w!O3y:a$[0}
bH` ?{!^ w0

HE H!j"d|S^O+R0  接下来两个测试针对HasErrors这个属性和ErrorsChanged事件。

4O~F|l5\O5`051Testing软件测试网@7ReA5{Y@ rTN8{

  [TestMethod]51Testing软件测试网 a+vy)D A"y;a

NYyP0@6wk`0

?;N W$R#|z\0
public voidPerson_FirstName_Set_HasErrorsIsFalse()51Testing软件测试网:@W:nagUd.u
{
a+QR6F8`d0          varperson =newPerson("Adam","Smith");51Testing软件测试网:m C ] H,AQK2yV
          person.FirstName ="Bob";51Testing软件测试网lXW2[7E {p
          Assert.IsFalse(person.HasErrors);51Testing软件测试网HB\L"U-x[#K
}
3_3gSzUCU0[TestMethod]
H:S#U,N!c0public voidPerson_FirstName_Set_ErrorsChanged_Did_Not_Fire()51Testing软件测试网M.`J1~Y&Aposm_;q7I
{51Testing软件测试网[y xv9Z"G5[b \%N
          varperson =newPerson("Adam","Smith");
$K$| cC ]E?'L0          varerrorsChangedAssert =newErrorsChangedEventAssert(person);
k;cH1p(P0          person.FirstName ="Bob";
HZ#R~id'Hi0          errorsChangedAssert.ExpectNothing();51Testing软件测试网Z B*g(Q da/r,W
}

jlj8l(~6_4ciA#L0  目前我们有8个测试了,这意味着当我们修改FirstName的属性值,我们要考虑会发生改变的每件事。但是这不算完。我们还需要确保没有别的 会被意外改变。理论上说,这意味着更多的断言和相当数量的测试,但是,接下来我们采用取巧的方法,用ChangeAssert方法来替代 HasErrors测试。51Testing软件测试网@R2h8^)SA1gD N%i

51Testing软件测试网hLD1L1fo5z'e7W@

  [TestMethod]51Testing软件测试网-C^(V;YZH

51Testing软件测试网gWN@[I

51Testing软件测试网;v1O7I%S/wU

public voidPerson_FirstName_Set_Nothing_Unexpected_Changed()
BT-a&? ^1K2|o l0{51Testing软件测试网8NH$QN-{*IR
     varperson =newPerson("Adam","Smith");51Testing软件测试网K]-J0H8\/R XA
     varchangeAssert =newChangeAssert(person);51Testing软件测试网4@ U%Tc6Y8@}?1p
     person.FirstName ="Bob";51Testing软件测试网`#Hv2h.g%l!Is
     changeAssert.AssertOnlyChangesAre("FirstName","FullName","IsChanged");
-S L INz+|v0}
51Testing软件测试网v:z3b^4c

  ChangeAssert简单地通过映射获取对象的状态,因此,稍后你可以断言到除了你指出的几个具体属性其他的没变。

,^NZ8c/AVL051Testing软件测试网;wz7H*Vw d'b

  恭喜,你完成了你的第一个测试用例。完成一个,还有很多很多等着。

Gk0bQs8u0

+u\AuCJ0  为什么说是“一个”测试用例?

(F$e,a8I8Wd0

l&HI%x;v.j[L!HG0  那8个测试只是完成了覆盖FirstName属性从“Adam”修改成“Bob”这一个场景,在其他的值没有在错误状态、LastName不为null或空的情况下。让我们看看测试用例的完整清单:51Testing软件测试网5^`yZw-Z)y+^V

51Testing软件测试网I#GA3fCP3Z

  1、将FirstName值设置为“Adam”

Z7O`&u{4ir.}V0

f`d4uaL0Xj+Q0  2、将FirstName值设置为null51Testing软件测试网 _[-Q$ADCI?N

51Testing软件测试网z E3Ymha

  3、将FirstName 设为空串

k Y*H|JR kF0X051Testing软件测试网 W#e OV:y m-o l

  4、在LastName值为null的情况下,执行case1-3

FI0Y6R*T;A3Oe0

t"w9Q2tmY0  5、在LastName 为空串的情况下,执行case1-3

#xtobG;j[#A0

!Jh7iz:Y0  6、在FirstName值以null开头的情况下,执行case1-551Testing软件测试网~uP;\Cl

T!j].f7jL&y*u0  7、在FirstName值以空串开头的情况下,执行case1-5

0?Y RJe'c%h051Testing软件测试网^K~!yP:|}8D eu

  目前我们看到了27个不同的场景。如果每个场景需要8个不同测试,仅仅为这一个属性,我们需要执行至多216个测试。根据这种思路,这是相当琐碎的一段代码。因此我们该怎么做呢?

8f })d? F:b!ZjfHh051Testing软件测试网X[:Kb-z*`M7^ Xn+[|@

51Testing软件测试网$XK%[]1a.N

V(k9`:Y U6Qt6@0
r4nN i |0

TAG:

 

评分:0

我来说两句

Open Toolbar