不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。                                           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!!!!!!!!
51Testing软件测试网5S0u5JWm;m5zzk#A
51Testing软件测试网\1V!crS
    51Testing软件测试网4higs$Y
简介
A&SeKh s051Testing软件测试网dp` bsyW!t:A$p^
随着业务的革新和发展,运行它们的系统也需要进行更新。随业务的发展、革新以及与合作伙伴、客户和供应商的结合,这些系统将在复杂性方面持续扩增。51Testing软件测试网8j?xQe)t1t
51Testing软件测试网wNs0v.kT {0G.]5_
这种复杂性迫使 IT 的领导者们在开发过程中(即,在实现之前)确保质量。有一种方法可使开发人员减少进入 QA 环节的故障数量,即,针对自定义代码严格执行自动化单元测试。在开发过程中强制使用自动化单元测试可为团队成员提供有关如何使用自定义代码的示例(这些示例易于使用并自行记录)。
!T6Ap7J0@8_#m#d0
f Q9tf5i?,gRt0使用结构化、自动化单元测试面临的挑战之一是完成这些任务所需的代码总数。(测试代码需要使用大量代码!)代码生成的概念(简单定义为“创建软件的软件”)正随着时间的快速推移而逐渐深入到团队 IT 开发之中。有些人认为代码生成有助于缩短“推向市场”策略的时间,强制内部标准/协定,并促进开发过程。
X7W s hb x0[qN051Testing软件测试网;]rXv {
Microsoft 认识到这一需要后提供了一个功能丰富、带有下一代开发平台 Visual Studio 2005 Team System (VSTS) 的代码生成引擎。本文提供针对单元测试代码生成的循序渐进的指导,并深入探讨如何在用例中使用。
~Rm\p"nW#OB0 
L%f"z!fJC3}0重新思考单元测试51Testing软件测试网6[Gr js/Z&[+C

?};P RsFHF7c0请考虑以下情况:您负责为公司生成下一代系统,同时您是较大的开发团队中的一员。您是 UI 开发人员,负责尽可能多地创建 Microsoft ASP.NET/Microsoft WinForms。您依赖“中间层”团队完成其中间层组件 — 这些组件用于执行数据库 CRUD (Create-Retrieve-Update-Delete) 以及与该系统中每个实体相关的业务规则。
9V X&y)K:i)o]051Testing软件测试网 D4NZ K,@4D;?
经过几周的 UI 开发,您完成了窗体并且收到了中间层开发人员打算向您提交其类库的消息。下面提供一段对话示例,说明我们大多数人在开发过程中都会遇到的一些事情。51Testing软件测试网2U/n'nA5ae
UI 开发人员和中间层开发人员间的示例对话
DO AU9v-B?}051Testing软件测试网$o-A:@(@`-`
中间层:51Testing软件测试网'E"l2u1F%}]
   
,e`,J6L&Are g051Testing软件测试网K0Xq"@1dO6Wu
“这些对象随时供您使用 — 为此,只需获取 OurSystemBL.dll 的最新版本。”51Testing软件测试网*kqi2S)@/g O
51Testing软件测试网T MY W2W1I6|
UI:
#n-u[)\5x1C.F0   
J)Cdm8uT%B q/k0
cp7[8Ni*C0“谢谢。您有供我们查看文档吗?”51Testing软件测试网3W1R_*o:|:P
51Testing软件测试网 vlT&w)M \
中间层:
gv*m'v6F3{0p'g0   
,O I0|mY2jC051Testing软件测试网Bt |z-n {/_
“哈哈!是的,当然有!我们花了很多时间编写它!请查看 Design Document — 噢,请等一等,它还没有完成……(不久之后即可完成!)”51Testing软件测试网v7DP~%C*j

n+K-u6ix&Q^0UI:
'ye"DU4g\$mt VS0   
9D_ z;o&|,@I051Testing软件测试网b8^?(c#t
“您使用 XML 文档了吗?”
y1e2L @5D051Testing软件测试网0Q:Kt,L4Zv3i%qPc e
中间层:
n-}'N$`[$stDu0   
_CzIS0
j2? j5h7j*M0“在构造函数中,但许多方法都不使用。”51Testing软件测试网u0PO4~y8t

)tf+Dq W\C!EF&H3t0UI:51Testing软件测试网,E"EkuK9uw
   
