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

%vx| uU;X n051Testing软件测试网7@:w-V$l4@:p(^
    51Testing软件测试网)`'~ }bu9Gh*y
简介
)?z"by#^k,z0
%u4eB)r(QRU0随着业务的革新和发展,运行它们的系统也需要进行更新。随业务的发展、革新以及与合作伙伴、客户和供应商的结合,这些系统将在复杂性方面持续扩增。
W;m^7g@5`U4bz051Testing软件测试网 }rnISq6[
这种复杂性迫使 IT 的领导者们在开发过程中(即,在实现之前)确保质量。有一种方法可使开发人员减少进入 QA 环节的故障数量,即,针对自定义代码严格执行自动化单元测试。在开发过程中强制使用自动化单元测试可为团队成员提供有关如何使用自定义代码的示例(这些示例易于使用并自行记录)。
&Cn2?%f,[ D!C0
3?w`0U)@"S A/S9e7A0使用结构化、自动化单元测试面临的挑战之一是完成这些任务所需的代码总数。(测试代码需要使用大量代码!)代码生成的概念(简单定义为“创建软件的软件”)正随着时间的快速推移而逐渐深入到团队 IT 开发之中。有些人认为代码生成有助于缩短“推向市场”策略的时间,强制内部标准/协定,并促进开发过程。51Testing软件测试网:MMo$R J*[g

o3_ aA ky'l9y9U0Microsoft 认识到这一需要后提供了一个功能丰富、带有下一代开发平台 Visual Studio 2005 Team System (VSTS) 的代码生成引擎。本文提供针对单元测试代码生成的循序渐进的指导,并深入探讨如何在用例中使用。51Testing软件测试网rw0[Fm0g Xa
 51Testing软件测试网XAAqJ|'z7V i9d
重新思考单元测试
$a{gj2F9Tx051Testing软件测试网Q ^ A:B]*uI2W^
请考虑以下情况:您负责为公司生成下一代系统,同时您是较大的开发团队中的一员。您是 UI 开发人员,负责尽可能多地创建 Microsoft ASP.NET/Microsoft WinForms。您依赖“中间层”团队完成其中间层组件 — 这些组件用于执行数据库 CRUD (Create-Retrieve-Update-Delete) 以及与该系统中每个实体相关的业务规则。51Testing软件测试网T0?FZnyCc
51Testing软件测试网 uU O5[LF IO
经过几周的 UI 开发,您完成了窗体并且收到了中间层开发人员打算向您提交其类库的消息。下面提供一段对话示例,说明我们大多数人在开发过程中都会遇到的一些事情。
bu`oX(~0UI 开发人员和中间层开发人员间的示例对话51Testing软件测试网+@r{~s O;S @!N$j

dZK3M4u2`p S/_ `0中间层:
`? `/N ct_8B.|0   
SWkW d3I0
o PZ^ AC0“这些对象随时供您使用 — 为此,只需获取 OurSystemBL.dll 的最新版本。”
#` cDf1LB,`051Testing软件测试网f~q3w k$?p
UI:
6F*z`#^$@/nsf#S0   51Testing软件测试网%~_0E7E tG,T]
51Testing软件测试网SV W'W~,oG&n&n"y
“谢谢。您有供我们查看文档吗?”
2Og`i)R5i051Testing软件测试网*mB5@`)E)JL-W
中间层:51Testing软件测试网4\$b7O`*r*}R
   51Testing软件测试网9r f-_ h%E z I
51Testing软件测试网NBWb+z6a3K{
“哈哈!是的,当然有!我们花了很多时间编写它!请查看 Design Document — 噢,请等一等,它还没有完成……(不久之后即可完成!)”
-rB4SZK0
-m7wV)yE#XK2mE0UI:
-Z7il.T;I ^ v/N0   
$x'vMR9n0O;@051Testing软件测试网)Q sxu ufr(F
“您使用 XML 文档了吗?”
)e;b Q%f*^ J0
*_Iq{ \A0中间层:51Testing软件测试网n)Wx7P-m\b%{9K8R/B
   
y8|'pb2^j}_I`051Testing软件测试网5T7C-~p*G
“在构造函数中,但许多方法都不使用。”
;E!H*Rz)_l'l0
KWS4UQ w]Q0UI:51Testing软件测试网;K;r*g&KV!X
   51Testing软件测试网0gv%N6`(i
51Testing软件测试网l[ K0^0Q\Pu
“显示如何创建、执行并删除对象的示例代码,怎么样?”51Testing软件测试网:t-R,VF6[

Q ? mPU R]$D0中间层:
Oe8ayv)Pz0   
;W-r(ol2O vF5F(@051Testing软件测试网 |h n d`N!m
“我已经附加了一个示例 WinForms 应用程序(从我的工作区),它应该能够提供一些您所需的内容……,虽然它不在 Microsoft Visual SourceSafe 中。”
'g _AW,|-P~5u/E0
'N)k]#O(W7g^:M5]0在考虑如何进行这样有趣的 项目之后,您打定了主意,决定检验中间层的单元测试套件。在深入钻研该代码之后,您注意到该窗体有两个未标记的文本框,以及三个标记为 button1、button2 和 button3 的按钮(幸运的话,它们将排列在窗体上)。接下来,在查看与这些按钮相关的事件之后,您认识到这些代码都未经注释,并且数据变量都被命名为 x、y、z。如果幸运,您还会注意到 button1 和 button2 执行该对象的 Save() 方法,而 button3 执行 Delete() 方法。执行时,您会接收到很多 System.Exception 错误,这是因为遗漏了很多配置设置。
X.?SCH)n9`051Testing软件测试网/A0Od5k\(H
这显然是一个特例,我希望多数开发团队不要进行这一试验,下面让我们看一下该方案中“单元测试”遇到的问题:
SP2y7o`2cS0•    
/\tg3_K0
.c-oU0\ Qbe^0这种形式的单元测试代码不是结构化的:代码充斥到按钮单击事件中并且难以编译。51Testing软件测试网 w)Q$vn#x8rJ#m
•    51Testing软件测试网0`.V7@'c#ENpU
51Testing软件测试网#MK e|D0oG
这种形式的单元测试代码记录得不太好。
\i0t)f0_~@0•    
b!XOyM!Tl051Testing软件测试网3J!UEf~x
这种形式的单元测试并不基于“已知”为好或坏的数据 — 它完全依赖于输入到那些未标记的文本框的内容。51Testing软件测试网v9n1R(M Oo@,`
•    
pJ2E4|3V:U0
l iZZl:r6]u0单元测试代码不能自动重复,它基于输入的代码。51Testing软件测试网 x3_0p a`)Z
•    51Testing软件测试网W]j;T olL
51Testing软件测试网B Xw bm[ z(R.{/E5L
单元测试代码覆盖是未知的 — 用数据指示实际测试的代码量。51Testing软件测试网 Iv L:Y a
•    51Testing软件测试网)eF;fU,^9Bq
51Testing软件测试网4\}c.A a [)l!}
实现的详细信息不易于在团队成员间进行传播。
vgw6R0M3CG0 51Testing软件测试网}|#n$l_mI_
输入自动化单元测试
XB7z3c?z e3i051Testing软件测试网8\| j MI Uez-{Z
xUnit 框架在 1998 年作为 eXtreme 编程的核心概念引入。它提出了一个有效的机制,有助于开发人员将结构化、有效且自动的单元测试添加常规开发活动中。从那以后,该框架演化为针对自动化单元测试框架的实际标准。
q8W `7l2X3t0创建自动化单元测试的用例51Testing软件测试网-g`\M|:wxKQ e
51Testing软件测试网&\+g ?5Z.V
简单说,自动化单元测试是:51Testing软件测试网+n3s$wjiy p4hxs
•    
7G`{ fx6R*N-}0
2sr#Y2O-I&c/Ww0结构化的。
{H-`d:\"s1G l0•    51Testing软件测试网UmB)WI.oX8UN

:stm `;Gsq;Jc0自行记录的。51Testing软件测试网X(gp"`@
•    51Testing软件测试网 W W2P3|5zA
51Testing软件测试网oV e)ID0\7R0R[.l
自动且可重复的。
5| b?%z/i@0rV0•    51Testing软件测试网Eq.j CC

JMyW5a'F0基于已知数据。51Testing软件测试网w'ed7Ru$G:Jm
•    
8mE3Y c+O051Testing软件测试网L.df0cN L
旨在测试积极和消极操作。51Testing软件测试网LmyXa5d0z:t&Q#H
•    51Testing软件测试网r {3H"P*Q8`
51Testing软件测试网j#il"|'FuO fS
非常适合跨不同计算机的测试实现。51Testing软件测试网J8yT7l a7r7Xh
•    51Testing软件测试网(]D,KX4x!jiW-sO

:M v"GPd R#N0配置、实现和执行的示例。51Testing软件测试网#Hc&G3p3PGY-}|,`
xUnit 框架元素51Testing软件测试网@8v!_HjQ
51Testing软件测试网 [ H IpR4M
表 2 分析 xUnit 框架以及对应于 Visual Studio 2005 Team System 的 Unit Testing Framework 等价物的基本概念。
2]^t/QD2P nnfsE0表 2. 相应的 xUnit 框架和 VSTS Unit Testing Framework 概念
)K/SO$CK f0xUnit 框架概念     VS 2005 等价物(参见下面的属性)     描述
_6~9m K Qz p b3v]0
f0VA ~j0测试51Testing软件测试网8`e a?;Xxws&J%I ge
   51Testing软件测试网xoM"Uj*D8Pb|
51Testing软件测试网1h'oH%^!hs{ xh
TestMethod51Testing软件测试网I6{,k`1m7l.B6^el
   
f(Vlo/?~/_#X051Testing软件测试网9h!E'{ojr G
简单说,这些是您的测试。测试预期结果的逻辑,并报告未取得结果(如果有)。请将它看作您的“方法”。
:\6S(b2n"y&ii0
"VP.L%Qiu#z,{0测试装置
M(ry-o_r w0   51Testing软件测试网.U#le at|+I

| J7pn5N.^0TestClass
%KK4I'P pz,S0   51Testing软件测试网@GQ#wNe

5vADrW7{0针对大量测试的一个逻辑分组。请将它看作您的“类”。
oE` o,Z.rH0
7rLtu1D&KhO0测试套件51Testing软件测试网 ]-[(IrvJF4C
   
"PK"V(Kw.f?6p051Testing软件测试网$sm$j8P$H HT4n
测试列表 **51Testing软件测试网*{b ^$K-W g g
   
e$p%iXf.AK$}O0
6_V.Zu8NkBo2\!|U;TD0针对大量测试装置的一个逻辑分组。请将它看作您的“类库”。
lSu/[f"~0
;PZ}+k[GVZ0注不需要一个属性。51Testing软件测试网i[es5B5js%n |
51Testing软件测试网Q(sE"i9C7p&\ bKC
测试运行器51Testing软件测试网O6Z{*I\?+}.Iy
   
8f1w2Him6S0
0E K9K-I8A7]gw0VS 2005 VSTS Unit Testing Framework51Testing软件测试网0B.^s7[p/Z0M2kQNk
   51Testing软件测试网6M9?6W#~#j8C xE`%f
51Testing软件测试网 }t KRU&IS;M ` t
GUI/Console 应用程序负责发现、执行和报告测试结果。Visual Studio 2005 Team System 将作为本文的测试运行器。
_-?{q g5D0测试装置示例
k7E!CRSg0
6?ji8Y,d4o'W0请考虑以下针对 BankAccount 类的类关系图,以及一个示例测试装置 (BankAccountTests.cs)。51Testing软件测试网0r*\!Mi)Wjl

'^*k mA B}U9c0图 1. BankAccount 类51Testing软件测试网6Xl8a6ogj$j$T
示例测试装置: BankAccountTests.cs51Testing软件测试网GA#AY#Vl b*z

n*CS.yk\(B5W o B3r0using BankAccountDemo.Business;51Testing软件测试网.k ]t'oOS0xC8qW*P9q
using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework;51Testing软件测试网y Z#kywp4P
namespace BankAccountDemo.Business.Tests51Testing软件测试网8w(LH"S*WYG J`8|/]
{
$WL.SjF0    [TestClass()]
pm(R(a'\Z6U0    public class BankAccountTest
#hS5U,r`t#u/u7~q0    {51Testing软件测试网@0k2?| Yo
        [TestInitialize()]51Testing软件测试网I1| _xOi0l%B
        public void Initialize()    {51Testing软件测试网/D M?:A KqD
        }51Testing软件测试网&H b:[d5q!|M
        [TestCleanup()]
$f"k0sS6@0        public void Cleanup()   {51Testing软件测试网MRi#g$xi:S
        }
1p1b3eyHP%U0        [TestMethod()]51Testing软件测试网1M$ld4B6Y_o
        public void ConstructorTest()   {51Testing软件测试网L9a:^ U(k-K9m'}5M(V:M
            float currentBalance = 500;51Testing软件测试网{E&w}[qCO#H_
            BankAccount target = new BankAccount(currentBalance);
/y%m!p%{ h,S:\0            Assert.AreEqual(currentBalance, target.CurrentBalance,51Testing软件测试网|rc1z|_9Wc0z
                "Balances are not equal upon creation");51Testing软件测试网;oV*Erk:PI9@'U
        }
*t3k8D {-^8|O0        [TestMethod()]
Wu[jiW:x;x0}5F0        public void DepositMoneyTest()  {51Testing软件测试网tG(z*r:P~9]9P
            float currentBalance = 500;
(Y%jF k5y#x{0            BankAccount target = new BankAccount(currentBalance);
V(Tx#\Sr|4O0            float depositAmount = 10;
aVa.f4`U[&yy0            target.DepositMoney(depositAmount);51Testing软件测试网.o_/C _/qI;us_
            Assert.IsTrue( (currentBalance + depositAmount) > 
OB#Lo s0                            target.CurrentBalance,
U(q9p(]8b!T0               "Deposit not applied correctly");51Testing软件测试网.D%Fh*} fi(P4U
        }
:FUz#\6B*Gh;z0        [TestMethod()]51Testing软件测试网-xf)M3k Cv^,\)_V
        public void MakePaymentTest()   {
LuB~oEsm0            float currentBalance = 500;51Testing软件测试网E;dos:b8d.T
            BankAccount target = new BankAccount(currentBalance);
^ P0z)w&C^0            float paymentAmount = 250;51Testing软件测试网 F XN#w7w6mY"e
            target.MakePayment(paymentAmount);
X6@ Pnc0            Assert.IsTrue(currentBalance - paymentAmount ==
m,`#l O6l#]0              target.CurrentBalance,
&FhIx9F}0                "Payment not applied correctly");51Testing软件测试网5D;ito3r,o)o
        }
:c?m'~{1ykx#F0    }51Testing软件测试网)xp:X5L\0_:V
}
al i$?x@h$@k0
"A `MN7cg0主单元测试概念 == 断言
9^4e?*|'}"?6C(@w0
y.L6}"nt[fY0用于该形式单元测试的主要概念是,自动化单元测试是基于“断言”的,即可定义为“事实或您相信为事实的内容”。从逻辑角度看,请考虑该语句“when I do {x}, I expect {y} as a result”。51Testing软件测试网T!g y'_4^'D

yy ?] nzFM%Y}!]0这可以轻松地翻译为代码,方法是使用 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中可用的三个“断言”类中的任一个:Assert、StringAssert 和 CollectionAssert。主类 Assert 提供用于测试基础条件语句的断言。StringAssert 类自定义了在使用字符串变量时有用的断言。同样,CollectionAssert 类包括在使用对象集合时有用的断言方法。51Testing软件测试网i$QeJ)Ac/Y%i0p
51Testing软件测试网Q#ar4t+E_-aa)C2C g
表 3 显示可用于当前版本 Unit Testing Framework 的断言。
!Z,j?3a8N3rx2t+`9T0表 3. VSTS Unit Testing Framework 断言51Testing软件测试网 E lXtt,I.ap"l#]/V
断言类     StringAssert 类     CollectionAssert 类51Testing软件测试网1{)BKnE u*k2E

2G6tn:l2znnmw+\0AreEqual()51Testing软件测试网2W4p oGc
AreNotEqual()
r AL:^`0AreNotSame()51Testing软件测试网 t'a'V4z+?9O
AreSame()
5]J5zP8N/Ad0EqualsTests()51Testing软件测试网{Aw K([ ZTy,F)g]
Fail()51Testing软件测试网-lb_R?N$x
GetHashCodeTests()51Testing软件测试网7e X(rQo|K1I^
Inconclusive()
%y n `#RC0IsFalse()
rtQX)Er)O*K+qm0IsInstanceOfType()
/d W^!wm,^&sl0IsNotInstanceOfType()
"y9Y$zyG5S0IsNotNull()
e$A u~3BC'IQZ|0IsNull()
qC.O` { ny9C,gT^w"j0IsTrue()
pW%l_ ]Q&J$Q+H0
#r:n/F:fjF j0   51Testing软件测试网&S0x,]I|pB
51Testing软件测试网0@|#|W#}"mR
Contains()51Testing软件测试网~Q~vz+ucR#D0@
DoesNotMatch()
9cQX S.L0EndsWith()
5Z*|*K*|8m\p\0Matches()51Testing软件测试网 SW?4y&^
StartsWith()51Testing软件测试网#rJI T v)j
51Testing软件测试网E9p3qr [
   
1z}2O(gU7zAb,_:I BA0
6JIM^RZi0AllItemsAreInstancesOfType()51Testing软件测试网 ^wO~ZW,VF
AllItemsAreNotNull()51Testing软件测试网1a,?*~'SY3@4a&@ {
AllItemsAreUnique()
+A6U1jSx0AreEqual()
a c%Nca0AreEquivalent()51Testing软件测试网7} Z0KPy u R-N"?/Hq
AreNotEqual()
9i L:wk1p(b(Ol0AreNotEquivalent()51Testing软件测试网,j&u!fI[ x/Coa
Contains()51Testing软件测试网;nOwdm
DoesNotContain()
&W@ C3D5e gGe} D0IsNotSubsetOf()51Testing软件测试网&u z)mz3]} e&CWBwq3L W
IsSubsetOf()51Testing软件测试网)]2}3NQ Y
51Testing软件测试网"A8L!H V5[v
这些自动化单元测试用什么运行?
,r%|5kHWF0
#l(Ed Wy4d0正如前面提到的,xUnit 框架将“测试运行器”的概念定义为应用程序负责:(a) 执行单元测试;(b) 报告测试结果。对于本文,包含 Visual Studio 2005 Team System (VSTS) 的 Unit Testing 引擎作为我们的“测试运行器”。图 2 表示 BankAccountTests.cs 类的执行结果。51Testing软件测试网\"v[Drw tC[0{4h8Y

