编写综合的单元测试-1
上一篇 / 下一篇 2012-07-04 11:58:59 / 个人分类:杂谈
每个用例编写一到二个断言是单元测试最佳实践的常见内容.那些这么认为的是极少和只展示一个单元测试的人。因此如果你采纳他们的建议,为一个很小的运算你都需要大量的单元测试去保证质量。这篇文章意图通过例子展示,一个测试用例多个断言是有必要和有价值的。51Testing软件测试网B(A8s GX.bpB
h.f#|_0A!g.N-gVm0{
BJ _ _`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软件测试网tgk?1_*k;W9Zq
}51Testing软件测试网^1`XX;j]D.i
.c's%vD OT5xDj0[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软件测试网+dY3XW R#u9q'k(U#R
}
g"xh}h.bp \051Testing软件测试网'XU|o#GT
Person这个对象在数据绑定场景中经常出现,我们来看下。51Testing软件测试网wB5^ qF
@4fW9YB.\B0测试FirstName
$Hay0G W;VC+r0第一个来测试FirstName这个属性的设置,开始如下:51Testing软件测试网9JJYt5q_@3?O:CRt
[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); uv a0x0UUy(Ip0} |
接下来我们来测试FirstName的改变通知。
JJ`6K:\W!Iu0[TestMethod]51Testing软件测试网'WTQ#T2L/h0D public voidPerson_FirstName_Set_PropertyChanged() Am9@^*LT3n: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-gtK8x*@!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软件测试网vDi4v$Q-A"| } |
鉴于以上两个测试,我们考虑当FirstName被修改时还有其他什么属性会改变。查看API,IsChanged和FullName属性会变化。51Testing软件测试网3e)F G%w3FY5p N!s
[TestMethod]51Testing软件测试网)j'Uh8y"Q$S
public voidPerson_FullName_Changed_By_Setting_FirstName()h.f#|_0A!g.N-gVm0{
BJ _ _`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软件测试网tgk?1_*k;W9Zq
}51Testing软件测试网^1`XX;j]D.i
.c's%vD OT5xDj0[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软件测试网+dY3XW R#u9q'k(U#R
}
g"xh}h.bp \051Testing软件测试网'XU|o#GT
当然,如果这些属性改变了,我们需要获取到属性改变通知:51Testing软件测试网"f*J(Vl1GB&G/^
51Testing软件测试网 P)Aft ?!X[TestMethod]
:e5^;Q3ND&R)XT5sD051Testing软件测试网L*x u ER+T*]Yr }/}o9\2N ~0public voidPerson_IsChanged_Property_Change_Notification_By_Setting_FirstName() kw7c&v[&CM0{ |