不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。                                           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软件测试网9myh)y'RPg&Q

+jShN+iSG s M0    51Testing软件测试网rE]!RQ8Z
简介51Testing软件测试网{7@y3VXI
51Testing软件测试网!W)v4{0\Nc
随着业务的革新和发展,运行它们的系统也需要进行更新。随业务的发展、革新以及与合作伙伴、客户和供应商的结合,这些系统将在复杂性方面持续扩增。51Testing软件测试网)a,n!{*u;JJ

Up b'_$F1| u F8I0M0这种复杂性迫使 IT 的领导者们在开发过程中(即,在实现之前)确保质量。有一种方法可使开发人员减少进入 QA 环节的故障数量,即,针对自定义代码严格执行自动化单元测试。在开发过程中强制使用自动化单元测试可为团队成员提供有关如何使用自定义代码的示例(这些示例易于使用并自行记录)。51Testing软件测试网k1P.JiK9W4_(vAF
51Testing软件测试网5gZq J#` Q0l
使用结构化、自动化单元测试面临的挑战之一是完成这些任务所需的代码总数。(测试代码需要使用大量代码!)代码生成的概念(简单定义为“创建软件的软件”)正随着时间的快速推移而逐渐深入到团队 IT 开发之中。有些人认为代码生成有助于缩短“推向市场”策略的时间,强制内部标准/协定,并促进开发过程。
I-Z0`&L"^*} |-`0
,K/~` r$T|(VL0Microsoft 认识到这一需要后提供了一个功能丰富、带有下一代开发平台 Visual Studio 2005 Team System (VSTS) 的代码生成引擎。本文提供针对单元测试代码生成的循序渐进的指导,并深入探讨如何在用例中使用。51Testing软件测试网$aH,`6@2R}?
 