eN fs-@"~w~ r9fF0图 2. 测试结果窗格:单元测试执行结果51Testing软件测试网7G-XZlU6WG2b
51Testing软件测试网)HS/|%O4M#b
Microsoft Visual Studio 2005 使用源项目的代码模型动态填充该视图。它基于该源代码中的自定义属性动态发现有关该测试套件的信息。表 4 表示最常见的单元测试属性(以及执行的次序)。51Testing软件测试网0ik)mV ~g;rw
表 4. 常见单元测试属性
E6T.\wcFR%K v0属性     描述
"f }q*hv2A!M1d051Testing软件测试网*X'H2^4E(SK
TestClass()51Testing软件测试网 \F)i [p6l L
   
*j^,j'b*N [s5Ai)q0
7}'i)G9u&H6om A WC0该属性表示一个测试装置。51Testing软件测试网x;g#\8Z:dSnu
51Testing软件测试网 Tt[)VH(s3M1hz+Ahn
TestMethod()51Testing软件测试网s.P9?)z ?0^&skfI
   51Testing软件测试网f"@$hB lA3`6I MOGq
51Testing软件测试网)ql,z0k ?} Mi
该属性表示一个测试用例。
9a3}?x+beRo0
%j2rP2N Ro0AssemblyInitialize()51Testing软件测试网$h*E @4Fip{.|
   51Testing软件测试网3l9ni1iJ

{+}*B Or:}t0在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之前,执行带有该属性的方法。51Testing软件测试网&Ob0?b(q6G1t7[J1]

@V(U [&U(]0ClassInitialize()51Testing软件测试网2w3n*}8R6sm
   51Testing软件测试网,_?A$_V_7`s
51Testing软件测试网!h AC9A:K3?/H4q
带有该属性的方法在执行第一个测试之前调用。
$~*\t/{!ueS0
mO&A"M\G#?[^0TestInitialize()
b z.g#fie0   
Wyw|7D0NWzyt#b0
X1YT|2^z0带有该属性的方法在执行每个 TestMethod() 之前调用。
Z1e)V0x8j3dC051Testing软件测试网 j;KX1FbM
TestCleanup()
f kW @5{5Q:PO}0   51Testing软件测试网(PQWrOf
51Testing软件测试网$g pf.EkG
带有该属性的方法在执行每个 TestMethod() 之后调用。51Testing软件测试网T5N\.vU Y)V$G$v
51Testing软件测试网$M ILc!cxLi
ClassCleanup()
#c6JlG/].Y-\1r0   
/v qo!l] x8m9lMn_051Testing软件测试网T!e+v(Dqc
带有该属性的方法在执行 ALL 测试之后调用。
i.G O"]+~E%fbJ0
Z2g ~0vwMK0AssemblyCleanup()
] z9N0j[5l9PP7Fh1n0   
Y~ v&R#G051Testing软件测试网[4W.p"pm(yrC0r
在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之后,执行带有该属性的方法。51Testing软件测试网4JGU R"m&o%qTb
51Testing软件测试网uw&JL{!s d9@%Jwa
Descrīption()
:T vBw%J;\-~?'U w0   
GU$}*u u%d051Testing软件测试网cP.E$i9Wd$q
提供关于给定 TestMethod() 的描述。
Z]]5r3d`%M`0
(t} \K#K0[l&h*sM q0Ignore()
ttgK-A0   
os~[$O?-mq0
u vdPI^ O0由于某种原因忽略 TestMethod() 或 TestClass()。
9h#o(o Q%z X:p g7Zx051Testing软件测试网[8\[s|'|5~%E C
ExpectedException()
NTEZ#G&ZGQ rG0   
"{&oi O@h0
1h+@5`U'F Y*V0当测试特定异常时,如果使用该属性指定的异常不是从实现代码引发,则测试不会失败。
6DT%M+v ~w0我编写什么类型的测试?51Testing软件测试网2? H F$B6c|jsOr

7^ B)?3j/Tx"i|0一个方法及其相关测试之间很难有一对一关系。编写自动化单元测试需要开发人员“进行全面思考”,并了解关于对象的所有内容 — 它将如何消耗、使用、处理,以及在任何情况下如何起到积极、消极、非决定性作用。51Testing软件测试网I%tV;W j q)D ]
51Testing软件测试网.vs6dl2^TPTI.l
例如,请考虑一个用于针对数据库中 Customer 项执行 CRUD(创建、检索、更新、删除)功能的典型对象方法。对于该对象的 Load() 方法,要针对以下方案编写测试:51Testing软件测试网%n5V/?KG/am
•    
.?4Ye8dC051Testing软件测试网(c0x^:G \6k-c
构造函数测试 — 确保对象正确加载,带有正确的信息。
0obB0A7X a0•    
zTv+Zd,c051Testing软件测试网W}F9@*x{ Cd9R
PositiveLoadScalarTest — 测试数据库中一个 Customer 的成功加载。51Testing软件测试网T {*d7p,Jfa!X ]
•    51Testing软件测试网4nnll+zNzA

yhj"[y{R"|0NegativeLoadScalarTest — 测试一个 Customer 的失败加载,即该 Customer 不在数据库中。
']Io U*j-x~*G0bS0•    51Testing软件测试网Do@)MbeVI

J1K(WP8zxG0PositiveLoadTest — 基于已知数据测试 Customer 的成功加载。51Testing软件测试网-a?NBe`
•    
j^ Aku/[^!u*x0
6PIXUCAc't0NegativeLoadTest — 测试数据库中不存在的 Customer 的失败加载。
}n4`'u,`oW8U0•    51Testing软件测试网o Vi"Wi%Uf
51Testing软件测试网h(u? \)r/aj
NegativeValidationTest — 确保验证逻辑正确工作。
@^/?;R^ HG"q051Testing软件测试网5EE:?e|1R)M^1j
这些只是自动化单元测试套件许多用法中的一部分。我曾经听说一个小团队使用单元测试查看针对其组件的已知安全攻击。从宏观的角度来看,单元测试应该明确保证组件的正常使用。具有丰富的测试集将使团队确信您已经准确实现了既定的目标:编写有效的软件。无论自信源自哪里 — 这就是您需要编写的测试。51Testing软件测试网/n9yvS2e_I1Qt?
您测试什么?51Testing软件测试网/ZW;r-~&IBy-p

3q&] TI(Z6f0从本质上看,这些自动化单元测试非常低级。它们旨在测试下至构造函数、方法调用的对象,甚至是对象上的属性。51Testing软件测试网ZAod#Cr
51Testing软件测试网8mC#Z,Bt6Y
关于“公共对私有”的主题在单元测试派系中引发了许多争论。许多人认为单元测试只应该测试对象的公共接口。其他人认为应该测试每个调用 — 包括内部私有方法。VSTS 支持两个单元测试级别。VSTS 通过使用私有访问器或包装类支持私有测试,后者提供基于“私有”方法和属性生成单元测试的功能。51Testing软件测试网7L!u L1j}[b)f
 51Testing软件测试网5_&g fwu1W8k$Q
为什么生成代码?
$a"n[/\*OfUFq R051Testing软件测试网 Dha"@d*R.ID)S
阅读上面的列表后,您可能会想起前面项目的单个对象,并思考:“如果我用“这些”对象进行该操作,就需要编写大量代码!”请考虑开发人员仍编写“单元测试”代码的事实 — 只在不同的窗体(例如,前面提到的 WinForms 示例)上进行。此外,具有可自行记录、可重用的实现示例带来的好处远大于生成更多代码所带来的麻烦。最后,在单元测试中设计更多的环节已证明可以减少质量保证环节中的故障。
0_bH;kW)X0
d$D&C+cofNM2T.J`0正如前面所提到的,代码生成是“软件创建软件”的过程。基于可重复的过程创建代码是理想的。例如,一些使用代码生成的较好示例包括:脚本数据、创建表示实体及其在储存库(数据库 CRUD)中存在的对象,或者创建适用于数据维护的 UI 控件。使用代码生成的好处包括:51Testing软件测试网l9uQ;i7p9uf]WJ K K
•    51Testing软件测试网!]Mz(r+M*H
51Testing软件测试网6[?:N;r5n{
节省时间 — 为什么花几小时/天/周创建一些在几秒/分钟内就可以创建的内容?51Testing软件测试网 O;gv;| q]K)y)l*g
•    51Testing软件测试网;m2P&IpOZ-vw

%@!L;S,{%o,@(iV!I0强制标准/约定— 对于强制您的标准和命名约定而言,没有什么比消除开发中的人员因素并依赖基于“您的”规则的可重复过程更好的了。
Se{BP'{7v~7L_0•    51Testing软件测试网M1lsIQ
51Testing软件测试网$Tx-@"i%m^)r:Y*aj
测试私有方法的功能 — 正如本文前面提到的,Unit Testing Framework 提供使用“私有访问器”类测试私有方法的功能。该代码生成引擎创建与这些访问器类相关的所有“基础代码”。
M$OyS0s0•    
}Tm6\jd0
x8@u}8X0获取现有组件的信息 — 搜索另一个开发人员的组件吗?基于这些组件生成代码可能提供关于该实现以及该对象接口的简明示例。此外,进行设计并在编码之前“清除”其对象的公共接口(例如,通过使用 VS 2005 类设计器)的开发人员将极大地受益于代码生成引擎。51Testing软件测试网E*P U4a.Ca2q6D
51Testing软件测试网o'`$cW%wPeF,SE
正如您所预期的,自动化单元测试属于“优秀代码生成候选者”。在现有组件中指出一些内容并针对这些自动单元测试生成初始代码难道不是很理想吗?而且不只是保留单元测试框架,还会围绕对象的公共接口生成实现示例吗?将来的 Visual Studio 2005 Team System 用户将拥有该功能以及更多功能!51Testing软件测试网+v Y`$dMeRa!h
 51Testing软件测试网4}L3w_ }Aw0^xD,W7[-W
让我们生成一些代码吧!
1|6zY!iS'h V051Testing软件测试网c)ojaT}
本例中,我们将生成本文前面提到的 BankAccount 类的代码。本文的这一部分旨在为您介绍代码生成过程,并重点介绍所提供的功能以及从 VSTS 使用 Unit Testing 引擎的好处。
LJ }jx;f.I,|i0第 1 步:创建您的实现代码
e%j4C5dod@0
u p,dt.H0首先,我们创建一个将用作应用程序的业务层的类库项目。51Testing软件测试网y\j6jX9OZ

7b6N4i _4G$r1Jx5K|0要在 VS 2005 中创建该库:51Testing软件测试网+lNt1jY1n3Za'{;Q
51Testing软件测试网&WMz-@u Y c9n
1.
X y9{:}`%Nb*o3FX0   
/|Q^#|r c uP/H!Y0
WQv{8X0启动 Visual Studio 2005 Beta 2。51Testing软件测试网Gp2` cb.V9k_4D
51Testing软件测试网QU9i&m2L Xt8o
2.
%Yf J6h8{FSz0   
!Tv-ghUKRJo0
-DcH,w?!^5n^0单击 File | New | Project。51Testing软件测试网g!H:bBg
51Testing软件测试网3q5}Aa;s.@3m
3.51Testing软件测试网J$u]"rVy]
   51Testing软件测试网g"z[MJ#fVC(},]6p
51Testing软件测试网yr9D$Ro!l5F*r
选择您选定的语言 Windows,并选择 Class Library 项目模板。51Testing软件测试网3SO#a;j"|yN/}(N5C8z
51Testing软件测试网,P bxq1y"N#zM,g
4.
*T [G W _Y1}0   51Testing软件测试网/lh |+Vw+_&jS,K

'Gw&{ ht}N0将 Name 和 Solution Name 设置为 BankAccountDemo.Business,选择一个位置,并单击 OK 来创建该类库。51Testing软件测试网6Ea'oFZ

Oq\zwRM0VS 2005 创建该类后,下一个任务就是创建针对您的项目设计的 BankAccount 类。为此,需要执行以下操作:
%E4rnZ2P051Testing软件测试网bAL3kY|
1.
8[ x*G$U*y%L0   51Testing软件测试网 sn[ci#s

tPL\v2n;D)Vj0在解决方案资源管理器中单击右键,并单击 Delete,从项目中移除该文件并将其从硬盘中删除。
p!_-P_2a&WM051Testing软件测试网5h~*{'A*~%f'Z9E
2.
5dk+Y~1GP(];S0   
?r(L+M2\"G'f051Testing软件测试网#iV3M}8~w;J
右键单击 BankAccountDemo.Business 项目,然后单击 Add,之后单击 Class。
x'T.QWYzn1@s0
fc-pVU P2q4Q03.51Testing软件测试网j/W/W$Z:Gr f
   51Testing软件测试网;k+lIk4m @$DqCY

1?s8K'lB:h4MB1xM0选择文件名 BankAccount.cs,并单击 Add 创建类文件。51Testing软件测试网2z?%rJ/S$m
51Testing软件测试网 l+sL%?,z&tz9rklm
4.
;nSM*B c0   51Testing软件测试网3c0T!ehi;Rz

#M{6Z'u!D'P_K q0针对 BankAccount.cs 文件对代码进行以下更改。51Testing软件测试网q&h,M ].o8Y
51Testing软件测试网0Zdk{E
using System;
JdIkx"e[0using System.Collections.Generic;51Testing软件测试网 A5O/Dw^%H/me!z
using System.Text;
MRLkYr4b#M0
;id Wd e.b6G)u0namespace BankAccountDemo.Business
Q&L;us7p0{
3K4L;Elth8F5?0    public class BankAccount51Testing软件测试网 yIZ7KD6q`0C
    {
.l r e`/m:{\n2o0        // Properties
oC.~.h%JW5a N0        private float _currentBalance;51Testing软件测试网.Z1Y+W ~ cPY
51Testing软件测试网6xQ p;q*nac
        public float CurrentBalance
H R8l L)LFt&E(i!H,L0        {
D-}E+t9rG E#p6Wwx0            get { return _currentBalance; }51Testing软件测试网Cse\4n)LBN'F
        }
8?#^@,_'CK051Testing软件测试网%`,Aq.qK!D
        // Constructors51Testing软件测试网sU&KuO0v$O
        public BankAccount(float initialBalance)
7F}8nz@a0        {51Testing软件测试网1jm#VT;?:tAp
            this._currentBalance = initialBalance;
&m0Fi-^LT _AW0        }
0EK m(s^V051Testing软件测试网T4Z)A[ {
        // Methods51Testing软件测试网Z2J.ER'^'n#v
        public void DepositMoney(float depositAmount)51Testing软件测试网9T]\ x2GF&bG2u
        {51Testing软件测试网K(}*g,d&Fv
            this._currentBalance += depositAmount;51Testing软件测试网 S)C'f%e%} gj*P
        }51Testing软件测试网!lPLeOIGk

s#q4h ?5L6od0        public void MakePayment(float paymentAmount)
yN!q2NE y8K}#z0        {51Testing软件测试网EG k `-n%Y
            this._currentBalance -= paymentAmount;
x\ux[DZ'Ht0        }51Testing软件测试网 B&Zz C g ~'|O
    }
^-O'`Z8c+H0
*|*eG-B'fG @%\0EM0}
7O0XSC9V[9Y{.B6T051Testing软件测试网i]5Ej0q4L

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