不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。                                           it is no use doing what you like, you have got to like what you do.

Visual Studio 2005 进行单元测试

上一篇 / 下一篇  2006-12-11 17:34:48 / 天气: 晴朗 / 心情: 高兴 / 精华(3) / 置顶(3) / 个人分类:软件测试技术

每日随笔
  • 每日随笔:今天开始学习如何使用VS进行单元测试,Fighting!!!!!!!!

&Lv lH&B051Testing软件测试网h,kkAM Z!t)Tp
    
2A O5tl]/n8wd"U0简介51Testing软件测试网ANM*r3K$e)Z
51Testing软件测试网-t;JJ;E:|
随着业务的革新和发展,运行它们的系统也需要进行更新。随业务的发展、革新以及与合作伙伴、客户和供应商的结合,这些系统将在复杂性方面持续扩增。
Dil3N&zI7D051Testing软件测试网8vOh+X,`"i h'~
这种复杂性迫使 IT 的领导者们在开发过程中(即,在实现之前)确保质量。有一种方法可使开发人员减少进入 QA 环节的故障数量,即,针对自定义代码严格执行自动化单元测试。在开发过程中强制使用自动化单元测试可为团队成员提供有关如何使用自定义代码的示例(这些示例易于使用并自行记录)。
!l&Q8H[ K5?051Testing软件测试网3] ph$aL { @k
使用结构化、自动化单元测试面临的挑战之一是完成这些任务所需的代码总数。(测试代码需要使用大量代码!)代码生成的概念(简单定义为“创建软件的软件”)正随着时间的快速推移而逐渐深入到团队 IT 开发之中。有些人认为代码生成有助于缩短“推向市场”策略的时间,强制内部标准/协定,并促进开发过程。
(p)S{5t1MX zV*{ K0
4W Lsj} s d0Microsoft 认识到这一需要后提供了一个功能丰富、带有下一代开发平台 Visual Studio 2005 Team System (VSTS) 的代码生成引擎。本文提供针对单元测试代码生成的循序渐进的指导,并深入探讨如何在用例中使用。51Testing软件测试网%F.m&p![}J/s6[o
 
3Nw2^ ZaN0重新思考单元测试
R2^ vs)hC0
{g"U9G1q)l']0请考虑以下情况:您负责为公司生成下一代系统,同时您是较大的开发团队中的一员。您是 UI 开发人员,负责尽可能多地创建 Microsoft ASP.NET/Microsoft WinForms。您依赖“中间层”团队完成其中间层组件 — 这些组件用于执行数据库 CRUD (Create-Retrieve-Update-Delete) 以及与该系统中每个实体相关的业务规则。
j3b:E p/G6n,FtC0
R/`&Pe@kU.t0经过几周的 UI 开发,您完成了窗体并且收到了中间层开发人员打算向您提交其类库的消息。下面提供一段对话示例,说明我们大多数人在开发过程中都会遇到的一些事情。
w F y#{b U0UI 开发人员和中间层开发人员间的示例对话
P*B7C1|O ?^0
+?5J)^7lr d.gQ0中间层:51Testing软件测试网4t2W,D5C%j"OA?
   51Testing软件测试网 w-|re%eB
