不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。                                           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!!!!!!!!

sz)TA&M{051Testing软件测试网7NG;l#h3D$u5p]!_"F4Y
    51Testing软件测试网1]6F3\8a!U?E
简介51Testing软件测试网!r+FY#d$|P3d

/^I9q.{&O%A+f0随着业务的革新和发展,运行它们的系统也需要进行更新。随业务的发展、革新以及与合作伙伴、客户和供应商的结合,这些系统将在复杂性方面持续扩增。51Testing软件测试网2jQ6|K6U'm

/Q"RVFj0这种复杂性迫使 IT 的领导者们在开发过程中(即,在实现之前)确保质量。有一种方法可使开发人员减少进入 QA 环节的故障数量,即,针对自定义代码严格执行自动化单元测试。在开发过程中强制使用自动化单元测试可为团队成员提供有关如何使用自定义代码的示例(这些示例易于使用并自行记录)。
%vj:sH}0
3sO:F;b,Pgt0z {0使用结构化、自动化单元测试面临的挑战之一是完成这些任务所需的代码总数。(测试代码需要使用大量代码!)代码生成的概念(简单定义为“创建软件的软件”)正随着时间的快速推移而逐渐深入到团队 IT 开发之中。有些人认为代码生成有助于缩短“推向市场”策略的时间,强制内部标准/协定,并促进开发过程。51Testing软件测试网Y p,X?0fQ0H6[-~2^/r
51Testing软件测试网T|9{m8CL qI
Microsoft 认识到这一需要后提供了一个功能丰富、带有下一代开发平台 Visual Studio 2005 Team System (VSTS) 的代码生成引擎。本文提供针对单元测试代码生成的循序渐进的指导,并深入探讨如何在用例中使用。
B Q!B~;},B0 
iY.bZ[/l/P |0重新思考单元测试
3un@Ig4_l0T6}h0
5Xe F[S:e0请考虑以下情况:您负责为公司生成下一代系统,同时您是较大的开发团队中的一员。您是 UI 开发人员,负责尽可能多地创建 Microsoft ASP.NET/Microsoft WinForms。您依赖“中间层”团队完成其中间层组件 — 这些组件用于执行数据库 CRUD (Create-Retrieve-Update-Delete) 以及与该系统中每个实体相关的业务规则。
,Da U m2ObD f?0
4C[1OG$dKH sS0经过几周的 UI 开发,您完成了窗体并且收到了中间层开发人员打算向您提交其类库的消息。下面提供一段对话示例,说明我们大多数人在开发过程中都会遇到的一些事情。
h&bP-AL8Zn`0UI 开发人员和中间层开发人员间的示例对话51Testing软件测试网5d*S?f i'j1t

t `5O&?DF0中间层:51Testing软件测试网3dy PFh,k{gQu'E^
   51Testing软件测试网 r3kj.m6q.g

R t;VyU|-GA[0“这些对象随时供您使用 — 为此,只需获取 OurSystemBL.dll 的最新版本。”51Testing软件测试网h%Q/Ou2}o]
51Testing软件测试网(l$c3Kl"b
UI:
j0EB bYa(e2Dh0   51Testing软件测试网 g*aB __P-z?@
51Testing软件测试网{0oA#\ J ~9X/p
“谢谢。您有供我们查看文档吗?”
a$atTq;p051Testing软件测试网2~.q;v},Y_A9K;TMU
中间层:51Testing软件测试网{\V$di|
   
%s+MCR8@[f%fq0
Q7RZ.dZ[0“哈哈!是的,当然有!我们花了很多时间编写它!请查看 Design Document — 噢,请等一等,它还没有完成……(不久之后即可完成!)”51Testing软件测试网0VI`IX"[X
51Testing软件测试网u+MAy-U
UI:51Testing软件测试网X]O*@:] K
   51Testing软件测试网 J(fVZ*PD'`+b

%Wr/DG{m:L3\-Ez0“您使用 XML 文档了吗?”
(J:X0f|5Zi%G0
%XO+Bp I N@0中间层:51Testing软件测试网 bwq:eNXk*^
   
8f dYT v'Bx#fv0
/k9d"qz;D&BFd2H0“在构造函数中,但许多方法都不使用。”51Testing软件测试网:t%w WUE]+V/n

roe%Ng7DZ4Y/M,S#e`0UI:
&azX:[KkA0   51Testing软件测试网_8q J4u2u!]Xj
51Testing软件测试网f&s!a)O'Mv$D
“显示如何创建、执行并删除对象的示例代码,怎么样?”
Z3N lQ X/x,T}j;[y051Testing软件测试网6mN6L+k@q9H
中间层:
Y}4E7j1o B0   
X)n(K2QR2?*{051Testing软件测试网4k Tu;vX'F
“我已经附加了一个示例 WinForms 应用程序(从我的工作区),它应该能够提供一些您所需的内容……,虽然它不在 Microsoft Visual SourceSafe 中。”51Testing软件测试网#U(V3W+I$|d@ ^6nZ L

[8qHt0hJ Z;_kh0在考虑如何进行这样有趣的 项目之后,您打定了主意,决定检验中间层的单元测试套件。在深入钻研该代码之后,您注意到该窗体有两个未标记的文本框,以及三个标记为 button1、button2 和 button3 的按钮(幸运的话,它们将排列在窗体上)。接下来,在查看与这些按钮相关的事件之后,您认识到这些代码都未经注释,并且数据变量都被命名为 x、y、z。如果幸运,您还会注意到 button1 和 button2 执行该对象的 Save() 方法,而 button3 执行 Delete() 方法。执行时,您会接收到很多 System.Exception 错误,这是因为遗漏了很多配置设置。51Testing软件测试网-A5y&Pn#`o4]
51Testing软件测试网,\;QtrK_
这显然是一个特例,我希望多数开发团队不要进行这一试验,下面让我们看一下该方案中“单元测试”遇到的问题:51Testing软件测试网0Pi'\ u)}w+lP
•    51Testing软件测试网w0h-n;v9K8v#R
51Testing软件测试网tCVT4q!t,e
这种形式的单元测试代码不是结构化的:代码充斥到按钮单击事件中并且难以编译。
5G\5DU:Bu!M0•    
:D(s9hiO7V#r6[*t#S051Testing软件测试网4V|J G.{-| @{S
这种形式的单元测试代码记录得不太好。
y4V,h8~2~0•    51Testing软件测试网T;~6w&jI^J&k
51Testing软件测试网1}L&C*x\/m[1x
这种形式的单元测试并不基于“已知”为好或坏的数据 — 它完全依赖于输入到那些未标记的文本框的内容。51Testing软件测试网;]%t}yYQ
•    
w2z)sV*A _(h051Testing软件测试网GGm\PVQK
单元测试代码不能自动重复,它基于输入的代码。
TM3hL3x6I z![yY@0•    51Testing软件测试网&UQ ~n2L(nm

8CT's`iF0单元测试代码覆盖是未知的 — 用数据指示实际测试的代码量。51Testing软件测试网7u*N'i`'G7\G B
•    51Testing软件测试网 N DS/HwT

.J6W/X*X ttwR,Q0n0实现的详细信息不易于在团队成员间进行传播。
pR d}*~q"\"]0 
4T5kdD~;d0输入自动化单元测试51Testing软件测试网 u#@%N+Jb9H(o1u

!X+n6C/K:_g?M0xUnit 框架在 1998 年作为 eXtreme 编程的核心概念引入。它提出了一个有效的机制,有助于开发人员将结构化、有效且自动的单元测试添加常规开发活动中。从那以后,该框架演化为针对自动化单元测试框架的实际标准。51Testing软件测试网 N svLLc E
创建自动化单元测试的用例51Testing软件测试网I6d+b XT c Li

B$OG#p U+Nt0简单说,自动化单元测试是:51Testing软件测试网cH;v#ST3Do
•    
'OG%Hvg `/`1]051Testing软件测试网p6Wh*?INC
结构化的。
$oO"]/M)I P }0•    
EG+| lFpQb zq5wv051Testing软件测试网|M3N2x3o+zY%k
自行记录的。
`7hUd6R.C0•    51Testing软件测试网 q} {z*OJ)_{
51Testing软件测试网,XG9d0@7ZNB&SH
自动且可重复的。51Testing软件测试网CM K4`(YT
•    51Testing软件测试网&tC"g,gE q$}3_8_4N

|{1F7n*y]9P0基于已知数据。
%K't%`MS.~)V0•    51Testing软件测试网+Z'D.I#Z#k(b&II k o
51Testing软件测试网N'H6@+ed+M~/P
旨在测试积极和消极操作。
s0rSb4@\)T;d.k,I.N0•    51Testing软件测试网Uvu#_'KR\m j$D

`vI]*t^A}0非常适合跨不同计算机的测试实现。
"GI}Pt,r`'cp4d0•    51Testing软件测试网(Y;c!F{N
51Testing软件测试网kf?5p9](P
配置、实现和执行的示例。
Zv} }2]Rq0xUnit 框架元素
[_a8YH%he8e0
"\ Uizk H2w w0表 2 分析 xUnit 框架以及对应于 Visual Studio 2005 Team System 的 Unit Testing Framework 等价物的基本概念。51Testing软件测试网#G+e+n~9k$v`
表 2. 相应的 xUnit 框架和 VSTS Unit Testing Framework 概念
[,Z&mM3Giw+Y|0xUnit 框架概念     VS 2005 等价物(参见下面的属性)     描述
!fXZK ku-f051Testing软件测试网[^$Q*Z5YGqkk
测试51Testing软件测试网5n%Cvu3b
   
,r pF|zFb0
Ra(uyZh9tQ?0TestMethod
1FfaG6W-h0   51Testing软件测试网9W X{ M[x/r\
51Testing软件测试网#T%Y"sU^f1^`
简单说,这些是您的测试。测试预期结果的逻辑,并报告未取得结果(如果有)。请将它看作您的“方法”。51Testing软件测试网 H9p|iq F_i%H$i h
51Testing软件测试网J,H arO0JT.B
测试装置
E"H-` eq#v0   
MM*[9_%\Y+f051Testing软件测试网l SQ q)LOj
TestClass51Testing软件测试网 n r y \)KCnA
   
*u)S,u@!ywRJw051Testing软件测试网vq!NF%E#X
针对大量测试的一个逻辑分组。请将它看作您的“类”。51Testing软件测试网dKd[:p

F*s"JUH]1f3cz\0测试套件51Testing软件测试网HYU4K)dRK'v
   
^c ?*f(U M0
fXM ?&F-Z,Ns0测试列表 **51Testing软件测试网LC0Yq'xf,b`"| I
   51Testing软件测试网B?,O!@n5q

Q1EEcoPy8k0针对大量测试装置的一个逻辑分组。请将它看作您的“类库”。51Testing软件测试网f]4|(d.sr
51Testing软件测试网k.B X!] q]i BUt
注不需要一个属性。51Testing软件测试网 H:dx3n3y'v

({ {{c%]N1Dj_ni0测试运行器51Testing软件测试网{6o gil+?u%d
   51Testing软件测试网KxR8x^ ?
51Testing软件测试网g Z3J;w\B Hu
VS 2005 VSTS Unit Testing Framework51Testing软件测试网P&UL9t,?
   
)G8`-j)d?!r&z0
JE G(Y#o{-h0GUI/Console 应用程序负责发现、执行和报告测试结果。Visual Studio 2005 Team System 将作为本文的测试运行器。51Testing软件测试网 FZ C.U(@*_.p GP
测试装置示例
(bO*^~kZC]^,i051Testing软件测试网Nv2E&t&IR
请考虑以下针对 BankAccount 类的类关系图,以及一个示例测试装置 (BankAccountTests.cs)。
6~KvA!|8g)?051Testing软件测试网C{ };D^9{.y|b
图 1. BankAccount 类
NJpS-U,q%h)]qI0示例测试装置: BankAccountTests.cs51Testing软件测试网&S ob Aq5sT7K

N CY,`}7y p0using BankAccountDemo.Business;
Tt!x2[,R#tn q0using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework;51Testing软件测试网_},Ta}}Iw
namespace BankAccountDemo.Business.Tests51Testing软件测试网A-k$~z8h+_ v
{
%|9X-pq[\0    [TestClass()]51Testing软件测试网:l7P H4{~6G XAhK
    public class BankAccountTest
!]!P r^&p:D$A0    {
6RE*c`i1PK Y0        [TestInitialize()]
#I,qli6i0        public void Initialize()    {51Testing软件测试网J~QI b,o?E9me
        }51Testing软件测试网w;E8DP/f H3o
        [TestCleanup()]
Y x S}O^ut0        public void Cleanup()   {
PBX}V[:jv,F0        }51Testing软件测试网~H3s7d%I?_(T
        [TestMethod()]51Testing软件测试网6SIh1ur6x
        public void ConstructorTest()   {
B6Hze)R _Az%W0            float currentBalance = 500;51Testing软件测试网;a1[OqF5`i8Nr
            BankAccount target = new BankAccount(currentBalance);
$mMj].D(C&QhV0            Assert.AreEqual(currentBalance, target.CurrentBalance,51Testing软件测试网 {p ?~ X n)a;\-g#W
                "Balances are not equal upon creation");
!F*u+A6iw6c8@9HK/^0        }51Testing软件测试网j+IbN0` B^
        [TestMethod()]51Testing软件测试网z6y7X L"};F @/~9uc*p;C
        public void DepositMoneyTest()  {51Testing软件测试网/P-{*Nd3f ~+`sT
            float currentBalance = 500;51Testing软件测试网#T#?2V.MK+x)C
            BankAccount target = new BankAccount(currentBalance);51Testing软件测试网/L+nbt~ hQ;w5Z_
            float depositAmount = 10;51Testing软件测试网*g8~:eBngNW&G
            target.DepositMoney(depositAmount);
a9Bn;k0JT2cR0            Assert.IsTrue( (currentBalance + depositAmount) > 51Testing软件测试网$BXN,kY.~&E^5hl5e
                            target.CurrentBalance,
C{1jpSemn0^0               "Deposit not applied correctly");51Testing软件测试网z/fq'e6R0wBC_f K
        }
}$H:r"j9V0        [TestMethod()]51Testing软件测试网eB_Rm }i[RT7U z
        public void MakePaymentTest()   {
w7ge,y6IK(ZgF0            float currentBalance = 500;
j?LBY [0            BankAccount target = new BankAccount(currentBalance);
V\z(AFX0            float paymentAmount = 250;51Testing软件测试网E/I2Ffo G
            target.MakePayment(paymentAmount);
GS0FPu#B0            Assert.IsTrue(currentBalance - paymentAmount ==
4p4W1kxJ?l0              target.CurrentBalance,51Testing软件测试网;S Z5Z7]/C ` y0A
                "Payment not applied correctly");
9z9A.fp \h9_0XB0        }51Testing软件测试网(g l3^b[,lTby
    }
v i9[Oh0}
x+^o4b o*T051Testing软件测试网!oK!G&e#I$G*D
主单元测试概念 == 断言51Testing软件测试网 jmw8J:oK*b
51Testing软件测试网$MQ-FL{^
用于该形式单元测试的主要概念是,自动化单元测试是基于“断言”的,即可定义为“事实或您相信为事实的内容”。从逻辑角度看,请考虑该语句“when I do {x}, I expect {y} as a result”。
`2A*i9n!w)Xh`051Testing软件测试网!e S$XNk(x#iS
这可以轻松地翻译为代码,方法是使用 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中可用的三个“断言”类中的任一个:Assert、StringAssert 和 CollectionAssert。主类 Assert 提供用于测试基础条件语句的断言。StringAssert 类自定义了在使用字符串变量时有用的断言。同样,CollectionAssert 类包括在使用对象集合时有用的断言方法。
;{.qW.}+\h0`$}0
h@ aueZd0表 3 显示可用于当前版本 Unit Testing Framework 的断言。
!}.b;HtY"^0表 3. VSTS Unit Testing Framework 断言51Testing软件测试网l!N J1s2Ak?@i
断言类     StringAssert 类     CollectionAssert 类51Testing软件测试网yt/F(\9u F}d

Y.X `L'n0AreEqual()51Testing软件测试网@ Uly4R^&kkh`
AreNotEqual()
+AN(Qz[S&@0AreNotSame()51Testing软件测试网+gC K3Hw8yE
AreSame()
$q2[`2Vdk9bSy0EqualsTests()
L^/F0`4X H:J}c$h0Fail()51Testing软件测试网 TwAZ C@d
GetHashCodeTests()51Testing软件测试网ir7S+Un.Z^
Inconclusive()51Testing软件测试网5qL S@WQ)FGRG7qo
IsFalse()51Testing软件测试网 s}0jm-k NrV
IsInstanceOfType()
G9b8An'at6KT^0IsNotInstanceOfType()51Testing软件测试网/i {@ f B3L.s
IsNotNull()51Testing软件测试网t4Po$R/cY
IsNull()51Testing软件测试网.Ru'n[ h+j&n\
IsTrue()
&](b^I"V1Y/N!UM)f ]051Testing软件测试网;v*K9eCr]
   
vgw n:{0
#NjW^V/b+f$B Z0Contains()
/a:C j WH0DoesNotMatch()51Testing软件测试网_3_~@1~G
EndsWith()
X8e(wtr b KT0Matches()51Testing软件测试网1u`/_\x8]V
StartsWith()51Testing软件测试网8O9r4vF\1S&U c}

+p4\~.Pa8md0   51Testing软件测试网7R-_{ p)X?3Iv

*_ A7UB3y^8w9cY0AllItemsAreInstancesOfType()51Testing软件测试网 \CsN)\p8C
AllItemsAreNotNull()
:bYo"CkFJf0AllItemsAreUnique()51Testing软件测试网hY?Yb
AreEqual()51Testing软件测试网JH;R'`EHD
AreEquivalent()
X!K"k8eYfr:?H0AreNotEqual()51Testing软件测试网N'v u4V%l+vexRZ
AreNotEquivalent()51Testing软件测试网F Y0tu&S(WRO*U t|
Contains()51Testing软件测试网*pa ^y0n:J:^
DoesNotContain()51Testing软件测试网dUq#V&Xf [
IsNotSubsetOf()
0Uo%P8pR5P`F B0IsSubsetOf()
,?8f?BE|}h{051Testing软件测试网zQ'|6O+B0wj
这些自动化单元测试用什么运行?
5m9j }Wdh5j$M2a6L5d a0
+J7[5U!U`5Ul@0正如前面提到的,xUnit 框架将“测试运行器”的概念定义为应用程序负责:(a) 执行单元测试;(b) 报告测试结果。对于本文,包含 Visual Studio 2005 Team System (VSTS) 的 Unit Testing 引擎作为我们的“测试运行器”。图 2 表示 BankAccountTests.cs 类的执行结果。51Testing软件测试网bv0}i;aZ2P1I6I

^8H hXR%qa,r+k4P#O0图 2. 测试结果窗格:单元测试执行结果51Testing软件测试网MZ*RR lJ5Qw|

)x*k1GHzyB0Microsoft Visual Studio 2005 使用源项目的代码模型动态填充该视图。它基于该源代码中的自定义属性动态发现有关该测试套件的信息。表 4 表示最常见的单元测试属性(以及执行的次序)。51Testing软件测试网)B*s5{!CO?.[HK7O
表 4. 常见单元测试属性51Testing软件测试网c M \&tGJ
属性     描述51Testing软件测试网(c?+x1x3Ref'\HS

aK9|~^+d!g$D'Y0TestClass()
F^ WA(? X0   51Testing软件测试网&L{sY:p&D5H0\)q#rt}
51Testing软件测试网o1J za+hmsg
该属性表示一个测试装置。
i?a`3uIkc051Testing软件测试网3r9Y.~$K(T].}
TestMethod()
/r9O)y/gs~L"{0   51Testing软件测试网 TA&C*L)vy

-xt0_] O0该属性表示一个测试用例。51Testing软件测试网#]o&t:H } o

s4@LMJ0AssemblyInitialize()
YN$tIi-C:Ii0   
:?(Vm,js0
(Vd F;F \D0在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之前,执行带有该属性的方法。51Testing软件测试网)a#zq+^hqmhg&IN
51Testing软件测试网;J6|'@!b4yK/A3A
ClassInitialize()51Testing软件测试网u"g L&d#J7Qaa S
   51Testing软件测试网)\K#w^ d&sX'I

H2g9UL"e4qGS0带有该属性的方法在执行第一个测试之前调用。
ciI6xE8cI051Testing软件测试网%x6{^K7q)KDBw
TestInitialize()51Testing软件测试网-OZ p!XE2{$u4sXNk
   
3C,l Ig h F4Hf8U)M,F051Testing软件测试网7L^6FZ'J6d\%U-j
带有该属性的方法在执行每个 TestMethod() 之前调用。51Testing软件测试网WLEa:Gl5\$U ky
51Testing软件测试网Yw:u0U"Xp6Kh.I'`
TestCleanup()
eO7],`7c1q%X0   
BZ ^%X$Ycsn0
u#B)@Qi.v G*ms0带有该属性的方法在执行每个 TestMethod() 之后调用。51Testing软件测试网t2@@"~,A i#}
51Testing软件测试网9P[-z ^8rG5h-}1q|
ClassCleanup()
"W2h;]'I'F0   51Testing软件测试网{%oR_4Mwy
51Testing软件测试网0mOy7Et.Z1c#E
带有该属性的方法在执行 ALL 测试之后调用。51Testing软件测试网8mH5R,{Wh-`,p
51Testing软件测试网-f2B y?g m#l,P
AssemblyCleanup()51Testing软件测试网g P4N#K8^+K.fbc!y-A
   
tu!y?*s(f0
_$l{'Q`-`m)e9Y!W0在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之后,执行带有该属性的方法。51Testing软件测试网;t+gDPjV+cS

_ax#mNtj z0Descrīption()
k(De^5gR0   
+J%y1|&Jo7\q051Testing软件测试网L `5ym`&]D
提供关于给定 TestMethod() 的描述。51Testing软件测试网hCw c Q^ G Xu
51Testing软件测试网-j&rzn/E_N YI@ q.@q
Ignore()
)sG8t9fdb J0   
q+F5a3j5J8m;LB0
0L g RD(n| j0由于某种原因忽略 TestMethod() 或 TestClass()。
)Al~ A#]s ~(l051Testing软件测试网-K]0L+Z n9lI
ExpectedException()51Testing软件测试网 {5wr es2g W2t
   51Testing软件测试网;PSe"?bV0r4? X$R
51Testing软件测试网cR)~Y_uT
当测试特定异常时,如果使用该属性指定的异常不是从实现代码引发,则测试不会失败。
Va`1h |$C,g0我编写什么类型的测试?51Testing软件测试网BkW)V'V yf:N&}

R$o0?;R8T3y M%d,f0一个方法及其相关测试之间很难有一对一关系。编写自动化单元测试需要开发人员“进行全面思考”,并了解关于对象的所有内容 — 它将如何消耗、使用、处理,以及在任何情况下如何起到积极、消极、非决定性作用。
"[H V)O Ue0
\fa$`0Wl9id\7}0例如,请考虑一个用于针对数据库中 Customer 项执行 CRUD(创建、检索、更新、删除)功能的典型对象方法。对于该对象的 Load() 方法,要针对以下方案编写测试:51Testing软件测试网 Z7x { @y!s)`"kI
•    
n#S0C4J:IF051Testing软件测试网v8[[)yk0}~
构造函数测试 — 确保对象正确加载,带有正确的信息。51Testing软件测试网P;v`Y(q)h'c-R3\
•    51Testing软件测试网J:kM)_9i
51Testing软件测试网*{9g\C}0B P*d
PositiveLoadScalarTest — 测试数据库中一个 Customer 的成功加载。51Testing软件测试网U"TCOr ^d }
•    
?|'P lLFE(X1[_o051Testing软件测试网:a2\{Q9XP
NegativeLoadScalarTest — 测试一个 Customer 的失败加载,即该 Customer 不在数据库中。
i{TfF#LR0•    
LJ*aG {7c9w/T6o0
!SD/LTk"^5e%^"@0PositiveLoadTest — 基于已知数据测试 Customer 的成功加载。51Testing软件测试网fI1^5DKp oV9c
•    51Testing软件测试网,q+t+T Cv6EH

#w/S-v&YQH0G%v-G'V3j0NegativeLoadTest — 测试数据库中不存在的 Customer 的失败加载。51Testing软件测试网zpa"Ke:k~Kx
•    51Testing软件测试网Ay@1k*mtG L Y%c

D,jB8E T0NegativeValidationTest — 确保验证逻辑正确工作。51Testing软件测试网 FczBGKk'}V'F B
51Testing软件测试网-vT-R)orKJT5r
这些只是自动化单元测试套件许多用法中的一部分。我曾经听说一个小团队使用单元测试查看针对其组件的已知安全攻击。从宏观的角度来看,单元测试应该明确保证组件的正常使用。具有丰富的测试集将使团队确信您已经准确实现了既定的目标:编写有效的软件。无论自信源自哪里 — 这就是您需要编写的测试。
YFx:_&od_c#g0您测试什么?
d~'\Gg5_051Testing软件测试网-^~%x Zv/PZm
从本质上看,这些自动化单元测试非常低级。它们旨在测试下至构造函数、方法调用的对象,甚至是对象上的属性。
3WRS%tf/X `Ha0
O?C'b0ihq*d}(t0关于“公共对私有”的主题在单元测试派系中引发了许多争论。许多人认为单元测试只应该测试对象的公共接口。其他人认为应该测试每个调用 — 包括内部私有方法。VSTS 支持两个单元测试级别。VSTS 通过使用私有访问器或包装类支持私有测试,后者提供基于“私有”方法和属性生成单元测试的功能。51Testing软件测试网Vo$ix"nX#cZ
 
;g/k,dV1hE]Tm!i0为什么生成代码?51Testing软件测试网Vh+](|)]*CF.j
51Testing软件测试网EFs!n&u/K6z
阅读上面的列表后,您可能会想起前面项目的单个对象,并思考:“如果我用“这些”对象进行该操作,就需要编写大量代码!”请考虑开发人员仍编写“单元测试”代码的事实 — 只在不同的窗体(例如,前面提到的 WinForms 示例)上进行。此外,具有可自行记录、可重用的实现示例带来的好处远大于生成更多代码所带来的麻烦。最后,在单元测试中设计更多的环节已证明可以减少质量保证环节中的故障。51Testing软件测试网/Ka7v[lH

$A9VN"f:@0正如前面所提到的,代码生成是“软件创建软件”的过程。基于可重复的过程创建代码是理想的。例如,一些使用代码生成的较好示例包括:脚本数据、创建表示实体及其在储存库(数据库 CRUD)中存在的对象,或者创建适用于数据维护的 UI 控件。使用代码生成的好处包括:
Y;N7ul Y?2~0•    
u tNZ4pSair0
p9^c"_~%I-a`0节省时间 — 为什么花几小时/天/周创建一些在几秒/分钟内就可以创建的内容?51Testing软件测试网$P \ V(sf~W6C
•    51Testing软件测试网!e8b'@2}%x(Y p T~/`P*w

N^&| H"ww4l]@0强制标准/约定— 对于强制您的标准和命名约定而言,没有什么比消除开发中的人员因素并依赖基于“您的”规则的可重复过程更好的了。51Testing软件测试网&o;IY4|)]"_}L
•    
9K,s0lV\1wN2b051Testing软件测试网 oO`8d~7w
测试私有方法的功能 — 正如本文前面提到的,Unit Testing Framework 提供使用“私有访问器”类测试私有方法的功能。该代码生成引擎创建与这些访问器类相关的所有“基础代码”。51Testing软件测试网r[o.Z?;gd:o
•    
}xi*Qr2d-Y}0
9f@{X5PP!w7?0获取现有组件的信息 — 搜索另一个开发人员的组件吗?基于这些组件生成代码可能提供关于该实现以及该对象接口的简明示例。此外,进行设计并在编码之前“清除”其对象的公共接口(例如,通过使用 VS 2005 类设计器)的开发人员将极大地受益于代码生成引擎。51Testing软件测试网M]6Vm*uZ
51Testing软件测试网!QTI;U%o-a
正如您所预期的,自动化单元测试属于“优秀代码生成候选者”。在现有组件中指出一些内容并针对这些自动单元测试生成初始代码难道不是很理想吗?而且不只是保留单元测试框架,还会围绕对象的公共接口生成实现示例吗?将来的 Visual Studio 2005 Team System 用户将拥有该功能以及更多功能!
xD-bS:F:M!r0 
g"{ cd!E1t+h0让我们生成一些代码吧!51Testing软件测试网p/yY0q5d:m?M
51Testing软件测试网_4x+{:FFV1@
本例中,我们将生成本文前面提到的 BankAccount 类的代码。本文的这一部分旨在为您介绍代码生成过程,并重点介绍所提供的功能以及从 VSTS 使用 Unit Testing 引擎的好处。
#c T0Jei(i7L0第 1 步:创建您的实现代码51Testing软件测试网j I7|6Q9cm~d"_
51Testing软件测试网*Z j I-N^!QJN
首先,我们创建一个将用作应用程序的业务层的类库项目。
[+[(W z?'[cln051Testing软件测试网7qa6] J Qj6v0|S
要在 VS 2005 中创建该库:
L%K&q*x*ed0
twM}!e.nq4Z01.51Testing软件测试网4~/K'm2\#eA:i[v$y1t
   
aI(x'i x GDS0
]u2i ?oQ k!MN)Eb F0启动 Visual Studio 2005 Beta 2。51Testing软件测试网?g0T(oV{,r2jc

A/m-U#}!Nxs02.
4R!q#KR*E'^0   
5Y_#V,T8?7q1jSk.g~051Testing软件测试网&q5Q%{\/Tx'A3U:y
单击 File | New | Project。
k*C:}M+xJ*tAI051Testing软件测试网XV~q t;L Nh
3.
E_bg5ayQ4b0   51Testing软件测试网6Z)a7u0F/~BQ
51Testing软件测试网7vJ so;{&qk4D,T
选择您选定的语言 Windows,并选择 Class Library 项目模板。
Z+g a/Pk051Testing软件测试网i C;K#b9nzY [
4.51Testing软件测试网 p(x"Q~\T c S6U8PZ
   51Testing软件测试网p4Dex1gc!Cz

+[:C? T4f(\,Z0]ZC0将 Name 和 Solution Name 设置为 BankAccountDemo.Business,选择一个位置,并单击 OK 来创建该类库。
;p%^P(|5ii aw0}&E2et051Testing软件测试网4F%Q)fh%xl/c
VS 2005 创建该类后,下一个任务就是创建针对您的项目设计的 BankAccount 类。为此,需要执行以下操作:51Testing软件测试网0} C;\L#KN)sD

+_Ec6bt j01.51Testing软件测试网 aS[^3gjm*Q
   51Testing软件测试网%`6ky!rAHd
51Testing软件测试网3UoWHNd@
在解决方案资源管理器中单击右键,并单击 Delete,从项目中移除该文件并将其从硬盘中删除。51Testing软件测试网5nJ)o/L7_F
51Testing软件测试网mYr8Pu-l
2.
"b%U.? to+o0T.g0   51Testing软件测试网i] bBLQ j&R,[

[s6DySdMf~0右键单击 BankAccountDemo.Business 项目,然后单击 Add,之后单击 Class。51Testing软件测试网AOz3hM5d'm
51Testing软件测试网7V0W n0I8Q R j uw7[ v
3.
r2nZ!u'~0   
y'{;h.w:o!n+nj051Testing软件测试网 q&T ftHt
选择文件名 BankAccount.cs,并单击 Add 创建类文件。
'@4n4j3k9?(RK051Testing软件测试网V#M7YR a)s3Xfq
4.51Testing软件测试网|!U[ IY.v!].w
   51Testing软件测试网~zwKy+k-to
51Testing软件测试网)QLiXF*E w
针对 BankAccount.cs 文件对代码进行以下更改。
K0B*}C&jw0
;|)h&o'w#}.w e6kP~0using System;
'\ Mf.E]CM0kS0using System.Collections.Generic;
/K6p1d!Z$]3[2N |j4P0using System.Text;51Testing软件测试网 L Gi MP c/j#V p
51Testing软件测试网6lSa4w^o}?q
namespace BankAccountDemo.Business51Testing软件测试网3{}EyVl
{51Testing软件测试网8Leo!f.n-de'x9m
    public class BankAccount51Testing软件测试网7}h&[?hY
    {
qm6v'Ib0        // Properties
e"HF9b3jR0        private float _currentBalance;
b8fPT0NHx@ vL0
K5a/u)Q-Lr{%`,P W0        public float CurrentBalance51Testing软件测试网&c[?fo\6F s(c/v
        {
u\xzSe6g*d,K#O0            get { return _currentBalance; }51Testing软件测试网V1cqa[*g2j
        }
$_ b8i$x;VM5I*`6[^2O%A0
/s7Z {R*X'B9S/x0        // Constructors51Testing软件测试网*B{ _-tP d ~]5J
        public BankAccount(float initialBalance)51Testing软件测试网"[^3^ |,~
        {
t,@5^3e{A%^!N0            this._currentBalance = initialBalance;
7XF2~*IoS*_kkR0        }51Testing软件测试网 ? }!jm `0r

Uu8dzKYcX*u0        // Methods
H2[4Y6Ka Wr0        public void DepositMoney(float depositAmount)51Testing软件测试网P0Wj+Frp'v
        {51Testing软件测试网+D0D3C!_'F
            this._currentBalance += depositAmount;51Testing软件测试网 ^7MY;Yx
        }
;sW[l8rHe|4O0
/b8u d5kFb0        public void MakePayment(float paymentAmount)51Testing软件测试网ca*K0~1_3x{
        {
b,d!z Kt9{;n0            this._currentBalance -= paymentAmount;51Testing软件测试网tq4rZe(b Z/F
        }
4T2@_$F%^8\ KJ'm/R?0    }
V6K| Md051Testing软件测试网5Qjc(I i-|
}
~z#o tz!^'l/P"g0
#c? Y9]1O\&? N*p4B0

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