R"aef#atr0
bs4G!r5`0W0“显示如何创建、执行并删除对象的示例代码,怎么样?”
?Uq4_{R0
$y+NI{}{0中间层:51Testing软件测试网.g0f%\\[%p}}
   
s EB[.^6h%t051Testing软件测试网$Q a*g!^ |j@E"e
“我已经附加了一个示例 WinForms 应用程序(从我的工作区),它应该能够提供一些您所需的内容……,虽然它不在 Microsoft Visual SourceSafe 中。”51Testing软件测试网1HQ(FtnU6r~7a

q{,])_ w.qP|[4q Y0在考虑如何进行这样有趣的 项目之后,您打定了主意,决定检验中间层的单元测试套件。在深入钻研该代码之后,您注意到该窗体有两个未标记的文本框,以及三个标记为 button1、button2 和 button3 的按钮(幸运的话,它们将排列在窗体上)。接下来,在查看与这些按钮相关的事件之后,您认识到这些代码都未经注释,并且数据变量都被命名为 x、y、z。如果幸运,您还会注意到 button1 和 button2 执行该对象的 Save() 方法,而 button3 执行 Delete() 方法。执行时,您会接收到很多 System.Exception 错误,这是因为遗漏了很多配置设置。51Testing软件测试网_k,l;B1mS^
51Testing软件测试网S9ca#S4E3O
这显然是一个特例,我希望多数开发团队不要进行这一试验,下面让我们看一下该方案中“单元测试”遇到的问题:
z'mk9n&]4@#k5j0•    
n6B*AY2f)y+[m0
y4Q(y+Ug#z&|0这种形式的单元测试代码不是结构化的:代码充斥到按钮单击事件中并且难以编译。51Testing软件测试网_M z?'m"O n
•    51Testing软件测试网 Mh+Wi f0r(j(QP
51Testing软件测试网 DKoh|eP1pd
这种形式的单元测试代码记录得不太好。51Testing软件测试网 Nx];C9a8NATJ
•    51Testing软件测试网c-{$~lh

S G`?Y!b-A0这种形式的单元测试并不基于“已知”为好或坏的数据 — 它完全依赖于输入到那些未标记的文本框的内容。51Testing软件测试网Bu0PJ]_
•    
+\$q] loE G051Testing软件测试网/?6Kq3pjK{^6v
单元测试代码不能自动重复,它基于输入的代码。
i7B#T1~8A2w4C~k0•    
$YN4ya!A/lH051Testing软件测试网LsY?r?0cv6`'^
单元测试代码覆盖是未知的 — 用数据指示实际测试的代码量。51Testing软件测试网:W2M#OV#Z8Ge.L
•    51Testing软件测试网9? wW0dyaP8x

?'W)o f*K'H'xA0实现的详细信息不易于在团队成员间进行传播。51Testing软件测试网"W&t"Fe&L(lMG
 51Testing软件测试网$Tp0a2Om\
输入自动化单元测试
O,@wU#S ~8[0
1YM&taba6ut%|0xUnit 框架在 1998 年作为 eXtreme 编程的核心概念引入。它提出了一个有效的机制,有助于开发人员将结构化、有效且自动的单元测试添加常规开发活动中。从那以后,该框架演化为针对自动化单元测试框架的实际标准。51Testing软件测试网8a#gX_xc
创建自动化单元测试的用例
%?;K'Y7ZyT/KY0
H@~QM8l0简单说,自动化单元测试是:
e Q#kZ[2Rt0•    51Testing软件测试网a)Z5_g)|.Fv#awt
51Testing软件测试网2rBt sk6c1Y
结构化的。51Testing软件测试网&|@"YHkJa
•    51Testing软件测试网P)H@'\:a
51Testing软件测试网0F v;I{E7F?
自行记录的。
O}9usb4o I:I0•    51Testing软件测试网 sA3avvN~w M
51Testing软件测试网.Zr;?'u*H)d7W
自动且可重复的。
9X+n%Z!`6kh cnF!F:ZA0•    51Testing软件测试网hRwH$l*K&a m
51Testing软件测试网Y gf#G%so"X
基于已知数据。51Testing软件测试网LHz g G!X.Al3X/\9h
•    
6^"L$aC$h0
Lj!f:Ix"ZUq0旨在测试积极和消极操作。51Testing软件测试网1G%`pcNI
•    
kq0UbC0@y,j{1}S051Testing软件测试网f+w5H!\3P ft
非常适合跨不同计算机的测试实现。51Testing软件测试网 s[X qqmd
•    51Testing软件测试网'o?9i ex[

p}.ipb R2m0配置、实现和执行的示例。
*kV/q p+nWX'q!D~0xUnit 框架元素
-U8DI3y)sF051Testing软件测试网1c N1SPS7Ag2[
表 2 分析 xUnit 框架以及对应于 Visual Studio 2005 Team System 的 Unit Testing Framework 等价物的基本概念。51Testing软件测试网"R6}/b8w%P.P4Mu
表 2. 相应的 xUnit 框架和 VSTS Unit Testing Framework 概念
9r pE\0rj0V3\8l0xUnit 框架概念     VS 2005 等价物(参见下面的属性)     描述
^ v#[ LR o-Q051Testing软件测试网 w fT4E:[rG]f8~
测试
J!~7B5R9m*jc0   
_"j6{et051Testing软件测试网Z dVE^*_\]^ o
TestMethod
G(p;Ui!V8?;D0   51Testing软件测试网 hK5U;`4y7`8fE@q%oZ

W Z~@x'|0简单说,这些是您的测试。测试预期结果的逻辑,并报告未取得结果(如果有)。请将它看作您的“方法”。
;bmo;M;H4n0
f!t{:E^{ m0测试装置
N4mKI S}#u0   
5R b@,ZK,o051Testing软件测试网^-FUH?xc
TestClass51Testing软件测试网\Fw'to$Rw%j N2O
   51Testing软件测试网c nJ:F{M#a9Gv~,DI

7i$_}0g.J ? nVG_0针对大量测试的一个逻辑分组。请将它看作您的“类”。51Testing软件测试网$Vd T mqMWp {

kIP0u?/vg"d%Y+J{0测试套件51Testing软件测试网F vr}r*L
   
@4R3q9H0LU!w s}051Testing软件测试网:];j\%J$iPZc2K
测试列表 **
3D^u!z(I"R;[8G2W E0   51Testing软件测试网6E$K6s6H2Pi0VC

-VVw0dwe5L%H#_`w0针对大量测试装置的一个逻辑分组。请将它看作您的“类库”。
*E_t!d*BTX#e0
,h;p1te a8~ x0注不需要一个属性。51Testing软件测试网,]#K7UE~Z d+V[RI _

[c'a*?Z*v0测试运行器
,^9K6b0r0|G` [|]0   
ww|ur+l!w051Testing软件测试网6QHQ~Vl
VS 2005 VSTS Unit Testing Framework51Testing软件测试网$uC z$TzX4VP
   
,lSU4Z#T R o{[$ve0
QM,cq}sY2~0GUI/Console 应用程序负责发现、执行和报告测试结果。Visual Studio 2005 Team System 将作为本文的测试运行器。
Lbq5B l0测试装置示例51Testing软件测试网y'c|V J(q;H

-t3[/UP6Z Rr0请考虑以下针对 BankAccount 类的类关系图,以及一个示例测试装置 (BankAccountTests.cs)。51Testing软件测试网sm7U nP1} N

Dyh9`3Oxv v T)E1XN0图 1. BankAccount 类51Testing软件测试网p/Z;| c5Vs:dM!}/M?
示例测试装置: BankAccountTests.cs51Testing软件测试网kb1S:f9w

rNv|+n2R F0using BankAccountDemo.Business;51Testing软件测试网(dtuy3}9cI HT
using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework;
'A,t"G.d [Xp0W0namespace BankAccountDemo.Business.Tests
ha!u,cQ5aY3rcm"P0{
As0KsRe0    [TestClass()]
1bsWo3GCX!j0a/t0    public class BankAccountTest
^(}j BdI*q9n8FA0    {
|eA]p } g0        [TestInitialize()]51Testing软件测试网(^"q+rT"^m0E
        public void Initialize()    {
-q LGAm'p+[0        }51Testing软件测试网 h-e*kL!A Q
        [TestCleanup()]
?*z fbu@%D0        public void Cleanup()   {51Testing软件测试网 N~-{*]LDB[dy
        }51Testing软件测试网n.c9ADg&u3V"x^D
        [TestMethod()]
/VraP/|)X&{:k0        public void ConstructorTest()   {51Testing软件测试网\Wm [*X+Z
            float currentBalance = 500;
_\ k@.WNm5K8]S0            BankAccount target = new BankAccount(currentBalance);51Testing软件测试网n+j'p$d'L?
            Assert.AreEqual(currentBalance, target.CurrentBalance,51Testing软件测试网 Udn"Vc U
                "Balances are not equal upon creation");51Testing软件测试网&l'E*k$| u @"[
        }
_/?,[9dKL2Z(o+Q0        [TestMethod()]
^t.Zd}p'`:U0        public void DepositMoneyTest()  {51Testing软件测试网.Zg-Eo(N!W]O
            float currentBalance = 500;51Testing软件测试网J|Gl~7cl7I
            BankAccount target = new BankAccount(currentBalance);51Testing软件测试网7o'Eulm"T&H/@
            float depositAmount = 10;
r;}?%oQbN#g0            target.DepositMoney(depositAmount);51Testing软件测试网f~#x`{:Rx
            Assert.IsTrue( (currentBalance + depositAmount) > 51Testing软件测试网*l)a/BN l*l
                            target.CurrentBalance,51Testing软件测试网L'a'hP^:~6}#f
               "Deposit not applied correctly");
RZ#S!I'D5m@Wzm/A)T0        }51Testing软件测试网3u%w,Uh5g$B7B$@&VM
        [TestMethod()]51Testing软件测试网Upma2h
        public void MakePaymentTest()   {51Testing软件测试网3[-Oz+N?/yQ'Ol;}
            float currentBalance = 500;
0L!kta'K;R&S0            BankAccount target = new BankAccount(currentBalance);51Testing软件测试网1GO:md!v Mt7@4sn&k
            float paymentAmount = 250;
y0N rFt0            target.MakePayment(paymentAmount);51Testing软件测试网5~FDM+QQ3k"M
            Assert.IsTrue(currentBalance - paymentAmount ==
#]%K:lE#P/W*F9x0              target.CurrentBalance,
jV+{Y6P1xE J0                "Payment not applied correctly");
OXzOjU0        }
t6E9Hy7lRvbM0    }
ogD-Me1r0}51Testing软件测试网;}Z;o!qO C9|wod
51Testing软件测试网:f/g] v] |(Mk
主单元测试概念 == 断言
2nC+Hw8xo051Testing软件测试网GJ9Se.LD
用于该形式单元测试的主要概念是,自动化单元测试是基于“断言”的,即可定义为“事实或您相信为事实的内容”。从逻辑角度看,请考虑该语句“when I do {x}, I expect {y} as a result”。
)[qbG@;Vm0
&FwU4e+|JXW0这可以轻松地翻译为代码,方法是使用 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中可用的三个“断言”类中的任一个:Assert、StringAssert 和 CollectionAssert。主类 Assert 提供用于测试基础条件语句的断言。StringAssert 类自定义了在使用字符串变量时有用的断言。同样,CollectionAssert 类包括在使用对象集合时有用的断言方法。51Testing软件测试网9}~3BU D5v5p9[-Zr'C T

iL G9D[X`6nz0表 3 显示可用于当前版本 Unit Testing Framework 的断言。51Testing软件测试网3D2@3R ]U/ZPM
表 3. VSTS Unit Testing Framework 断言51Testing软件测试网W$D$q q5p
断言类     StringAssert 类     CollectionAssert 类
`|)Z!q2o&]}@o051Testing软件测试网v'OH/f4eD
AreEqual()
!nV;e3J0L5t0AreNotEqual()51Testing软件测试网WIo^t0U~
AreNotSame()51Testing软件测试网$jt4su1| igu
AreSame()51Testing软件测试网+[ v'z2t`
EqualsTests()51Testing软件测试网@sf4y6w0] Z
Fail()
nN(A%g"O~ }V0GetHashCodeTests()51Testing软件测试网 B2o&n%xP+|x
Inconclusive()51Testing软件测试网5_ c`^ K O-IL9~z6o
IsFalse()51Testing软件测试网-l ^|*Do%Kp4s
IsInstanceOfType()
9]R7{ Zkge0IsNotInstanceOfType()
!w+BxtD0w0IsNotNull()51Testing软件测试网*F\]H_r
IsNull()51Testing软件测试网/r7Z8A7A,XW
IsTrue()51Testing软件测试网"w @Fk fg&~ jM7u

'n*[a?0V5@)O n"r0   51Testing软件测试网_G$@4hg(K P jY

N(^-i(?2aXnW,_]0Contains()51Testing软件测试网K8E4RbLMY\T
DoesNotMatch()51Testing软件测试网-Zu9Um]!al
EndsWith()51Testing软件测试网I/nK%h9]-m w
Matches()
;w2do+@m0StartsWith()
Tr5?g%Y:j9?Q0
-|BNfm1bJ$X:e0   
;k])K:Alq1wq6n @0
ZUra2n\^T0AllItemsAreInstancesOfType()51Testing软件测试网^a"VzT#`j
AllItemsAreNotNull()
H.B%wN*SVd a1}f0AllItemsAreUnique()
*Y7_ k,s4E.M8k+h0AreEqual()
(V D!B+Rt0Bv)wZ@0AreEquivalent()51Testing软件测试网sJ+ib c-m R
AreNotEqual()51Testing软件测试网 d6M7LL6r&g1s f J/J8~l
AreNotEquivalent()
7MX4uw&T8NwWK0Contains()51Testing软件测试网 ^Y,T;`*U#P&C5l8z\
DoesNotContain()51Testing软件测试网;a k DO*Ti S?H
IsNotSubsetOf()
:y[fG E4pZ0IsSubsetOf()
Dz,@|*x R Q6L^$v051Testing软件测试网A#L;^-MG v4g
这些自动化单元测试用什么运行?
@6h CF f0
,m G1Q1i"D l ]#v;y0正如前面提到的,xUnit 框架将“测试运行器”的概念定义为应用程序负责:(a) 执行单元测试;(b) 报告测试结果。对于本文,包含 Visual Studio 2005 Team System (VSTS) 的 Unit Testing 引擎作为我们的“测试运行器”。图 2 表示 BankAccountTests.cs 类的执行结果。
C&RfOQKk051Testing软件测试网_C7O1Ee6B\ |Z+I
图 2. 测试结果窗格:单元测试执行结果51Testing软件测试网/k mUyr3k)A1?D
51Testing软件测试网C@C8_8`bv pZf
Microsoft Visual Studio 2005 使用源项目的代码模型动态填充该视图。它基于该源代码中的自定义属性动态发现有关该测试套件的信息。表 4 表示最常见的单元测试属性(以及执行的次序)。
9W$e8z@/y0表 4. 常见单元测试属性
"Z+PM7}~^0属性     描述
&CH6P"z;xwg'F0
}3z2@)_9V;s-m0TestClass()51Testing软件测试网J0i K;j;p/a[ ]4G
   51Testing软件测试网3r,t,l4vF ^d