51Testing软件测试网5{oo:_;L4x
“这些对象随时供您使用 — 为此,只需获取 OurSystemBL.dll 的最新版本。”51Testing软件测试网]1U+`"T*RJ
51Testing软件测试网p$YnY;in&\@[+_
UI:
dA Z w;V$|f0   51Testing软件测试网"zz d^om W0P
51Testing软件测试网q%KkCOjPU M._V6}
“谢谢。您有供我们查看文档吗?”51Testing软件测试网0tsFeH.X\

Y^'}"h*RYqu0中间层:51Testing软件测试网,}3NKpG
   
F5g2JB-?#lwXM051Testing软件测试网 gG&q,NO/rg%eJ
“哈哈!是的,当然有!我们花了很多时间编写它!请查看 Design Document — 噢,请等一等,它还没有完成……(不久之后即可完成!)”51Testing软件测试网!mxrc8F.r\'Tnx

-^D1B6m1f+C,{0UI:
i GM"JU-K(y+l0   
/BTr }7gR^]*ET051Testing软件测试网Y/_ sNlw"a
“您使用 XML 文档了吗?”51Testing软件测试网 _,y;U!B-dxhPe]h
51Testing软件测试网0kl @I1nD
中间层:
-{,s-jE~"Q0   
"W;ZK ou051Testing软件测试网J8\r8IQ@h
“在构造函数中,但许多方法都不使用。”51Testing软件测试网])b:U W#A

` F dW;O ^Q0UI:
uv;I s+Ip f(Q2}h0   51Testing软件测试网3M:Q:{ T@\d
51Testing软件测试网C&ZZSjo9M:W_
“显示如何创建、执行并删除对象的示例代码,怎么样?”51Testing软件测试网&o`~:DY
51Testing软件测试网4P#Xr;l-_/knO V1a:m:W
中间层:51Testing软件测试网G c7N4g2|0[.|
   51Testing软件测试网A] `%@1\ Wi7M(V y

HJ]#h P'@ p0“我已经附加了一个示例 WinForms 应用程序(从我的工作区),它应该能够提供一些您所需的内容……,虽然它不在 Microsoft Visual SourceSafe 中。”51Testing软件测试网#`Q c*W3t8`!y
51Testing软件测试网3N]#M+E)V}n b
在考虑如何进行这样有趣的 项目之后,您打定了主意,决定检验中间层的单元测试套件。在深入钻研该代码之后,您注意到该窗体有两个未标记的文本框,以及三个标记为 button1、button2 和 button3 的按钮(幸运的话,它们将排列在窗体上)。接下来,在查看与这些按钮相关的事件之后,您认识到这些代码都未经注释,并且数据变量都被命名为 x、y、z。如果幸运,您还会注意到 button1 和 button2 执行该对象的 Save() 方法,而 button3 执行 Delete() 方法。执行时,您会接收到很多 System.Exception 错误,这是因为遗漏了很多配置设置。
I3WA)V1M.T1G#Jb!t]051Testing软件测试网W(~X4F2_y@#Y.}+_|
这显然是一个特例,我希望多数开发团队不要进行这一试验,下面让我们看一下该方案中“单元测试”遇到的问题:51Testing软件测试网m)vg5r)r(vb
•    51Testing软件测试网5Gaj,x0[Db`;k

g _5_Q T0这种形式的单元测试代码不是结构化的:代码充斥到按钮单击事件中并且难以编译。
E2[!?z(he6]q0•    51Testing软件测试网L)sf(~ nFU.[ ]
51Testing软件测试网!F|3B@:c7e2Q
这种形式的单元测试代码记录得不太好。51Testing软件测试网 Q+d p\G"wf^n
•    
4YYD!]g;J0
Y l8\3bQTV6o0这种形式的单元测试并不基于“已知”为好或坏的数据 — 它完全依赖于输入到那些未标记的文本框的内容。51Testing软件测试网j0aR y L
•    51Testing软件测试网 sj6T!Ll H#c
51Testing软件测试网;?5e4p0S4j_"~6ZL(Q0x7x
单元测试代码不能自动重复,它基于输入的代码。
rdP _2_6X%|eC0•    
B$~gMEvM)Cu0
F Qu9B G;~0单元测试代码覆盖是未知的 — 用数据指示实际测试的代码量。
~,K$N(t2n Yln~0•    51Testing软件测试网 |:OL8y$P stWzE

TT4P/F8HB0实现的详细信息不易于在团队成员间进行传播。51Testing软件测试网D/dF-Cmx
 51Testing软件测试网6B#`[%{#~(i(eR
输入自动化单元测试51Testing软件测试网$TW8hE/j E_ R

g Y q#@jm)Y qL H0xUnit 框架在 1998 年作为 eXtreme 编程的核心概念引入。它提出了一个有效的机制,有助于开发人员将结构化、有效且自动的单元测试添加常规开发活动中。从那以后,该框架演化为针对自动化单元测试框架的实际标准。51Testing软件测试网JY-x!j&\'b
创建自动化单元测试的用例
D+}{tf)p051Testing软件测试网}A1^#|3zo xy$W}
简单说,自动化单元测试是:
T7Q!K.UqR0•    
sV,b X!V@5m0
Y;D}LzAd IY0结构化的。
:F:hF s&]}0•    
(A q4r,x?lN2h:q@%b0
0MJ6s1W x0w7d+J0自行记录的。51Testing软件测试网-CO$XvK+p c
•    51Testing软件测试网c^~n5K@7y&XP

!{\y }fH;l0自动且可重复的。
%CuLN!y7^-@v0•    
R!RvZ3iR m:z0
!pm,k0Xhz*C`oR0基于已知数据。51Testing软件测试网2F;e'J:su
•    
'RMtgG-Y(uN0
Wa6Bo S"oY |t0旨在测试积极和消极操作。
1C L6o-T6KzY b0•    
)@#Rb;`1^o051Testing软件测试网)Hb5yW a!](g
非常适合跨不同计算机的测试实现。51Testing软件测试网 cQ y.vi/|_"rw u
•    
\*C4}CX051Testing软件测试网+} y vE0CZ(Q1a
配置、实现和执行的示例。51Testing软件测试网:og D/F%z x
xUnit 框架元素51Testing软件测试网wz9m"V'D*?K pI

$["D9bXz9h3b0表 2 分析 xUnit 框架以及对应于 Visual Studio 2005 Team System 的 Unit Testing Framework 等价物的基本概念。
g@A/O!]6U0表 2. 相应的 xUnit 框架和 VSTS Unit Testing Framework 概念
6Pd,h Q;j0Nq.]0xUnit 框架概念     VS 2005 等价物(参见下面的属性)     描述51Testing软件测试网Y7` g W V(@Z
51Testing软件测试网8G"Q{+]e
测试51Testing软件测试网8V+}T_/A8G
   51Testing软件测试网an7z5ho$L"[%g%gUG
51Testing软件测试网v+\([.Px\O(A4fd
TestMethod51Testing软件测试网/kf SlH'r ZQ4j U
   51Testing软件测试网%UPG*Z0P1`~HZ