Y!d-JS-mCR{7w!y0重新思考单元测试51Testing软件测试网2R2Y/[-`O6C}&o\
51Testing软件测试网7H"?Vix4p,aG }
请考虑以下情况:您负责为公司生成下一代系统,同时您是较大的开发团队中的一员。您是 UI 开发人员,负责尽可能多地创建 Microsoft ASP.NET/Microsoft WinForms。您依赖“中间层”团队完成其中间层组件 — 这些组件用于执行数据库 CRUD (Create-Retrieve-Update-Delete) 以及与该系统中每个实体相关的业务规则。51Testing软件测试网?a%}j Z_7OD6_1^
51Testing软件测试网WYj#c K woP
经过几周的 UI 开发,您完成了窗体并且收到了中间层开发人员打算向您提交其类库的消息。下面提供一段对话示例,说明我们大多数人在开发过程中都会遇到的一些事情。
H |LzRar0UI 开发人员和中间层开发人员间的示例对话51Testing软件测试网u?N'q@+v|

P4J|M8s(A'U!n l3P0中间层:
}1qI ZB!G0   51Testing软件测试网;PfX.jA%v o K h

Ng%lx H0on4tP0“这些对象随时供您使用 — 为此,只需获取 OurSystemBL.dll 的最新版本。”51Testing软件测试网%r-Ua6n3~||%C*a&U

+Z dnU%K+QLL5p0UI:51Testing软件测试网*B6y;_K6R!C|_ O9s
   
Q(pK(}X051Testing软件测试网9ZZX _;w9H$v
“谢谢。您有供我们查看文档吗?”51Testing软件测试网Y+o7u8Bh#F` Y:O!Z

'm7qhx^9D!k*G5p0中间层:51Testing软件测试网,UBCZ0eVW] p BP
   
[e O(~5Ou7b0
QI(x n#ll:S'v8}0“哈哈!是的,当然有!我们花了很多时间编写它!请查看 Design Document — 噢,请等一等,它还没有完成……(不久之后即可完成!)”51Testing软件测试网pi,r!?'z9Q6OP
51Testing软件测试网p uzU$V-`#{
UI:
$m }0^re J6U*uG0   
P9n~,y v ALX0
4co;kM ^] \1L0“您使用 XML 文档了吗?”
7iL)[oV*f051Testing软件测试网!zYL/u"o S8d
中间层:
,Kcqq ]!{0   
.hp:l3P'E Q051Testing软件测试网pG \:@-I7VM
“在构造函数中,但许多方法都不使用。”
2aQ+GSe}!G0
_d dL'rx0UI:51Testing软件测试网e"iir#Z
   
5Wk H.~kn+Kj;kZ0
0v|8|4}]0“显示如何创建、执行并删除对象的示例代码,怎么样?”
+[a(_wHCD7m0
Xf:_@1up0中间层:51Testing软件测试网z7KS"x[0fLUz
   51Testing软件测试网V D scU:S o1x
51Testing软件测试网6?M6L2`%Gj7`1aL-R
“我已经附加了一个示例 WinForms 应用程序(从我的工作区),它应该能够提供一些您所需的内容……,虽然它不在 Microsoft Visual SourceSafe 中。”51Testing软件测试网k`%xx$wJ
51Testing软件测试网 A_3kl [%Mn5}GK
在考虑如何进行这样有趣的 项目之后,您打定了主意,决定检验中间层的单元测试套件。在深入钻研该代码之后,您注意到该窗体有两个未标记的文本框,以及三个标记为 button1、button2 和 button3 的按钮(幸运的话,它们将排列在窗体上)。接下来,在查看与这些按钮相关的事件之后,您认识到这些代码都未经注释,并且数据变量都被命名为 x、y、z。如果幸运,您还会注意到 button1 和 button2 执行该对象的 Save() 方法,而 button3 执行 Delete() 方法。执行时,您会接收到很多 System.Exception 错误,这是因为遗漏了很多配置设置。
zT;Xc Z1v0
9u?^Oz)e*u(Lbk a0这显然是一个特例,我希望多数开发团队不要进行这一试验,下面让我们看一下该方案中“单元测试”遇到的问题:51Testing软件测试网 DE&x u-T!`'F
•    
FVA Y,?8J } }051Testing软件测试网cEB M'l%k(U
这种形式的单元测试代码不是结构化的:代码充斥到按钮单击事件中并且难以编译。
;{IJTx#N0•    51Testing软件测试网|\)U e2r/ggUW

N)MwO q2k!J v'?$a0这种形式的单元测试代码记录得不太好。
a%o)CO Y0XV0•    51Testing软件测试网rb:k_)nD7{u%d
51Testing软件测试网LR"r:a8nhz
这种形式的单元测试并不基于“已知”为好或坏的数据 — 它完全依赖于输入到那些未标记的文本框的内容。
.y a7e-a&x}0•    51Testing软件测试网~`t c0nf0u

4PF9E7x!X0N:}Y t&tI0单元测试代码不能自动重复,它基于输入的代码。51Testing软件测试网0a]c9@t+V0^8ab
•    51Testing软件测试网OoYX$`9?w
51Testing软件测试网My^.x2S
单元测试代码覆盖是未知的 — 用数据指示实际测试的代码量。
dz3TK hm!X%nTS0•    51Testing软件测试网![-OOl8WV O
51Testing软件测试网$@/F/eFB0vD0s$S'M
实现的详细信息不易于在团队成员间进行传播。
,e/^$d9?\wN?2M0 51Testing软件测试网}$m.i:r!ZX
输入自动化单元测试51Testing软件测试网G:j8DGc:WY

W&y!S6Y,m`0xUnit 框架在 1998 年作为 eXtreme 编程的核心概念引入。它提出了一个有效的机制,有助于开发人员将结构化、有效且自动的单元测试添加常规开发活动中。从那以后,该框架演化为针对自动化单元测试框架的实际标准。51Testing软件测试网7Q}5F]#KSb
创建自动化单元测试的用例51Testing软件测试网&xb0J lWW

?#H;w _-i9o ? s TO0简单说,自动化单元测试是:51Testing软件测试网? [u)Pv `3WWM
•    51Testing软件测试网 Z]OQI"x
51Testing软件测试网*Vv6H{H
结构化的。51Testing软件测试网+Nq HV7b(D
•    51Testing软件测试网2R w,@$}!tcU

xnj8f(@0t-R0自行记录的。51Testing软件测试网4saVY }"o FvCy
•    51Testing软件测试网"G!Q7B"M9I%p
51Testing软件测试网"XO$OB!BB
自动且可重复的。
ERE)vj$oy Q0•    51Testing软件测试网9E6v$NHiM)r{N
51Testing软件测试网-_,t:BSpWu0\ u
基于已知数据。51Testing软件测试网b;iX"]jX7pm-c,[
•    51Testing软件测试网u!A)@ Xw
51Testing软件测试网J CqP H`,ce1l
旨在测试积极和消极操作。51Testing软件测试网V }/h z7Q o G~}
•    51Testing软件测试网K3a5t c@p)RRsz
51Testing软件测试网"w*??;c iN&\@:E)o
非常适合跨不同计算机的测试实现。51Testing软件测试网afArF
•    51Testing软件测试网mK&P3Zp _D
51Testing软件测试网 ? yO9EKZlM
配置、实现和执行的示例。
aj(h_-Z0xUnit 框架元素
!M7Jo8B:|a#L*z#a051Testing软件测试网/\~V+v4U!cY
表 2 分析 xUnit 框架以及对应于 Visual Studio 2005 Team System 的 Unit Testing Framework 等价物的基本概念。
XL+C,wc];~0表 2. 相应的 xUnit 框架和 VSTS Unit Testing Framework 概念
.tf3Z}Tc6_/cX0xUnit 框架概念     VS 2005 等价物(参见下面的属性)     描述
ik cn\ G2g0
!{m q+r%?6]0测试51Testing软件测试网-er sp6K.B K!L
   
2X-S i]S D+l4Q5z{!I051Testing软件测试网DE` Kr.z}*o5P
TestMethod
/[\ P$]2@7g0   51Testing软件测试网XHq3r U+XeL