51Testing软件测试网I6y&\$D4q,]sl
该属性表示一个测试装置。51Testing软件测试网"O1{mF5\[3Vc6u(H.C1Tl
51Testing软件测试网5dK3O5TI+Y7G
TestMethod()
:a\3xb4mf4K/te)a0   
#p|;fo!B9F3Nw0
4P#hZ @| MHK4F0该属性表示一个测试用例。51Testing软件测试网 h-s U E4H;U#L
51Testing软件测试网J$m*csI1m4Vk
AssemblyInitialize()
os/c~b$F+r0   
8n5J&Ktm(Pn{G$?0
Z,kq:R3r/B ~j%WU0在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之前,执行带有该属性的方法。
]RT*N5DN2a(o}0
1lu3N0uj1o$i0ClassInitialize()51Testing软件测试网 k Y+tkiu"p:X
   51Testing软件测试网5\xk|0Dy&\!_Ie
51Testing软件测试网4T%Q vGBP-X2B!sZ ]
带有该属性的方法在执行第一个测试之前调用。51Testing软件测试网Ir2n,s|K&P&k

&t4b~n#Gf/J.a{]E0TestInitialize()
y[ iuYL0lW0   
1u/x'`oo0
pzpqtUB'j0带有该属性的方法在执行每个 TestMethod() 之前调用。
9o$R~,{9f3^ F0t0
V Af"g5I bN [8o0TestCleanup()51Testing软件测试网*M x'_2C7{,C
   51Testing软件测试网4^$]7jrt!mCq3?

u,h%m2a ?x-wt0带有该属性的方法在执行每个 TestMethod() 之后调用。
8C!b2h,[ Fu\.T+J*B{051Testing软件测试网8p'w3l`c
ClassCleanup()51Testing软件测试网Px'~+x1I-m?.s
   
7^5_+_b0a#s"ek0
E{#SP}h0带有该属性的方法在执行 ALL 测试之后调用。
1Z+h3D a0i051Testing软件测试网2~?j'}5t \%V]
AssemblyCleanup()51Testing软件测试网r_;n:C J2o W Mvns
   51Testing软件测试网W Fz8qaxC

s'BewzUk0在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之后,执行带有该属性的方法。
"HG_B7V2xw)F'{+K051Testing软件测试网1k:h~$d Ge
Descrīption()
tL s\(i}6~i)B5]0   
:sFm4RVR051Testing软件测试网sv*L_#v"^5v
提供关于给定 TestMethod() 的描述。51Testing软件测试网|7]'_*@p{\/[Z/l

xc_7L(igJ Lv*f0Ignore()
y3~#T6e*Nm!z0   
G(Q6eP"`O051Testing软件测试网 \$B9A+_`
由于某种原因忽略 TestMethod() 或 TestClass()。51Testing软件测试网8i ~ TkIRH kD

fW`E5JF0ExpectedException()51Testing软件测试网BNMV+bbr"V8j
   
*O{2AR4S;y*A0
9]wg \4mGd:l J0当测试特定异常时,如果使用该属性指定的异常不是从实现代码引发,则测试不会失败。51Testing软件测试网+h#ceT9I
我编写什么类型的测试?51Testing软件测试网^ cu,\+kVj

i0Sx X"_$Q0一个方法及其相关测试之间很难有一对一关系。编写自动化单元测试需要开发人员“进行全面思考”,并了解关于对象的所有内容 — 它将如何消耗、使用、处理,以及在任何情况下如何起到积极、消极、非决定性作用。51Testing软件测试网!T,I9l2sub

:T/Im1{{s0例如,请考虑一个用于针对数据库中 Customer 项执行 CRUD(创建、检索、更新、删除)功能的典型对象方法。对于该对象的 Load() 方法,要针对以下方案编写测试:
?4qv)o sd#D6^5b)Y0•    
I.}4|:~ j0
1q.yh+Z Wv9t6Y3X0构造函数测试 — 确保对象正确加载,带有正确的信息。51Testing软件测试网5aML Tm
•    
HP$E*d WF|,F051Testing软件测试网q-uA0beM5S3n1gR
PositiveLoadScalarTest — 测试数据库中一个 Customer 的成功加载。
-XZT~-H-y*|h [4P0•    51Testing软件测试网5L F'j__'I{

"}n `/WGgs*e3y[4g0NegativeLoadScalarTest — 测试一个 Customer 的失败加载,即该 Customer 不在数据库中。
} J5g;|Xixw*Y!{ z1_8A0•    
^3Y8y.z&Rb0
n5I.V@"K'd2qg0PositiveLoadTest — 基于已知数据测试 Customer 的成功加载。51Testing软件测试网"Q3\YB;N(j8A
•    
5Jx?n!w051Testing软件测试网;BRcS F+T
NegativeLoadTest — 测试数据库中不存在的 Customer 的失败加载。51Testing软件测试网f,yf;s Yf?8n
•    51Testing软件测试网\slv'?-J

@4u']`H|E0NegativeValidationTest — 确保验证逻辑正确工作。
Zd@(v6K051Testing软件测试网&q`Mv6F5w.j;tpZ
这些只是自动化单元测试套件许多用法中的一部分。我曾经听说一个小团队使用单元测试查看针对其组件的已知安全攻击。从宏观的角度来看,单元测试应该明确保证组件的正常使用。具有丰富的测试集将使团队确信您已经准确实现了既定的目标:编写有效的软件。无论自信源自哪里 — 这就是您需要编写的测试。51Testing软件测试网/K$s!P.X] y6Zt,C&hF
您测试什么?51Testing软件测试网 cr$Er;D%l,S!B
51Testing软件测试网r-Rc.KDkT!j
从本质上看,这些自动化单元测试非常低级。它们旨在测试下至构造函数、方法调用的对象,甚至是对象上的属性。51Testing软件测试网 i(s:{'EU!k&n
51Testing软件测试网TE1l!e~T
关于“公共对私有”的主题在单元测试派系中引发了许多争论。许多人认为单元测试只应该测试对象的公共接口。其他人认为应该测试每个调用 — 包括内部私有方法。VSTS 支持两个单元测试级别。VSTS 通过使用私有访问器或包装类支持私有测试,后者提供基于“私有”方法和属性生成单元测试的功能。
klu9t~Rd2E5~_3t0 51Testing软件测试网*TP3|&T ~
为什么生成代码?51Testing软件测试网8aP+E tZ
51Testing软件测试网L7\G a:pA.?r1l!Q
阅读上面的列表后,您可能会想起前面项目的单个对象,并思考:“如果我用“这些”对象进行该操作,就需要编写大量代码!”请考虑开发人员仍编写“单元测试”代码的事实 — 只在不同的窗体(例如,前面提到的 WinForms 示例)上进行。此外,具有可自行记录、可重用的实现示例带来的好处远大于生成更多代码所带来的麻烦。最后,在单元测试中设计更多的环节已证明可以减少质量保证环节中的故障。
7]9RVy_e;V7`$m0
$N&v*C x$C9awpEUa4T0正如前面所提到的,代码生成是“软件创建软件”的过程。基于可重复的过程创建代码是理想的。例如,一些使用代码生成的较好示例包括:脚本数据、创建表示实体及其在储存库(数据库 CRUD)中存在的对象,或者创建适用于数据维护的 UI 控件。使用代码生成的好处包括:51Testing软件测试网 Tz8C!T J's'j"xn
•    51Testing软件测试网'\5|%c9Sfg
51Testing软件测试网&L7L ?/\I{ Dt#v
节省时间 — 为什么花几小时/天/周创建一些在几秒/分钟内就可以创建的内容?
1fo9w#}1B;M8@%z Y"O0•    51Testing软件测试网,A](eM.Z3E6t

:vxD {5tTW0强制标准/约定— 对于强制您的标准和命名约定而言,没有什么比消除开发中的人员因素并依赖基于“您的”规则的可重复过程更好的了。
;t$g)t9r3B/H%eED0•    51Testing软件测试网 |+y|[#y8B,X.eU

T[-rAjit&HF[0测试私有方法的功能 — 正如本文前面提到的,Unit Testing Framework 提供使用“私有访问器”类测试私有方法的功能。该代码生成引擎创建与这些访问器类相关的所有“基础代码”。
L7f4Ec ttf0•    
u2Sb.XB0
0@ S}} ] Fc.^)X0获取现有组件的信息 — 搜索另一个开发人员的组件吗?基于这些组件生成代码可能提供关于该实现以及该对象接口的简明示例。此外,进行设计并在编码之前“清除”其对象的公共接口(例如,通过使用 VS 2005 类设计器)的开发人员将极大地受益于代码生成引擎。
uh-L%N9}"I l(z0
&O"@am5D"p ff?$r W)K0正如您所预期的,自动化单元测试属于“优秀代码生成候选者”。在现有组件中指出一些内容并针对这些自动单元测试生成初始代码难道不是很理想吗?而且不只是保留单元测试框架,还会围绕对象的公共接口生成实现示例吗?将来的 Visual Studio 2005 Team System 用户将拥有该功能以及更多功能!
F'M1z@;x6G4`{R^r0 
x"p;qL H;u;|I x)C0让我们生成一些代码吧!
.[9TY:q6FSl P8q051Testing软件测试网&sZ(@wR7rG;A T1g
本例中,我们将生成本文前面提到的 BankAccount 类的代码。本文的这一部分旨在为您介绍代码生成过程,并重点介绍所提供的功能以及从 VSTS 使用 Unit Testing 引擎的好处。51Testing软件测试网 q5~S._ x-ZJ4?
第 1 步:创建您的实现代码51Testing软件测试网 hQ~g8F.{
51Testing软件测试网)m.OR q-HZ]&a5F c
首先,我们创建一个将用作应用程序的业务层的类库项目。51Testing软件测试网 D JU"W)r
51Testing软件测试网tn)E gob2la
要在 VS 2005 中创建该库:
s3N(P#^(~4a0
in)i3We0RH01.
$DlV y6hm%Q0   51Testing软件测试网ZZN/o-br q#te
51Testing软件测试网YE'R#^"o%A3a,@i
启动 Visual Studio 2005 Beta 2。51Testing软件测试网 [9v2i`.yFI
51Testing软件测试网0L+wWl.YQ Bh
2.
U2B!lm_N"o|:f`0   
ldM)a#|SlJG051Testing软件测试网AMk I9?-s7P
单击 File | New | Project。
o&KM]+U.z |%n051Testing软件测试网e;U ~P$ou*{
3.
1oQ%Re4zOF&o c'W4G0   51Testing软件测试网BDQq@ {

)F8x,ZSC0选择您选定的语言 Windows,并选择 Class Library 项目模板。
x1SMCq#S051Testing软件测试网}~#p r0nhT vh
4.51Testing软件测试网;QY R6Av
   
VD X4jh;[*Au051Testing软件测试网+Z8vt6SDTe
将 Name 和 Solution Name 设置为 BankAccountDemo.Business,选择一个位置,并单击 OK 来创建该类库。51Testing软件测试网q f!wAz:I3[ G
51Testing软件测试网+t2sO f p?dZ
VS 2005 创建该类后,下一个任务就是创建针对您的项目设计的 BankAccount 类。为此,需要执行以下操作:51Testing软件测试网!PR2ahU1],o9m.FK

T8A R$z9O(A y01.
1jS ^D&Do0   51Testing软件测试网? B@:y:Vgw+l

u1[+u9qx+jZ!b0在解决方案资源管理器中单击右键,并单击 Delete,从项目中移除该文件并将其从硬盘中删除。51Testing软件测试网zb/x*}nw%@:R)|0tS

6HI2xA C/pF L)H[02.
M x7ZF z^h Lz _0   51Testing软件测试网oK blpl)o;E
51Testing软件测试网 cs'VP hV\5uA
右键单击 BankAccountDemo.Business 项目,然后单击 Add,之后单击 Class。
V8T.wt%C051Testing软件测试网&I$rj ?)TGC
3.51Testing软件测试网^Y)kWM;DAx\
   
\R1\`C2f@9q051Testing软件测试网'gfYqe$V/Z)_*t.M6|
选择文件名 BankAccount.cs,并单击 Add 创建类文件。
7QZ7w8bH0s F051Testing软件测试网 wX l@2k2i
4.
(r9i6u1s:q&O't0   51Testing软件测试网$io5\9y@y#__
51Testing软件测试网:pcH {UbKjF
针对 BankAccount.cs 文件对代码进行以下更改。
E!JA#]-~&_0
#mdwHp9p6J0using System;51Testing软件测试网 Gi}/Kf R
using System.Collections.Generic;
dSf'jFVA/F~0using System.Text;51Testing软件测试网*J h,^ @2{+e
51Testing软件测试网_mXVYT#G-r
namespace BankAccountDemo.Business51Testing软件测试网F,{2pOt!B I
{
TP&sk$D.THPD5jZ0    public class BankAccount51Testing软件测试网 L)W+AA[
    {
LAJKa%i[X%Q0        // Properties
8[%i2X)s"k;sy'B?Q0        private float _currentBalance;
+R D5u3L+R X$\o(^051Testing软件测试网g9W[6N b*e6d l.~0[
        public float CurrentBalance
9}W5vM*K/VA0        {
.IIy Cf(t fv)p0            get { return _currentBalance; }
$R u,L?f F0        }
"^-q\ig"uQ,C5p i|q#Q051Testing软件测试网)xO7xr.^dQ\
        // Constructors
kl[:mxR*Pa#v0        public BankAccount(float initialBalance)
|$Du qz3oQgu0        {
#?!vNI O:_8L1c0            this._currentBalance = initialBalance;
w#xT0R [*i.P0        }
d8|r)`%@)VAJ0
4^IQI J'PzA2_0        // Methods
%lG9H3Z2{[ e#i0        public void DepositMoney(float depositAmount)
`/M/]3si,C-V.X0        {51Testing软件测试网es-DL D7m%Y'TY~#^
            this._currentBalance += depositAmount;51Testing软件测试网1N'\Z7Y bi
        }51Testing软件测试网,Mhg_E }f
51Testing软件测试网6e \$Le:s
        public void MakePayment(float paymentAmount)51Testing软件测试网H1k*]fIn
        {
JJN"f]O0            this._currentBalance -= paymentAmount;51Testing软件测试网~R!D.g{(M(i/H
        }51Testing软件测试网X!Muj(H]4FI
    }
0LV0Jw,Wo@3i;o0
9VjD1~ p'S3Y"B3_2J0}
$C {l3Z(A,gA051Testing软件测试网.As$m7E9C5L\$Ov/P(i

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