/T2zO ?*u0简单说,这些是您的测试。测试预期结果的逻辑,并报告未取得结果(如果有)。请将它看作您的“方法”。51Testing软件测试网 s?;S`%Y K Zfxn#B

zfLQ0\4QDv}0测试装置51Testing软件测试网 W L0\8UO!A@9`
   51Testing软件测试网a+p*_%}IxL"H8r
51Testing软件测试网B4Uxz8I7s
TestClass51Testing软件测试网)uU?] L c)t,}1Y1Q
   
v5[g\&S4Q`0
bZH:QX1?y0针对大量测试的一个逻辑分组。请将它看作您的“类”。
J#EM*wLGN051Testing软件测试网w/man,aF3S
测试套件51Testing软件测试网.f3?6VTY*J&v u
   
*g*M:f1~YP.if{:F$H051Testing软件测试网Ly!R!AC
测试列表 **51Testing软件测试网ch%m-x['w
   
V?r+Z'yP/i051Testing软件测试网 cvO(b{g(Br
针对大量测试装置的一个逻辑分组。请将它看作您的“类库”。51Testing软件测试网+@-QSl;? @B0^s
51Testing软件测试网8RY m v?#rE2I4[^$Tu7?
注不需要一个属性。51Testing软件测试网F T3ZhQ)h b!_

M0F!\NK Z0测试运行器51Testing软件测试网[,w&a)C,B(Ge"{ E
   51Testing软件测试网+CbuEtW1b/Gm Q

:B'c@Qy,Ia0VS 2005 VSTS Unit Testing Framework51Testing软件测试网s*Lb1k5D&H C.D
   
1`6w Gt?/xu0
NW%f;F?k)V*AR3v0GUI/Console 应用程序负责发现、执行和报告测试结果。Visual Studio 2005 Team System 将作为本文的测试运行器。
#p.u `{sa0测试装置示例51Testing软件测试网;B0_x2mg$r0V"aP-i
51Testing软件测试网5Fc,?:Zx\W.|^9mR
请考虑以下针对 BankAccount 类的类关系图,以及一个示例测试装置 (BankAccountTests.cs)。
X|9pU&ZB]/l051Testing软件测试网/E,|+x v ^] O,i
图 1. BankAccount 类
nv;sp!w0示例测试装置: BankAccountTests.cs51Testing软件测试网3g8no&I\S"Q
51Testing软件测试网#i+TS]Op r
using BankAccountDemo.Business;
1QD(oG,Fc[ Yb0using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework;
*l3{ v[q {1Z0namespace BankAccountDemo.Business.Tests
!`1t\"Y L0{51Testing软件测试网Oj*_i1[!r&oD
    [TestClass()]
/JL;?#SD'S0    public class BankAccountTest51Testing软件测试网zWN'}%Zt
    {51Testing软件测试网;`vk2~"E1}'I
        [TestInitialize()]
/]?iTJkN(w h!X0        public void Initialize()    {
tK"X"o,gRj4h0        }51Testing软件测试网+Fq;GI%`:b7`&x'z
        [TestCleanup()]
5SWV-h8b@0        public void Cleanup()   {51Testing软件测试网C R!^"EW*cJ4a
        }
%K*L6\%T%x3i.j8Z3e\0        [TestMethod()]51Testing软件测试网0_onG%m
        public void ConstructorTest()   {
;n`nE%}Z^#R2T0            float currentBalance = 500;
[ R$`j(z |V3S!G5kn0            BankAccount target = new BankAccount(currentBalance);
jK"mw&lWJw n#u'{0            Assert.AreEqual(currentBalance, target.CurrentBalance,51Testing软件测试网1U7X0p ?k
                "Balances are not equal upon creation");51Testing软件测试网(P4S4OGtX6tHi
        }51Testing软件测试网"hhYAo
        [TestMethod()]51Testing软件测试网!HG%v3q*W'DR9P6o%Wj
        public void DepositMoneyTest()  {51Testing软件测试网X%|m ew!] A/t]
            float currentBalance = 500;51Testing软件测试网!^dp/?,pGQa
            BankAccount target = new BankAccount(currentBalance);
#}9TDJ5K7fJ7a0            float depositAmount = 10;
c,lB*K*t8]g.f&`7`O0            target.DepositMoney(depositAmount);51Testing软件测试网1K ` X6Fq M!n/?5l5g:@
            Assert.IsTrue( (currentBalance + depositAmount) > 
c'W {A-`0                            target.CurrentBalance,
Hn5u7V'q T%u-k8w9e0               "Deposit not applied correctly");51Testing软件测试网t"HIR?;r3Y#Lpd y
        }51Testing软件测试网u%jX\V-w;Q
        [TestMethod()]51Testing软件测试网q4Py6|9z4w"u
        public void MakePaymentTest()   {
2a n!`xz9` c^tB0            float currentBalance = 500;51Testing软件测试网`W,g7]Ka
            BankAccount target = new BankAccount(currentBalance);51Testing软件测试网'K%tVRgQ |)c
            float paymentAmount = 250;
BWt@ x&w7O5T0            target.MakePayment(paymentAmount);51Testing软件测试网8Y-l1{ lf
            Assert.IsTrue(currentBalance - paymentAmount ==
8FxD1aH}G8z!i x0              target.CurrentBalance,
Cy/@%os,B0                "Payment not applied correctly");
4{/KNqU4io0        }
+yf6E%y}/]0    }51Testing软件测试网GO.[qMJ
}
.b1NR|Rx9_+c0
bF:teq1z.U0主单元测试概念 == 断言51Testing软件测试网7iO1WWF Z
51Testing软件测试网*T:d|7]|-F*b
用于该形式单元测试的主要概念是,自动化单元测试是基于“断言”的,即可定义为“事实或您相信为事实的内容”。从逻辑角度看,请考虑该语句“when I do {x}, I expect {y} as a result”。51Testing软件测试网(KO^ wLXf1c5b

^{ f+w?@%Z!e'W0这可以轻松地翻译为代码,方法是使用 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中可用的三个“断言”类中的任一个:Assert、StringAssert 和 CollectionAssert。主类 Assert 提供用于测试基础条件语句的断言。StringAssert 类自定义了在使用字符串变量时有用的断言。同样,CollectionAssert 类包括在使用对象集合时有用的断言方法。51Testing软件测试网2W"qmU|7H~w

e` H}L(a0表 3 显示可用于当前版本 Unit Testing Framework 的断言。51Testing软件测试网F l*d i'P1D
表 3. VSTS Unit Testing Framework 断言
/d|]hX,deX0断言类     StringAssert 类     CollectionAssert 类51Testing软件测试网4Bi,E/D*{y(J
51Testing软件测试网 [Dm.F NVv/F
AreEqual()51Testing软件测试网N1|il9j
AreNotEqual()51Testing软件测试网,]%g Uk2l
AreNotSame()51Testing软件测试网!Y)J/N)g#M+](C(A
AreSame()51Testing软件测试网Su"U4w(W
EqualsTests()51Testing软件测试网%p)w6m3h'c4{
Fail()
$@qkRG~7ak5b0GetHashCodeTests()51Testing软件测试网2E"r b EQ1q FGU w"a
Inconclusive()
#BUm J0JnS!V`$[0IsFalse()51Testing软件测试网%@)D"@%e8m]'C Cww
IsInstanceOfType()51Testing软件测试网QnWW NZP |N#H
IsNotInstanceOfType()51Testing软件测试网 av HaC,Wb.B
IsNotNull()51Testing软件测试网Ye-Fxo*F+z
IsNull()51Testing软件测试网k'y n9u;n1c'[9@
IsTrue()
CC?!R3DL(U e ?0
o}*EG+r2K@/fh0   51Testing软件测试网8}9MCdghE#{
51Testing软件测试网/bM'myA
Contains()51Testing软件测试网 gnMhY4Eu
DoesNotMatch()
/fu-~t"P6Afv.X0EndsWith()
n9Q9_7u4E:hm]~*y0Matches()
0bPPv)r3z)K0StartsWith()
g[1i6{9uR051Testing软件测试网Krk#]{
   
~N k_&f&wgc051Testing软件测试网+o1p,L5[~2cZ
AllItemsAreInstancesOfType()51Testing软件测试网)Db;@ FBp9p%LEP$A
AllItemsAreNotNull()
v dM#~@r0AllItemsAreUnique()51Testing软件测试网 @ y7A2u e#@p?6XB5U.r
AreEqual()
V(p~1t,_Q!Lk%] {0AreEquivalent()
._7E.h5IH0AreNotEqual()51Testing软件测试网#~ ?%ac4N8? U e)I-J
AreNotEquivalent()
x!X(bJbC'}5|2T1B0Contains()
Kc$Cb-b0DoesNotContain()
+f$\q'f:Q`0IsNotSubsetOf()51Testing软件测试网y*pf0k!gX9_t
IsSubsetOf()51Testing软件测试网?3D+Di ]y0v
51Testing软件测试网+oL?u K:j T&R%D
这些自动化单元测试用什么运行?51Testing软件测试网^0S |\M7HK#V6d
51Testing软件测试网Iz {+s9bT d|M_
正如前面提到的,xUnit 框架将“测试运行器”的概念定义为应用程序负责:(a) 执行单元测试;(b) 报告测试结果。对于本文,包含 Visual Studio 2005 Team System (VSTS) 的 Unit Testing 引擎作为我们的“测试运行器”。图 2 表示 BankAccountTests.cs 类的执行结果。51Testing软件测试网@8A[%f*~%^'y

$cG` PNnT0g0图 2. 测试结果窗格:单元测试执行结果
a7R{ u,m|$t051Testing软件测试网Sk1yD|w5u
Microsoft Visual Studio 2005 使用源项目的代码模型动态填充该视图。它基于该源代码中的自定义属性动态发现有关该测试套件的信息。表 4 表示最常见的单元测试属性(以及执行的次序)。
1[ ~ bM b6Kd9ZL$k0表 4. 常见单元测试属性
}}1FB)WT0属性     描述51Testing软件测试网 G O$^%i7@H&f

SH X"}7Q+k u;W`0TestClass()51Testing软件测试网X iB"vR.H*[o
   
+{nqv2U8p,jF!D0
uL[9hM+?0该属性表示一个测试装置。51Testing软件测试网 {U.@,u@5WVB

#Gabe3r;i0TestMethod()
lvpxgME%A6E0   
9^K8d!D\;AO051Testing软件测试网sS[B,e;JR
该属性表示一个测试用例。
/p3cQw0x;iTC051Testing软件测试网%|@?'VoJ s+} B
AssemblyInitialize()
!e2e4Bx:h.y8u1a0   
KU;S{,TE.A#T]$t6P051Testing软件测试网_c.@az
在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之前,执行带有该属性的方法。
Wb8i aO0
zNU%c3q5T0pV0ClassInitialize()
|%R:b0f2oSAf Z0   
4p?(O`v2G n051Testing软件测试网W?t4xs)H
带有该属性的方法在执行第一个测试之前调用。51Testing软件测试网0DF;| FVm

C}y#@ M1T0TestInitialize()
7V%u,r:Q n0   51Testing软件测试网d,o?URY
51Testing软件测试网w,M)RG:[
带有该属性的方法在执行每个 TestMethod() 之前调用。51Testing软件测试网x#Idp0l

(D:Z-_'c\ kM'}(t0TestCleanup()
(\kX4JZ/F"\0   
2MB"Q WT3x051Testing软件测试网~v DT p6xp;s
带有该属性的方法在执行每个 TestMethod() 之后调用。51Testing软件测试网&I ~*P7N`/m

4W#?bh(h| t0GD0Lq0ClassCleanup()51Testing软件测试网_To"l[rJ
   51Testing软件测试网BP#Z8HJj(x;Ye

Yr"]"@;W4a _9V0带有该属性的方法在执行 ALL 测试之后调用。
Q } a]d!W1by0
I\xg J7O5L&g|+b0AssemblyCleanup()51Testing软件测试网0D%vc y$M/S8Z-Ju,d
   51Testing软件测试网3ZdA6H7Z'V:uJ
51Testing软件测试网)Ij7B_$iE$p N
在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之后,执行带有该属性的方法。
6cT(e |p`_ U0
n ob t:Sy`)h0Descrīption()51Testing软件测试网!E.r$xtd6@G1LQ
   
}O}F-t0lq:iE051Testing软件测试网LWV1|BDD
提供关于给定 TestMethod() 的描述。51Testing软件测试网dS^E7E$i'q

0]#H4}+B!yBQ0Ignore()
2Lf x.E1yH%_0   
Q.|!V-e8uE-Y051Testing软件测试网4O^g;dd5K[{:J+U
由于某种原因忽略 TestMethod() 或 TestClass()。
fR/q4u#A.tR k0
@{[%AV1\3X7X0ExpectedException()51Testing软件测试网0Fu MfMV:Xf g;ur
   
HH^1F4k4hxdgO0
bNv P.OCl3pt0当测试特定异常时,如果使用该属性指定的异常不是从实现代码引发,则测试不会失败。51Testing软件测试网5["HuIu$v9C2[
我编写什么类型的测试?
#IRC @ M!|0@0
.Pb rQ1n~6G%l'^)?0一个方法及其相关测试之间很难有一对一关系。编写自动化单元测试需要开发人员“进行全面思考”,并了解关于对象的所有内容 — 它将如何消耗、使用、处理,以及在任何情况下如何起到积极、消极、非决定性作用。
0q9O+aC1m"X&E Z*Wb051Testing软件测试网eA ENt{{@z8D
例如,请考虑一个用于针对数据库中 Customer 项执行 CRUD(创建、检索、更新、删除)功能的典型对象方法。对于该对象的 Load() 方法,要针对以下方案编写测试:
ih x|OWAZ-O;_0•    
2m1d"J2Q2g{0
u1]Zs&jc2M6_0构造函数测试 — 确保对象正确加载,带有正确的信息。
W[NX1C&U3O7Y2?B B0•    
tF0hxUBshN P(T051Testing软件测试网sh"n@ w9w7T
PositiveLoadScalarTest — 测试数据库中一个 Customer 的成功加载。51Testing软件测试网9`yv9E_*r6[/t4OZ#i
•    
'E-SP(RlRh]051Testing软件测试网KQ E:Q3x$})Vo w
NegativeLoadScalarTest — 测试一个 Customer 的失败加载,即该 Customer 不在数据库中。51Testing软件测试网2G#rH]V6D+a
•    51Testing软件测试网}A l#tKlE
51Testing软件测试网w/j Qe}
PositiveLoadTest — 基于已知数据测试 Customer 的成功加载。
kg!Kv` xc7] H0•    
_4jPo1h0c051Testing软件测试网.@&J/g1`V|Y
NegativeLoadTest — 测试数据库中不存在的 Customer 的失败加载。51Testing软件测试网&BM\7G+{uM$q
•    
Hq0Q+px|y2y0
],OQ}9o'omOf0NegativeValidationTest — 确保验证逻辑正确工作。
~#U&y&~7s+^u Ro051Testing软件测试网 l9o4Ft^X{F
这些只是自动化单元测试套件许多用法中的一部分。我曾经听说一个小团队使用单元测试查看针对其组件的已知安全攻击。从宏观的角度来看,单元测试应该明确保证组件的正常使用。具有丰富的测试集将使团队确信您已经准确实现了既定的目标:编写有效的软件。无论自信源自哪里 — 这就是您需要编写的测试。
;{uM h:IkQ;`,cd0您测试什么?51Testing软件测试网2N6u4S4w#Tf

dyt"~ JQ@y0从本质上看,这些自动化单元测试非常低级。它们旨在测试下至构造函数、方法调用的对象,甚至是对象上的属性。
,P[{6fqWE051Testing软件测试网OW7ot9G\6e
关于“公共对私有”的主题在单元测试派系中引发了许多争论。许多人认为单元测试只应该测试对象的公共接口。其他人认为应该测试每个调用 — 包括内部私有方法。VSTS 支持两个单元测试级别。VSTS 通过使用私有访问器或包装类支持私有测试,后者提供基于“私有”方法和属性生成单元测试的功能。51Testing软件测试网Ji/]0D |
 51Testing软件测试网:u7p4\0X.^:j*H
为什么生成代码?
/Y%r:Qg7\z-^+K)] |051Testing软件测试网*g4Y?Z jr4N
阅读上面的列表后,您可能会想起前面项目的单个对象,并思考:“如果我用“这些”对象进行该操作,就需要编写大量代码!”请考虑开发人员仍编写“单元测试”代码的事实 — 只在不同的窗体(例如,前面提到的 WinForms 示例)上进行。此外,具有可自行记录、可重用的实现示例带来的好处远大于生成更多代码所带来的麻烦。最后,在单元测试中设计更多的环节已证明可以减少质量保证环节中的故障。51Testing软件测试网:^gx.c8A'a k:Y3}
51Testing软件测试网-w`*Ofa%T
正如前面所提到的,代码生成是“软件创建软件”的过程。基于可重复的过程创建代码是理想的。例如,一些使用代码生成的较好示例包括:脚本数据、创建表示实体及其在储存库(数据库 CRUD)中存在的对象,或者创建适用于数据维护的 UI 控件。使用代码生成的好处包括:51Testing软件测试网L$_ W%N Q@^n^
•    
Lu`+@(}d051Testing软件测试网@ ?r Y)@V^ w!M2f
节省时间 — 为什么花几小时/天/周创建一些在几秒/分钟内就可以创建的内容?
Z@i\ON0•    51Testing软件测试网$P*q9~Ka#c_
51Testing软件测试网3]/_|$Pc#?
强制标准/约定— 对于强制您的标准和命名约定而言,没有什么比消除开发中的人员因素并依赖基于“您的”规则的可重复过程更好的了。51Testing软件测试网_0s8u4VF b#@
•    51Testing软件测试网^!y(DmY'OL

FF AfD:I2KX w0测试私有方法的功能 — 正如本文前面提到的,Unit Testing Framework 提供使用“私有访问器”类测试私有方法的功能。该代码生成引擎创建与这些访问器类相关的所有“基础代码”。51Testing软件测试网 d7li O*H#n u
•    
l{4fg"YJ k6x0
1m~&qN U `}@8L-c0获取现有组件的信息 — 搜索另一个开发人员的组件吗?基于这些组件生成代码可能提供关于该实现以及该对象接口的简明示例。此外,进行设计并在编码之前“清除”其对象的公共接口(例如,通过使用 VS 2005 类设计器)的开发人员将极大地受益于代码生成引擎。51Testing软件测试网xP#cy*v1Y;J$y\8|
51Testing软件测试网,c[6cX/qv
正如您所预期的,自动化单元测试属于“优秀代码生成候选者”。在现有组件中指出一些内容并针对这些自动单元测试生成初始代码难道不是很理想吗?而且不只是保留单元测试框架,还会围绕对象的公共接口生成实现示例吗?将来的 Visual Studio 2005 Team System 用户将拥有该功能以及更多功能!
YaD3N g CCpT)YF0 
KP7X$D.P#\&un0让我们生成一些代码吧!51Testing软件测试网v I"D Zw3hc:R

,i+n2D)Qk0本例中,我们将生成本文前面提到的 BankAccount 类的代码。本文的这一部分旨在为您介绍代码生成过程,并重点介绍所提供的功能以及从 VSTS 使用 Unit Testing 引擎的好处。
v*xE8Tj]Uv-V0第 1 步:创建您的实现代码
LJl1{tyx0
?h:qa7x _0首先,我们创建一个将用作应用程序的业务层的类库项目。
Vy#Z,D x"^/LbJ*a']051Testing软件测试网;_]3_3e{6W||c*r
要在 VS 2005 中创建该库:51Testing软件测试网}e*FbX
51Testing软件测试网t DY:i vG/W_1s
1.
p_Cxo0   51Testing软件测试网6L }4j.\r0W7d(b1dHc9N

P.gpG#iuD&].V;R0启动 Visual Studio 2005 Beta 2。
5[u0X;H~X%o0
~L0F9G9Kf02.51Testing软件测试网w nc2C+OV
   
V"n1v N:tp7v0
,D9y%CP_;ho0单击 File | New | Project。51Testing软件测试网!S*k+p Y d
51Testing软件测试网&Y&|-w.U-[s"n(KA
3.51Testing软件测试网%F*];@4Oc@
   
.Y2h3{;`Eb A5qkt*KQ051Testing软件测试网j7FT(nahd
选择您选定的语言 Windows,并选择 Class Library 项目模板。
q Q[PTJ0
-n4IJ!S&{]04.
uc,OG.b:Sw2f0   
\1v V%f`,B+w;Y0
$csuV.q0将 Name 和 Solution Name 设置为 BankAccountDemo.Business,选择一个位置,并单击 OK 来创建该类库。
uAc9y6af3f&Ma051Testing软件测试网%|5E!@4}9e?
VS 2005 创建该类后,下一个任务就是创建针对您的项目设计的 BankAccount 类。为此,需要执行以下操作:51Testing软件测试网j|a@wE+a#p

R6^-cBS01.51Testing软件测试网-d+b`.M Eh
   51Testing软件测试网6o:^!NoS p0|

}3r [DT1_,t0在解决方案资源管理器中单击右键,并单击 Delete,从项目中移除该文件并将其从硬盘中删除。
,_)Xw6_ m0
t1t9z+Z2?A q02.
vW W CT'M"G$AT0   51Testing软件测试网Z6fZ6X_PW,i
51Testing软件测试网2_!A{{0P!Xw+_
右键单击 BankAccountDemo.Business 项目,然后单击 Add,之后单击 Class。51Testing软件测试网9X Q Qb3IO;s b|&i

6G7i:Db9M/|03.51Testing软件测试网4t8rMT H1T O
   51Testing软件测试网w"i!b`7E L`

*i$V)b%AQ$n+j0选择文件名 BankAccount.cs,并单击 Add 创建类文件。
P(N%x-B'Z@uE051Testing软件测试网oM/UW:`7sa|E
4.51Testing软件测试网U.b9fm%X
   51Testing软件测试网;O@ x#Q MQm

r-F|&S-y'l@zl0针对 BankAccount.cs 文件对代码进行以下更改。
yKAk%O9G8F0U@0
a.A-yec7CoW2pi0using System;51Testing软件测试网\(vR`*_tu#R Y4Q
using System.Collections.Generic;
oppT;Mgwa0using System.Text;51Testing软件测试网)cO0CcQ^!pl*h|

)AoFj+f5C0namespace BankAccountDemo.Business
~Qk;z/]0{51Testing软件测试网M`1vk'Q2|8yB{
    public class BankAccount51Testing软件测试网!rEXNV3z+Q
    {51Testing软件测试网'[:O6s1j/O)DuF
        // Properties
az6G z7H3y]L)x0        private float _currentBalance;
3f[-u-u:jZI5F0
I3x*`tY5[*K0        public float CurrentBalance51Testing软件测试网:|Zt w(B(o1On8u
        {51Testing软件测试网z P%YO?_M-y
            get { return _currentBalance; }
/x`1D vwVh1z3r0        }51Testing软件测试网2IWD,}A8\-X

I%fdS(dQ f}0        // Constructors51Testing软件测试网J DDWG/u3u%[.r6z
        public BankAccount(float initialBalance)51Testing软件测试网/fcb]+|2UN]-g
        {51Testing软件测试网8M+j)N2wC6es
            this._currentBalance = initialBalance;51Testing软件测试网IpF m@)MV ?)\
        }
-jI+^L1hgNBR~0
l(lOt:F5@0        // Methods
2r,SkcX7a,J`0        public void DepositMoney(float depositAmount)
+R6w"W p'u|$B%IN0        {51Testing软件测试网EW}N?{/XKv'U
            this._currentBalance += depositAmount;
6G(EVsi0|/m|3{0        }
~I c8Ty*B,~0
-J&rKS.~0        public void MakePayment(float paymentAmount)
Ys9wR5`5wV9X6k0        {
RoAG R0            this._currentBalance -= paymentAmount;
w|k5`/@;h[.K0        }
7Xn#K#CI"e'?0    }51Testing软件测试网/a.H2GS'P W

t nC-c1X;Yc F}0}
"welr zr ~0
^5YC)g5Ge0

TAG: 单元测试 自动化测试 软件测试技术 VS

引用 删除 kbl5555   /   2010-01-04 09:58:40
俺也正在学习。
细微探世界 引用 删除 573702881   /   2008-05-06 21:00:59
高手先生好!以上的MyStack程序的Bug就有劳你了哦!!呵呵!
细微探世界 引用 删除 573702881   /   2008-05-06 20:56:59
下面的程序有什么BUG?  
namespace MyStack
{
    public class MyStack
    {
        private int nextIndex;
        private string[] elements(元素);
        public static void Main(string[] args)
        {
        }
        public MyStack()
        {
            elements = new string[100];
            nextIndex = 0;
        }
        public void Push(string element)
        {
            elements[nextIndex++] = element;
        }
        public string Pop()
        {
            return elements[--nextIndex];
        }
        public void Delete(int n)
        {
            nextIndex = nextIndex - n;
        }
        public string Top()
        {
            return elements[nextIndex-1];
        }
        public int Size()
        {
            return this.nextIndex;
        }
   }      
   

  
}
子木清风 引用 删除 Spark.lee   /   2006-12-19 14:26:39
这个是工具自带的 你可以多去看 如果学习的话
dionysus的个人空间 引用 删除 dionysus   /   2006-12-19 13:07:57
公司未来也会用到VS,到时候单元测试也将更加推广并规范化,学习了先
 

评分:0

我来说两句

Open Toolbar