3\Z2hU'Q5y0简单说,这些是您的测试。测试预期结果的逻辑,并报告未取得结果(如果有)。请将它看作您的“方法”。
z#@!u!c!F3D:M%g}+p051Testing软件测试网VC/I8eg
测试装置
2@'JL T3J9H(S9D |3Td0   
w2au,]2IOS*Z051Testing软件测试网Af"|.K/F0{
TestClass
%br'^"k4o"ih7x0   
3l[,O&V*khQ,\051Testing软件测试网"\#mx9yR*a)W[9m
针对大量测试的一个逻辑分组。请将它看作您的“类”。51Testing软件测试网(\q'i,WA:C

-q'W'[z]|/A0测试套件51Testing软件测试网F?"Ka0WY{{
   51Testing软件测试网&S#R,@+a5X

dG3{I-ia|0测试列表 **
4f!EK7]j0   
/KTaYt2OeR!Z051Testing软件测试网NE'H)N/@$f2u}-xV
针对大量测试装置的一个逻辑分组。请将它看作您的“类库”。
W$`B0B2yc0
:T,s1WiU2Qu,v0注不需要一个属性。
2I,v.^ @,mG-W&nJ0
dz ^P](B6L U8K mB0测试运行器51Testing软件测试网 CNM!q4P]FP
   
dw6f`!Ec u0
!NhIH(e)J0{0VS 2005 VSTS Unit Testing Framework51Testing软件测试网,[6m$mV3_H,U.F
   
`Xf^(A NM:C"c3a-M051Testing软件测试网/M kz'Kp bK%A1zh
GUI/Console 应用程序负责发现、执行和报告测试结果。Visual Studio 2005 Team System 将作为本文的测试运行器。51Testing软件测试网J K#~8V B)T
测试装置示例
xrWn"w8sF q0
WxMH sq0请考虑以下针对 BankAccount 类的类关系图,以及一个示例测试装置 (BankAccountTests.cs)。51Testing软件测试网 b4K g/Ldqj T
51Testing软件测试网ttL jL_JeTu
图 1. BankAccount 类51Testing软件测试网$T~2Ze/k.z:d
示例测试装置: BankAccountTests.cs51Testing软件测试网U#S1E5YyTq K"e
51Testing软件测试网C&[VdMOqYl'{#d
using BankAccountDemo.Business;
+m M s0lr(yk0using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework;
MsT Z&T;O%r3}'`$i]0namespace BankAccountDemo.Business.Tests51Testing软件测试网M @Tc1j`d
{51Testing软件测试网7e"dlgmW4p u
    [TestClass()]51Testing软件测试网VU;eVm._Xxg C
    public class BankAccountTest
.L'`;E;eRgR5s)q0    {51Testing软件测试网;j&[H|,H'W8c
        [TestInitialize()]51Testing软件测试网"\ i t0J/b1nY&Y8N
        public void Initialize()    {
nl0E&K{T [I0        }
j,KHM$kzc D0        [TestCleanup()]51Testing软件测试网/F-\v(y:D4a
        public void Cleanup()   {
-P,Hf+rw5@]m0        }51Testing软件测试网4J$CcT{t*N
        [TestMethod()]
!Mr2y` ^3E+f+~y0        public void ConstructorTest()   {51Testing软件测试网 U-? u6b-G"CUnr
            float currentBalance = 500;51Testing软件测试网r!q&v'pT|&M
            BankAccount target = new BankAccount(currentBalance);51Testing软件测试网U a!C Ke s_
            Assert.AreEqual(currentBalance, target.CurrentBalance,51Testing软件测试网$jdt)ff(aS%~1o
                "Balances are not equal upon creation");
'S6W,{ryK&WMc0        }51Testing软件测试网O^ kXa
        [TestMethod()]51Testing软件测试网XE.gw!y
        public void DepositMoneyTest()  {51Testing软件测试网XYUJ3O
            float currentBalance = 500;
$`#hB'e~;Tj:gML0            BankAccount target = new BankAccount(currentBalance);
-{Y%DM\)W0            float depositAmount = 10;51Testing软件测试网7L}.frH"i i.ln6F
            target.DepositMoney(depositAmount);
h Gk'KXYS0            Assert.IsTrue( (currentBalance + depositAmount) > 51Testing软件测试网MoFBSLgOz
                            target.CurrentBalance,51Testing软件测试网2j:v]%EY \4Yl8^~(FK
               "Deposit not applied correctly");51Testing软件测试网 a2h'xJE9Sk
        }
w s8r g/E0        [TestMethod()]51Testing软件测试网#tpNQ/kD Pb i_8@
        public void MakePaymentTest()   {51Testing软件测试网4X"Tv[y
            float currentBalance = 500;
(ZQt4A t\{B@0            BankAccount target = new BankAccount(currentBalance);
4aog/g;T$[uDR0            float paymentAmount = 250;51Testing软件测试网ix/x%jyA}8C
            target.MakePayment(paymentAmount);
3Mg7@;[n5y'KX v\0            Assert.IsTrue(currentBalance - paymentAmount ==51Testing软件测试网)|BX*F Rq
              target.CurrentBalance,51Testing软件测试网d;G{/KzP? L\
                "Payment not applied correctly");
6[P%W&u"sD lUg4]0        }
L^*?v Cai?0    }51Testing软件测试网Gw9Ud)K"A
}51Testing软件测试网-[^KkR u |S
51Testing软件测试网DsUo z6nL*H
主单元测试概念 == 断言
(Dd `6^6dK0
x[ x1x U0用于该形式单元测试的主要概念是,自动化单元测试是基于“断言”的,即可定义为“事实或您相信为事实的内容”。从逻辑角度看,请考虑该语句“when I do {x}, I expect {y} as a result”。
K?Ra? ]051Testing软件测试网d(M5}D5zl'g+M[
这可以轻松地翻译为代码,方法是使用 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中可用的三个“断言”类中的任一个:Assert、StringAssert 和 CollectionAssert。主类 Assert 提供用于测试基础条件语句的断言。StringAssert 类自定义了在使用字符串变量时有用的断言。同样,CollectionAssert 类包括在使用对象集合时有用的断言方法。
1n/R6|]E [051Testing软件测试网Oy*t+Cq^9b)_lq
表 3 显示可用于当前版本 Unit Testing Framework 的断言。51Testing软件测试网0wBz)Rk$j5X"R
表 3. VSTS Unit Testing Framework 断言51Testing软件测试网)P6N gAQW g e5X
断言类     StringAssert 类     CollectionAssert 类51Testing软件测试网.?5qLe(eD7F]
51Testing软件测试网 p9@^`-uco
AreEqual()
B{#E#}8_(Y0AreNotEqual()
!X^5}"Q]0AreNotSame()
1T;Z*i2](}8s DS0AreSame()
~"pM f3J+fx#c0EqualsTests()51Testing软件测试网R%`/RODq
Fail()51Testing软件测试网0PzY@pi
GetHashCodeTests()51Testing软件测试网c&ZA;Aek7T
Inconclusive()
!T [n7i}J:Ase0IsFalse()
D!U#~3E O&W0IsInstanceOfType()51Testing软件测试网-_D6H9U:B+b2NX
IsNotInstanceOfType()51Testing软件测试网}6k~n0Dp,a
IsNotNull()51Testing软件测试网PDBK._A'p
IsNull()51Testing软件测试网c-K5k8p {-@
IsTrue()
~+?SI7\G?051Testing软件测试网:\o3el~}c
   
6IVM MKn051Testing软件测试网!N%_ Q$\/AGz$q
Contains()
8Qz&^8s!w,hE0DoesNotMatch()51Testing软件测试网p_&M-{LM4A)^
EndsWith()
e?4Db l L0Matches()
~z` w d0StartsWith()51Testing软件测试网 g&R\#di*d1U([,dZ
51Testing软件测试网7Rt?(|3H^2U
   
3i1`;T-|+E%}-{t051Testing软件测试网c:}Cm8@~ie6V
AllItemsAreInstancesOfType()51Testing软件测试网)tz5xO S3f)[
AllItemsAreNotNull()51Testing软件测试网 Lt,I+EL;k(q:K$C9T pk
AllItemsAreUnique()
dA4R(Yx7V0AreEqual()51Testing软件测试网^8s!MI?
AreEquivalent()51Testing软件测试网 ?_&\"g"I ~a-kl
AreNotEqual()51Testing软件测试网%`0z*i K `4E%p e;qr
AreNotEquivalent()51Testing软件测试网1Ky%M'@ i mR;x
Contains()
x&h0h.g6E#f-x!` g7lX0DoesNotContain()51Testing软件测试网9wB7i%Q\
IsNotSubsetOf()
*C(f+Z/V)t,k3u0IsSubsetOf()
*X0s%E*|6o(w%^051Testing软件测试网Nv8D;SpRA4Q*thB
这些自动化单元测试用什么运行?
0DJGtrK0
x!b |K5d-jJ0正如前面提到的,xUnit 框架将“测试运行器”的概念定义为应用程序负责:(a) 执行单元测试;(b) 报告测试结果。对于本文,包含 Visual Studio 2005 Team System (VSTS) 的 Unit Testing 引擎作为我们的“测试运行器”。图 2 表示 BankAccountTests.cs 类的执行结果。51Testing软件测试网o~H;m'P"zNi
51Testing软件测试网xK5S9kOLn
图 2. 测试结果窗格:单元测试执行结果
5k#^6x!?;]-RSF0
S7p3S _@ A0Microsoft Visual Studio 2005 使用源项目的代码模型动态填充该视图。它基于该源代码中的自定义属性动态发现有关该测试套件的信息。表 4 表示最常见的单元测试属性(以及执行的次序)。51Testing软件测试网*}l:WD`7P:@d`%LT
表 4. 常见单元测试属性51Testing软件测试网rsGDk#a
属性     描述
e p.~%l Wp8`(O0
:H'Ik(o7L q+k0TestClass()
x"?yN#}-Ct0   51Testing软件测试网2h%D N1j*k L
51Testing软件测试网(w:a \Ca
该属性表示一个测试装置。51Testing软件测试网:H`Z(X#vj;h+iO
51Testing软件测试网/VT/F l rws
TestMethod()
-Rv#~ yG0   
f7F EpJ0
j(M a4wFe6W+^0该属性表示一个测试用例。
2vj0ICt Jzo0
W7q7]uXS0AssemblyInitialize()
*Lhq`o0   
B8~O"JZ"R6Z;Ve051Testing软件测试网 ma,JY1a#Z
在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之前,执行带有该属性的方法。
_7@9PA[I%F,N0
I?yNd#KF R4m0ClassInitialize()
\7D0n{*H)_:AR.~1L;G0   
h^2?A r0
KF2GCQB \:~0带有该属性的方法在执行第一个测试之前调用。51Testing软件测试网6Z#c}8E^@W
51Testing软件测试网)S'f)H'f0x'Xm/B,[
TestInitialize()
oe%j#j"h4m6V ko0   
1f%P3n3nR;k#nv-G4L.u0
ueh6J O.u8lu0带有该属性的方法在执行每个 TestMethod() 之前调用。51Testing软件测试网~|*} UAO%N6y

2k5Rd9e8Y,~]0TestCleanup()51Testing软件测试网5R!x2{:i5P9r u
   
,~!^#m FM}051Testing软件测试网i#u XIy5edp
带有该属性的方法在执行每个 TestMethod() 之后调用。51Testing软件测试网 @)}0N'vs e,B }

-`0^#{7|*m9M0ClassCleanup()
|*GwBP r/m0   
S^W2a1_ Pd+C0
N stgAN0带有该属性的方法在执行 ALL 测试之后调用。
MvGRJ3{2E1Fu N0
Ny` S7x\0AssemblyCleanup()
@ VvGE"M0   
gb0ZvcHe!u&S0
I%A!n`4mG5y0在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之后,执行带有该属性的方法。
/P _}%SJ)O0
}/u M2rs'An.IU0Descrīption()
W[3Y:B U0   51Testing软件测试网 k7TSdKo G

#V.j9|)l^#^1U~0提供关于给定 TestMethod() 的描述。51Testing软件测试网t*S5[2N*x9A8L6^!W
51Testing软件测试网&v ZVp?wA K
Ignore()
T _g.S tz8M`6s0   
+p `%H-lg3d5s051Testing软件测试网 `qU3X\ }*zS!g+^
由于某种原因忽略 TestMethod() 或 TestClass()。51Testing软件测试网6oPB9No ^%K}p
51Testing软件测试网VM|Z+P Z
ExpectedException()51Testing软件测试网5}R'lf!H#~A
   
5V~V:J1s+op'Z;K7z(v0
,j#ce\r3Nez+H0当测试特定异常时,如果使用该属性指定的异常不是从实现代码引发,则测试不会失败。51Testing软件测试网[#dO ]f.{;m*z2d
我编写什么类型的测试?51Testing软件测试网}C2_(d/cD
51Testing软件测试网V.b5D%cW OgV8Je
一个方法及其相关测试之间很难有一对一关系。编写自动化单元测试需要开发人员“进行全面思考”,并了解关于对象的所有内容 — 它将如何消耗、使用、处理,以及在任何情况下如何起到积极、消极、非决定性作用。51Testing软件测试网1jtr_ Su"C L
51Testing软件测试网`"rzi~N j^w$J
例如,请考虑一个用于针对数据库中 Customer 项执行 CRUD(创建、检索、更新、删除)功能的典型对象方法。对于该对象的 Load() 方法,要针对以下方案编写测试:
B \[a'i*VT9TU0•    51Testing软件测试网7fOV5khx9[%_w.Oiy
51Testing软件测试网.e aOAN1X
构造函数测试 — 确保对象正确加载,带有正确的信息。51Testing软件测试网,_5`~&u3Y}'rQ7C
•    51Testing软件测试网} jpc:}?
51Testing软件测试网S*t%]*?GJ
PositiveLoadScalarTest — 测试数据库中一个 Customer 的成功加载。51Testing软件测试网\5|mL#Fs
•    
4Y~0Q TU ZZe051Testing软件测试网#k+S'f`?,ZXm&_6[
NegativeLoadScalarTest — 测试一个 Customer 的失败加载,即该 Customer 不在数据库中。
oL0][%D#Mjk0•    
J5R!U5N5~9s i%A? h051Testing软件测试网2E8u"O1Z{
PositiveLoadTest — 基于已知数据测试 Customer 的成功加载。
J&YG q'X7R0•    51Testing软件测试网;TK6{}v mq
51Testing软件测试网]*e,gF+@;]{s
NegativeLoadTest — 测试数据库中不存在的 Customer 的失败加载。51Testing软件测试网$U0b7U [t F
•    51Testing软件测试网E!iGbf@
51Testing软件测试网8R_ Mfc-d5u
NegativeValidationTest — 确保验证逻辑正确工作。
tV8ta;t3Fu K G-_0
u!d9X6i~0这些只是自动化单元测试套件许多用法中的一部分。我曾经听说一个小团队使用单元测试查看针对其组件的已知安全攻击。从宏观的角度来看,单元测试应该明确保证组件的正常使用。具有丰富的测试集将使团队确信您已经准确实现了既定的目标:编写有效的软件。无论自信源自哪里 — 这就是您需要编写的测试。
-r2?:D|E2`9u9m0您测试什么?51Testing软件测试网i)]5ub+as&NdD
51Testing软件测试网5~K_u4V%yd*J
从本质上看,这些自动化单元测试非常低级。它们旨在测试下至构造函数、方法调用的对象,甚至是对象上的属性。51Testing软件测试网:[~ X:f7o

k4l/D+}m0关于“公共对私有”的主题在单元测试派系中引发了许多争论。许多人认为单元测试只应该测试对象的公共接口。其他人认为应该测试每个调用 — 包括内部私有方法。VSTS 支持两个单元测试级别。VSTS 通过使用私有访问器或包装类支持私有测试,后者提供基于“私有”方法和属性生成单元测试的功能。51Testing软件测试网S7K\j{6j*b,[jg
 51Testing软件测试网C y&e6b:Ud'xu
为什么生成代码?51Testing软件测试网?cw;i~;Qy[
51Testing软件测试网9TB i9zz,Tj@1n
阅读上面的列表后,您可能会想起前面项目的单个对象,并思考:“如果我用“这些”对象进行该操作,就需要编写大量代码!”请考虑开发人员仍编写“单元测试”代码的事实 — 只在不同的窗体(例如,前面提到的 WinForms 示例)上进行。此外,具有可自行记录、可重用的实现示例带来的好处远大于生成更多代码所带来的麻烦。最后,在单元测试中设计更多的环节已证明可以减少质量保证环节中的故障。51Testing软件测试网M(r3Q-BV J%X4d
51Testing软件测试网.a ?_-{~
正如前面所提到的,代码生成是“软件创建软件”的过程。基于可重复的过程创建代码是理想的。例如,一些使用代码生成的较好示例包括:脚本数据、创建表示实体及其在储存库(数据库 CRUD)中存在的对象,或者创建适用于数据维护的 UI 控件。使用代码生成的好处包括:
Pv2fq3MNi(Bl0•    
L:y![[I%r#}r'J JDy0
nFv+{ O9c%P0节省时间 — 为什么花几小时/天/周创建一些在几秒/分钟内就可以创建的内容?
\uQI!e{0•    
l3N:v c D7V:eG051Testing软件测试网DH9jI&hk4Q
强制标准/约定— 对于强制您的标准和命名约定而言,没有什么比消除开发中的人员因素并依赖基于“您的”规则的可重复过程更好的了。51Testing软件测试网$eG8S^+i-s]-H
•    
o&L,O.U1b051Testing软件测试网/a3m `V i:T
测试私有方法的功能 — 正如本文前面提到的,Unit Testing Framework 提供使用“私有访问器”类测试私有方法的功能。该代码生成引擎创建与这些访问器类相关的所有“基础代码”。
2pgT&r$ub7R*k*x0•    51Testing软件测试网 _ A;G.iUF w J`
51Testing软件测试网b.`p%K1{QC"P
获取现有组件的信息 — 搜索另一个开发人员的组件吗?基于这些组件生成代码可能提供关于该实现以及该对象接口的简明示例。此外,进行设计并在编码之前“清除”其对象的公共接口(例如,通过使用 VS 2005 类设计器)的开发人员将极大地受益于代码生成引擎。51Testing软件测试网{l Lt[
51Testing软件测试网:e"G.j@q
正如您所预期的,自动化单元测试属于“优秀代码生成候选者”。在现有组件中指出一些内容并针对这些自动单元测试生成初始代码难道不是很理想吗?而且不只是保留单元测试框架,还会围绕对象的公共接口生成实现示例吗?将来的 Visual Studio 2005 Team System 用户将拥有该功能以及更多功能!51Testing软件测试网-I:]Mj)SV6l)Bg z
 51Testing软件测试网v.YHYlss1Kf
让我们生成一些代码吧!
DRo`'J/QZ0J [H0
U:isT9xe7h&E0本例中,我们将生成本文前面提到的 BankAccount 类的代码。本文的这一部分旨在为您介绍代码生成过程,并重点介绍所提供的功能以及从 VSTS 使用 Unit Testing 引擎的好处。
F2w!Q&u1bo.T0第 1 步:创建您的实现代码51Testing软件测试网Y^e7O d5z2U

?C ixZn|0首先,我们创建一个将用作应用程序的业务层的类库项目。
$xnZ0c&@0
_:R3U#Xw&r/cJ0要在 VS 2005 中创建该库:51Testing软件测试网6{D D(M(sqD

[9Zl0Q`,Q01.
:W@8[ Q;\;{~ J0   
UZ}e!n,DO.FY#K)Z051Testing软件测试网8B ^6l[g6j q:I#E
启动 Visual Studio 2005 Beta 2。51Testing软件测试网2Zi2m~D.FL){

,J%C:`TYyF-Yt02.
f |']krf0   51Testing软件测试网6Ms},l"C-Io
51Testing软件测试网:yEg}2K Zm7o?-f
单击 File | New | Project。
U8h]h*g051Testing软件测试网 `+v:`ZvtpqI^
3.51Testing软件测试网*c\![e~"go
   51Testing软件测试网_r a+i!J h6e8x&po
51Testing软件测试网6u1\9{"n#|E
选择您选定的语言 Windows,并选择 Class Library 项目模板。
U6B1Ow!U"qS!X#jR"Oj0
N yQ0L3v8O)l6Dq$`04.51Testing软件测试网{Bcu;Kd8G q1N
   
0E1\A7m `7n:}j{0
3??/Gi)oOQGs0将 Name 和 Solution Name 设置为 BankAccountDemo.Business,选择一个位置,并单击 OK 来创建该类库。
m}Mp2E6X `051Testing软件测试网],?!B ^,ke.Q
VS 2005 创建该类后,下一个任务就是创建针对您的项目设计的 BankAccount 类。为此,需要执行以下操作:
pf7Y0gJ'p'dc0
4n.] so&V4O0mdr01.
!x:SV9ZP9w;?0   
L_T E_\5w Mk;V0
3D3}7HN8z je2dV*t.W0在解决方案资源管理器中单击右键,并单击 Delete,从项目中移除该文件并将其从硬盘中删除。51Testing软件测试网#z V7F vl8r

6Y/OF YQ#Co\Ys02.
|PWF8G0   51Testing软件测试网C.jsZ Fe tI
51Testing软件测试网:QT r_ EE&F"O#Y@b3@
右键单击 BankAccountDemo.Business 项目,然后单击 Add,之后单击 Class。51Testing软件测试网jjV*J{f8J5EP
51Testing软件测试网bLG d!wE }.X8s
3.51Testing软件测试网9n.z @$t#ubE3C&y:e
   
z*b]*q3{\+J051Testing软件测试网:O m9\kvtN
选择文件名 BankAccount.cs,并单击 Add 创建类文件。
ZbrT6r0f+n0
2jfi"y;e04.
W7ogA$orU0   
:{Qx0wSYq051Testing软件测试网3S v+InG9u
针对 BankAccount.cs 文件对代码进行以下更改。51Testing软件测试网;AGW sh)]_K

NVN:b P[u0using System;51Testing软件测试网[0hzI `
using System.Collections.Generic;
!z2x?rN,R%nc0using System.Text;51Testing软件测试网 h-m\Lq5wV@q@

oi DR H8Hg C5h!`0namespace BankAccountDemo.Business
/uG|n#d3MPMm~0{
5|PU-EL6R0    public class BankAccount51Testing软件测试网7A4tt j Oa(X e
    {
w#rb&U1Lj#tDl0        // Properties
/Qe[4Mua0        private float _currentBalance;51Testing软件测试网ni;b3x2B!ex sT#K

fo3d6].B0        public float CurrentBalance
1wp aVd:zD3P0        {
.Y(X|+a;ER4b8V0            get { return _currentBalance; }
^ H.G HB+u8A0        }51Testing软件测试网 NK2H#oGb

B.k2v*N5FH \0        // Constructors51Testing软件测试网9m@;l1|8NkmN
        public BankAccount(float initialBalance)51Testing软件测试网5U;p C)s a'b x
        {
Y&Z3`{o:T-bE0            this._currentBalance = initialBalance;
Ju s&xt0        }
'V:Evh{]4KW0
#]l{:KX,Nc$^ d0        // Methods
Ft Z|0awZ-t4{0        public void DepositMoney(float depositAmount)
I(uadM~b7`XS0        {51Testing软件测试网1duQDmQzJO$j#J
            this._currentBalance += depositAmount;
&Z @@+M e0        }
9DdjOV_-ul/l051Testing软件测试网 ]YEr1M/`(z
        public void MakePayment(float paymentAmount)51Testing软件测试网kts(g7^
        {
2r w`-bq)ZY0            this._currentBalance -= paymentAmount;
U6i+M6^9F0        }
'dk0f3u W*y3g2Up0    }
fpR a.p3~sv;f0
@+UE6M:i#wQ Z0}51Testing软件测试网Jm[u!V%O/o
51Testing软件测试网~eWCF6x

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