不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。                                           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软件测试网~1OV^!}W

Ifk oPs_0    
VB%g;e gD0简介
!MgZ%Fd `d051Testing软件测试网%ed*Md#gE
随着业务的革新和发展,运行它们的系统也需要进行更新。随业务的发展、革新以及与合作伙伴、客户和供应商的结合,这些系统将在复杂性方面持续扩增。
:O$Q*I.{O)V7nQS0
;Bc']}q4Gi0这种复杂性迫使 IT 的领导者们在开发过程中(即,在实现之前)确保质量。有一种方法可使开发人员减少进入 QA 环节的故障数量,即,针对自定义代码严格执行自动化单元测试。在开发过程中强制使用自动化单元测试可为团队成员提供有关如何使用自定义代码的示例(这些示例易于使用并自行记录)。51Testing软件测试网(Pbt2l V+I+G4N

df.q&bu(J{0使用结构化、自动化单元测试面临的挑战之一是完成这些任务所需的代码总数。(测试代码需要使用大量代码!)代码生成的概念(简单定义为“创建软件的软件”)正随着时间的快速推移而逐渐深入到团队 IT 开发之中。有些人认为代码生成有助于缩短“推向市场”策略的时间,强制内部标准/协定,并促进开发过程。51Testing软件测试网%jn+rg"c$W&N

Co}l/NL0Microsoft 认识到这一需要后提供了一个功能丰富、带有下一代开发平台 Visual Studio 2005 Team System (VSTS) 的代码生成引擎。本文提供针对单元测试代码生成的循序渐进的指导,并深入探讨如何在用例中使用。
g(WjHPn0 
8g-F`] A/eJ0重新思考单元测试51Testing软件测试网Q ~:E r M@C7A{| A
51Testing软件测试网4H.R)]-AX0q
请考虑以下情况:您负责为公司生成下一代系统,同时您是较大的开发团队中的一员。您是 UI 开发人员,负责尽可能多地创建 Microsoft ASP.NET/Microsoft WinForms。您依赖“中间层”团队完成其中间层组件 — 这些组件用于执行数据库 CRUD (Create-Retrieve-Update-Delete) 以及与该系统中每个实体相关的业务规则。
v3V:v[%g.@8M0
'T"J%e2}M+P0经过几周的 UI 开发,您完成了窗体并且收到了中间层开发人员打算向您提交其类库的消息。下面提供一段对话示例,说明我们大多数人在开发过程中都会遇到的一些事情。
9M9a |ue$T x0UI 开发人员和中间层开发人员间的示例对话
kjZ4ma q Fd5D0
#Ni J4| Y A#Q*Q)i4b0R-U0中间层:
)e i5pDhQDx2aK0   
/fQT tSd9^051Testing软件测试网9l/a wNK
“这些对象随时供您使用 — 为此,只需获取 OurSystemBL.dll 的最新版本。”
^.g(m4Q4q051Testing软件测试网RP)X8p%Bj,`xvAXi`
UI:51Testing软件测试网.^2FV&h;C^_
   51Testing软件测试网6u v'sJ&Xe
51Testing软件测试网8L8?`[mQ.G&X!_
“谢谢。您有供我们查看文档吗?”
w]!]^J5HF3Da }0
#G+K(Q5_a k k0中间层:51Testing软件测试网#zZ.J0@?8IE5B
   51Testing软件测试网-q$Q8W"Kj
51Testing软件测试网F/U-o qqF1P O$J b(g
“哈哈!是的,当然有!我们花了很多时间编写它!请查看 Design Document — 噢,请等一等,它还没有完成……(不久之后即可完成!)”51Testing软件测试网.g BM-vS@`4| @

p@7y4R vd S0UI:
~Q i:^+C:S0   
\,\'dP-@6fH cM0
W%Zr'I _"I&sd)C0“您使用 XML 文档了吗?”
4XfYXCZ"UU2U051Testing软件测试网6EO6r-QHO
中间层:
)g _5n1a?1l-~ ^ S2uH)y0   
sy*?h:B0
-Yu E4L9aE}3g0“在构造函数中,但许多方法都不使用。”
&~Dm-T-LF(\$v051Testing软件测试网f Da5j^{%j
UI:
pU2I7}P Tq l"hW1pa0   
6^ zH8vmegx y?051Testing软件测试网#L0Q!ag![,D$w;D]$c{
“显示如何创建、执行并删除对象的示例代码,怎么样?”
Y-~/gRRH;~C3b051Testing软件测试网ZM%A3C'W)t0O8us
中间层:
T-r^!fsG|6W0   
gT|8|P]051Testing软件测试网p frf!xjP*I
“我已经附加了一个示例 WinForms 应用程序(从我的工作区),它应该能够提供一些您所需的内容……,虽然它不在 Microsoft Visual SourceSafe 中。”51Testing软件测试网M`7s#Y%l1d4[X p
51Testing软件测试网1v]7JXr'g!dT
在考虑如何进行这样有趣的 项目之后,您打定了主意,决定检验中间层的单元测试套件。在深入钻研该代码之后,您注意到该窗体有两个未标记的文本框,以及三个标记为 button1、button2 和 button3 的按钮(幸运的话,它们将排列在窗体上)。接下来,在查看与这些按钮相关的事件之后,您认识到这些代码都未经注释,并且数据变量都被命名为 x、y、z。如果幸运,您还会注意到 button1 和 button2 执行该对象的 Save() 方法,而 button3 执行 Delete() 方法。执行时,您会接收到很多 System.Exception 错误,这是因为遗漏了很多配置设置。
B3cu&lCF7N,Xe y t051Testing软件测试网Sr8YQV.T-o_
这显然是一个特例,我希望多数开发团队不要进行这一试验,下面让我们看一下该方案中“单元测试”遇到的问题:51Testing软件测试网o4JpK,e%j
•    
];j q Vr0
t]d0uMz9J1h Ab+y?0这种形式的单元测试代码不是结构化的:代码充斥到按钮单击事件中并且难以编译。51Testing软件测试网k4d+q.x6c9I].vrT
•    51Testing软件测试网(O+nG]4I8Y}L

R7`V ^*h;Xy0这种形式的单元测试代码记录得不太好。
*Vo5|5Om J0•    
$@9]#\Eda051Testing软件测试网2@*gO8f Q&^,F VO}
这种形式的单元测试并不基于“已知”为好或坏的数据 — 它完全依赖于输入到那些未标记的文本框的内容。51Testing软件测试网k/mvv3yJ gF
•    
5_;H$XA)gU?&va051Testing软件测试网 p QCM_#~/kW0n
单元测试代码不能自动重复,它基于输入的代码。51Testing软件测试网bS PF%?[
•    
Z |Sr*H8c \(iXd051Testing软件测试网Fd._ I@rt^7l'}8f go
单元测试代码覆盖是未知的 — 用数据指示实际测试的代码量。
^'zu9YV/tc5q bu0•    51Testing软件测试网X"kujJ [7OZ
51Testing软件测试网+DN.P i:fW-m
实现的详细信息不易于在团队成员间进行传播。
5~4w9cx*SD6Sku5M z:ZZ0 
*jip1jg c0输入自动化单元测试51Testing软件测试网 @:u {dR i

/h)fQIM0xUnit 框架在 1998 年作为 eXtreme 编程的核心概念引入。它提出了一个有效的机制,有助于开发人员将结构化、有效且自动的单元测试添加常规开发活动中。从那以后,该框架演化为针对自动化单元测试框架的实际标准。51Testing软件测试网hEh7{"s/v\/Y
创建自动化单元测试的用例
!S} Q)yQ0SO051Testing软件测试网%I a}W,UP2L
简单说,自动化单元测试是:51Testing软件测试网NA D/ZLw
•    51Testing软件测试网%P+c.]0GV6Y:t
51Testing软件测试网.Z3}-p0xLp4rW \N@2Y V
结构化的。
@LA{L]4@ J0•    
,qQ2iJ6}3dJ0
*EDtwK0自行记录的。
%\E~fW0•    51Testing软件测试网"ly+R#O!iwE4f(t

tY f'oNJ$P2U/F0自动且可重复的。
dvj'c$y4F&k }7d0•    51Testing软件测试网WI9z5O w
51Testing软件测试网PJH+Y jp^y/v'c
基于已知数据。51Testing软件测试网 E+F/Q%q6BS
•    51Testing软件测试网Q_!z5rw sd1OJ

%x{s#o Wcl)Tgio1L0旨在测试积极和消极操作。
&Y7q-Ae*z{oMEu0•    
L3B9H{R \051Testing软件测试网T)?)mzWW|[$^
非常适合跨不同计算机的测试实现。51Testing软件测试网%s;i8a"N,V|h&pm5mS
•    51Testing软件测试网@#}!dR} V]uFp

rz-h]:F3U^)r*U0oq0配置、实现和执行的示例。51Testing软件测试网kg{)[ J Hx,Q+t]
xUnit 框架元素51Testing软件测试网mcV`&Rv7S^
51Testing软件测试网3dp(],K8e
表 2 分析 xUnit 框架以及对应于 Visual Studio 2005 Team System 的 Unit Testing Framework 等价物的基本概念。51Testing软件测试网 Py`#z Kkh$i-s
表 2. 相应的 xUnit 框架和 VSTS Unit Testing Framework 概念
:Nw$ha u[}.P0xUnit 框架概念     VS 2005 等价物(参见下面的属性)     描述51Testing软件测试网C|G+aT-r)~

o{PA/|0测试
Z@ d+ix3~/wh0z0   
N1e$ph'U"T051Testing软件测试网 tLx(zL#T.P
TestMethod51Testing软件测试网~mxX)f*P
   
2Hs_6@D0mf051Testing软件测试网S/`[@2JZ:F0j$u
简单说,这些是您的测试。测试预期结果的逻辑,并报告未取得结果(如果有)。请将它看作您的“方法”。
v)S!MJ{3i051Testing软件测试网+XGQ{q
测试装置51Testing软件测试网NNt$X!A ]%Qi5o^
   
$^ a'{)a9Bq051Testing软件测试网6IY5s6r R#fpH
TestClass
#[SF1C H0   51Testing软件测试网 X RA+P Hr

6nV"T)CR;] ZR0针对大量测试的一个逻辑分组。请将它看作您的“类”。
3Yan!tXJz,sO%W*o0
pd)W8H7aly1rI0测试套件51Testing软件测试网m V&v u5Z2Lk*NQ)u
   
(~&{WK.b,H1t0
GcJK gv0测试列表 **
._PA-r^.cF8E0   51Testing软件测试网x1se!d OE{G!]8s
51Testing软件测试网u\(t rKeH
针对大量测试装置的一个逻辑分组。请将它看作您的“类库”。
i z!WFG1d9Ily0
8Z Q m;D!uj cd*o0注不需要一个属性。
D"LTOM%n0
5B+K3y1gZW)D {&y(K0测试运行器51Testing软件测试网6He$kT)X8G3p
   
b^L9F ] hQ0
{ogJ)X+`:~0VS 2005 VSTS Unit Testing Framework51Testing软件测试网,R%oR"DOp
   
K5M-q$J_V.B051Testing软件测试网 U!x-n|P
GUI/Console 应用程序负责发现、执行和报告测试结果。Visual Studio 2005 Team System 将作为本文的测试运行器。51Testing软件测试网}s8g_'i
测试装置示例51Testing软件测试网-|(Lgys|4e w

$Sa8oY:R.WB(|0请考虑以下针对 BankAccount 类的类关系图,以及一个示例测试装置 (BankAccountTests.cs)。
L'B$_W&mh0
Vgm AnMl5S0图 1. BankAccount 类51Testing软件测试网Z%@y{?KF/XB
示例测试装置: BankAccountTests.cs
T)o+|&}(h%U051Testing软件测试网v!I3l9h-BEK?i
using BankAccountDemo.Business;
w k4uY,O7]Rf0using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework;51Testing软件测试网0n k cOz k6Na
namespace BankAccountDemo.Business.Tests
&f%[R8o`tM&r0{
e l/cz2?!Sq!} S?b;v0    [TestClass()]51Testing软件测试网$F^)iz5N4vP2|;j&U i%w
    public class BankAccountTest
[#W+P N3O*H:KU|}q0    {
[ F&Fq(b0        [TestInitialize()]51Testing软件测试网1t%dw%c!}*v-g-so)]
        public void Initialize()    {51Testing软件测试网)c] [v*I%s
        }51Testing软件测试网0~2R#XlCm+ut
        [TestCleanup()]51Testing软件测试网M4O {r I]
        public void Cleanup()   {51Testing软件测试网]o)|9nAS
        }51Testing软件测试网wKU dUm
        [TestMethod()]51Testing软件测试网NU1Q"WiK.?
        public void ConstructorTest()   {51Testing软件测试网GVm$Z ]O$T
            float currentBalance = 500;
2}ol`*hk0            BankAccount target = new BankAccount(currentBalance);51Testing软件测试网 `.U5Y-N!h[0F.` P`
            Assert.AreEqual(currentBalance, target.CurrentBalance,51Testing软件测试网Y|;[,C!T1R9k$Z
                "Balances are not equal upon creation");51Testing软件测试网UI8H]-h)u hd Q(o
        }51Testing软件测试网Q+tw.yI:d-OR
        [TestMethod()]
c1L `6d\)@1Z0        public void DepositMoneyTest()  {
NK!~Z.~$\7O(j0            float currentBalance = 500;
|7X9Ce9q$p0            BankAccount target = new BankAccount(currentBalance);51Testing软件测试网|y og,?Qv+H
            float depositAmount = 10;51Testing软件测试网7IT;RK;rw(w
            target.DepositMoney(depositAmount);51Testing软件测试网X-ZbT8~o{F(Q TQ
            Assert.IsTrue( (currentBalance + depositAmount) > 51Testing软件测试网,bM g.V v U J
                            target.CurrentBalance,51Testing软件测试网'w^.uE0}[R(V
               "Deposit not applied correctly");51Testing软件测试网8u;h&R1Sb p2x;D:Y
        }51Testing软件测试网|4OB%T5i?1eqms
        [TestMethod()]51Testing软件测试网6G9V7L D7|N$I(L0g
        public void MakePaymentTest()   {
,A;z\ r_+f0            float currentBalance = 500;51Testing软件测试网$RS"z#S j2{+q
            BankAccount target = new BankAccount(currentBalance);
+}m8I@-m0            float paymentAmount = 250;51Testing软件测试网kWA)r-z8A)G
            target.MakePayment(paymentAmount);51Testing软件测试网q eZ G$w;|
            Assert.IsTrue(currentBalance - paymentAmount ==
W'JB,Pk k{\ ^,I0              target.CurrentBalance,51Testing软件测试网7jc{&e6~ \A"^
                "Payment not applied correctly");
~-[1Ol)d4p0        }51Testing软件测试网f1mm-G*?xFo~
    }51Testing软件测试网4O`1S]PE
}51Testing软件测试网(Cx"r q0N)B
51Testing软件测试网%Ax7O9lf2L4B j
主单元测试概念 == 断言
!_0G8~oMHQ_0
3i`zWjm)u0用于该形式单元测试的主要概念是,自动化单元测试是基于“断言”的,即可定义为“事实或您相信为事实的内容”。从逻辑角度看,请考虑该语句“when I do {x}, I expect {y} as a result”。
3N#wg!U'q!t051Testing软件测试网1j0u_ d4cz#V/j&^:I
这可以轻松地翻译为代码,方法是使用 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中可用的三个“断言”类中的任一个:Assert、StringAssert 和 CollectionAssert。主类 Assert 提供用于测试基础条件语句的断言。StringAssert 类自定义了在使用字符串变量时有用的断言。同样,CollectionAssert 类包括在使用对象集合时有用的断言方法。51Testing软件测试网"|d r.oY7]Pc d)@9c

u*M\&Y's2E6Td0表 3 显示可用于当前版本 Unit Testing Framework 的断言。
8C*GFs1uA0表 3. VSTS Unit Testing Framework 断言51Testing软件测试网*{u)L(TG3EP5s
断言类     StringAssert 类     CollectionAssert 类51Testing软件测试网*T"S/Qv hQ
51Testing软件测试网/?Z P+B0j
AreEqual()
5}1Zf J.cK0AreNotEqual()51Testing软件测试网J&iKa1a|C*F,e
AreNotSame()51Testing软件测试网/cADy7j
AreSame()
9M']Y {p+eE8~W0EqualsTests()
6\s"z[eCL1y.Q*`:k0Fail()51Testing软件测试网2` @#p7R|_4a i
GetHashCodeTests()51Testing软件测试网-?(Dc%G!|8D
Inconclusive()
&O'J3a/k4@)_U~,O3{,PAN0IsFalse()
N%NPgT$Z0IsInstanceOfType()
#Dn.so+f&c)Y.j-Z0IsNotInstanceOfType()51Testing软件测试网'c$d WMZG5h~^
IsNotNull()51Testing软件测试网.[0~C;gG`6h
IsNull()
'z9KcE&e1?0IsTrue()
0M+\%F/a0I!~'R_)P0
/d4V]E)J/JY^ q0   
)w kFH'a051Testing软件测试网2T7~,x gSek
Contains()
(c5CW2Pu9tn0DoesNotMatch()
,F6_z4z7U4X"|3E0EndsWith()
AvR,Ww.ux0Matches()51Testing软件测试网.i$^AM:}^"Y}s
StartsWith()51Testing软件测试网j U;lIC)Q+u'B
51Testing软件测试网@sd&X"}%xF3Ul
   51Testing软件测试网 xi@ HtZl

QO~@6D,Yf0AllItemsAreInstancesOfType()
uThN'C(L3oTd8fG w0AllItemsAreNotNull()
}/W |Pu gV]/T0AllItemsAreUnique()
| ?(n$P+Wp+v0AreEqual()51Testing软件测试网0y/Oibd NVS!]O
AreEquivalent()
fdoXt"~,p5wm.\0AreNotEqual()
h6o:o `_&l0AreNotEquivalent()
(V$Eg [.s$^t0Contains()
4l)H'pX W+KU%A'm0DoesNotContain()
1c+nNH.Bk hje3P1L0IsNotSubsetOf()
P.M4f PGT0IsSubsetOf()
wY1H0iW V%D[051Testing软件测试网)sv/@)o UZ
这些自动化单元测试用什么运行?51Testing软件测试网;M-M1Y%d D0[9k5e
51Testing软件测试网 Yq-}4@*s.~
正如前面提到的,xUnit 框架将“测试运行器”的概念定义为应用程序负责:(a) 执行单元测试;(b) 报告测试结果。对于本文,包含 Visual Studio 2005 Team System (VSTS) 的 Unit Testing 引擎作为我们的“测试运行器”。图 2 表示 BankAccountTests.cs 类的执行结果。
r1Le vKm'KE#x'A0
,c4deB9m7c ~0图 2. 测试结果窗格:单元测试执行结果51Testing软件测试网%| } R+tqonzMm2\
51Testing软件测试网4K*U;HYQ(U'u/LD
Microsoft Visual Studio 2005 使用源项目的代码模型动态填充该视图。它基于该源代码中的自定义属性动态发现有关该测试套件的信息。表 4 表示最常见的单元测试属性(以及执行的次序)。51Testing软件测试网.ak gJ X%P-d6h
表 4. 常见单元测试属性51Testing软件测试网6Zej1_&C$a7X
属性     描述
BtO@c![ G Q&e0
OY!{G0}a`%vaN0TestClass()51Testing软件测试网MJ6e KdZ?9_3i
   51Testing软件测试网&uD#ju@
51Testing软件测试网dvS)nO y
该属性表示一个测试装置。51Testing软件测试网-_ o.w8A\7b
51Testing软件测试网:? L{)QZ&bI/l
TestMethod()
6L G+Ni|;N#SNpCf0   51Testing软件测试网j,Z E}-k(Z!w;^z

"m:n\,~!g0该属性表示一个测试用例。51Testing软件测试网9C KJUO
51Testing软件测试网M@V3P-^
AssemblyInitialize()
a0ELE"L'pUH0   51Testing软件测试网m#P$L JNmvd;Msc

$l%XK-v2J0在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之前,执行带有该属性的方法。51Testing软件测试网K+W8jZ ]!Wa0Qn#{
51Testing软件测试网t&zf}9m4Eq'j Z
ClassInitialize()51Testing软件测试网|8I[{y _
   
'V N!K,~;b ` q051Testing软件测试网#y'TH z ^$Yr$L+j
带有该属性的方法在执行第一个测试之前调用。
f,TynE m[/h051Testing软件测试网-Z)K{Y#{(\
TestInitialize()51Testing软件测试网 x(E/Y(M(K `!kn5R
   
[fG.i2Dj051Testing软件测试网0|*r-D8jU_Dn
带有该属性的方法在执行每个 TestMethod() 之前调用。
TZ ]e3tuH051Testing软件测试网a?(^iO"Qi,Y
TestCleanup()51Testing软件测试网2@%s X']s
   51Testing软件测试网6O"V\6Q;q
51Testing软件测试网 ?*zpJIl;l6`
带有该属性的方法在执行每个 TestMethod() 之后调用。51Testing软件测试网4f-GIp x'u)A+I?
51Testing软件测试网m-d\ ke
ClassCleanup()
mr T(oCm:e0   51Testing软件测试网*I_:B5o s-UQ)T
51Testing软件测试网 \,Iq+gv%\[9q6w$TvQ
带有该属性的方法在执行 ALL 测试之后调用。
d0CQ*Up-pe051Testing软件测试网1b}Mn0t3~8jq7f
AssemblyCleanup()
rE Z"l9e:\S(`0   51Testing软件测试网nu#\G Y)r

"d*jG8P9P}5n0在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之后,执行带有该属性的方法。51Testing软件测试网'`#l&mp^s8qG2r%H$g

| o*l'e x2fh3N#`m{y0Descrīption()
*_FV:n4Sy:Di%R0   51Testing软件测试网6mf;H5y5O'[^+k

`*mf'tii0^0提供关于给定 TestMethod() 的描述。51Testing软件测试网7p,?nt4[ t}I)g
51Testing软件测试网 y"CY6G A
Ignore()
F d._,R#hJ#B uv)L'a~0   51Testing软件测试网k+H8s1M C_5J6jm!~
51Testing软件测试网5?'I%`!S^)w-t
由于某种原因忽略 TestMethod() 或 TestClass()。51Testing软件测试网$lV0y0s(}3c.W3wF
51Testing软件测试网!P"l*rrt|m
ExpectedException()51Testing软件测试网@9F @6E1T
   
[C.lw1Ml}0PG0
o?bm-oF4pc0当测试特定异常时,如果使用该属性指定的异常不是从实现代码引发,则测试不会失败。51Testing软件测试网u&p a EcIT
我编写什么类型的测试?
shY9TC:tl;G+H051Testing软件测试网0UB*p0W"WqSj)|a ?
一个方法及其相关测试之间很难有一对一关系。编写自动化单元测试需要开发人员“进行全面思考”,并了解关于对象的所有内容 — 它将如何消耗、使用、处理,以及在任何情况下如何起到积极、消极、非决定性作用。51Testing软件测试网(OO.@ dhcn#N5S|V
51Testing软件测试网"^8U7yL&eU4K*u p$}
例如,请考虑一个用于针对数据库中 Customer 项执行 CRUD(创建、检索、更新、删除)功能的典型对象方法。对于该对象的 Load() 方法,要针对以下方案编写测试:51Testing软件测试网6g)CM9\%l[1LOG
•    51Testing软件测试网8i{-ei {4Mf
51Testing软件测试网.^z8KzM5aQ*X0\$Y
构造函数测试 — 确保对象正确加载,带有正确的信息。51Testing软件测试网^%yU0Zq6@
•    
L1|4]dw-Z/~+O$q0
Eq0J.K1r6d0PositiveLoadScalarTest — 测试数据库中一个 Customer 的成功加载。51Testing软件测试网g3R#?I^y7e._Z,X
•    
UK/c:K#IY;{#`\/X051Testing软件测试网~+W|9j"Z
NegativeLoadScalarTest — 测试一个 Customer 的失败加载,即该 Customer 不在数据库中。
8v5B4i*F;U0dj0•    51Testing软件测试网8Q,mtK;y&|

u9t/|:y.` ~Rj0PositiveLoadTest — 基于已知数据测试 Customer 的成功加载。
.f~?0B:TR fyr0•    
bf:KM*bB051Testing软件测试网1d{E)p P[T
NegativeLoadTest — 测试数据库中不存在的 Customer 的失败加载。
,pV.`hy0yxSs#d0•    51Testing软件测试网 vi7P ~.x+|[ Yx@
51Testing软件测试网!D8bA ^]b9} V
NegativeValidationTest — 确保验证逻辑正确工作。
v9{kz-MD051Testing软件测试网 IJz#H2l f3h)Z
这些只是自动化单元测试套件许多用法中的一部分。我曾经听说一个小团队使用单元测试查看针对其组件的已知安全攻击。从宏观的角度来看,单元测试应该明确保证组件的正常使用。具有丰富的测试集将使团队确信您已经准确实现了既定的目标:编写有效的软件。无论自信源自哪里 — 这就是您需要编写的测试。
pC`)`H['s0您测试什么?51Testing软件测试网!`YL'gi
51Testing软件测试网,kN^+B"R'i
从本质上看,这些自动化单元测试非常低级。它们旨在测试下至构造函数、方法调用的对象,甚至是对象上的属性。51Testing软件测试网b.\.}IBJ4cN)`
51Testing软件测试网_9W#f-x%H!`fq zS
关于“公共对私有”的主题在单元测试派系中引发了许多争论。许多人认为单元测试只应该测试对象的公共接口。其他人认为应该测试每个调用 — 包括内部私有方法。VSTS 支持两个单元测试级别。VSTS 通过使用私有访问器或包装类支持私有测试,后者提供基于“私有”方法和属性生成单元测试的功能。
PR.z]$QO;oa0 
?K2~z#VT0为什么生成代码?
z2c7iJ`&]$ik051Testing软件测试网#} U,J L6Tw$Qi
阅读上面的列表后,您可能会想起前面项目的单个对象,并思考:“如果我用“这些”对象进行该操作,就需要编写大量代码!”请考虑开发人员仍编写“单元测试”代码的事实 — 只在不同的窗体(例如,前面提到的 WinForms 示例)上进行。此外,具有可自行记录、可重用的实现示例带来的好处远大于生成更多代码所带来的麻烦。最后,在单元测试中设计更多的环节已证明可以减少质量保证环节中的故障。51Testing软件测试网%U9F Q\z)E^#O(r%Jq
51Testing软件测试网+u6@/Ik.ES
正如前面所提到的,代码生成是“软件创建软件”的过程。基于可重复的过程创建代码是理想的。例如,一些使用代码生成的较好示例包括:脚本数据、创建表示实体及其在储存库(数据库 CRUD)中存在的对象,或者创建适用于数据维护的 UI 控件。使用代码生成的好处包括:51Testing软件测试网b0@S [ jrr
•    
7YR_%h1] kJs0
%Jc.M1vQcu-x:^#jo0节省时间 — 为什么花几小时/天/周创建一些在几秒/分钟内就可以创建的内容?51Testing软件测试网EN!B:V/dC7I
•    51Testing软件测试网zCK_c9s j
51Testing软件测试网F.Z%|x Y7Sy5M0^
强制标准/约定— 对于强制您的标准和命名约定而言,没有什么比消除开发中的人员因素并依赖基于“您的”规则的可重复过程更好的了。
A1]_D`,U O)L0•    51Testing软件测试网i5n} _%Lvk H:E0Z o
51Testing软件测试网 W"v7|9\dt
测试私有方法的功能 — 正如本文前面提到的,Unit Testing Framework 提供使用“私有访问器”类测试私有方法的功能。该代码生成引擎创建与这些访问器类相关的所有“基础代码”。
h h9g5m0?/O-~ X^rl0•    51Testing软件测试网_ji/Voce)|m

`krQ E0获取现有组件的信息 — 搜索另一个开发人员的组件吗?基于这些组件生成代码可能提供关于该实现以及该对象接口的简明示例。此外,进行设计并在编码之前“清除”其对象的公共接口(例如,通过使用 VS 2005 类设计器)的开发人员将极大地受益于代码生成引擎。51Testing软件测试网m$qe1P$chn
51Testing软件测试网}\)RqMBJ-gc\
正如您所预期的,自动化单元测试属于“优秀代码生成候选者”。在现有组件中指出一些内容并针对这些自动单元测试生成初始代码难道不是很理想吗?而且不只是保留单元测试框架,还会围绕对象的公共接口生成实现示例吗?将来的 Visual Studio 2005 Team System 用户将拥有该功能以及更多功能!
er TlO"Z(i0 51Testing软件测试网%DA#D)Cr1rU ~
让我们生成一些代码吧!
1w!CH7vo4c0
nW-A$W(M2]"r&C:|/N0本例中,我们将生成本文前面提到的 BankAccount 类的代码。本文的这一部分旨在为您介绍代码生成过程,并重点介绍所提供的功能以及从 VSTS 使用 Unit Testing 引擎的好处。51Testing软件测试网m {0F r6ka ^X
第 1 步:创建您的实现代码
e*mD7cgJyT6[?051Testing软件测试网(\p l Jmz
首先,我们创建一个将用作应用程序的业务层的类库项目。51Testing软件测试网;xg(telVn c&e
51Testing软件测试网4{p n@hO
要在 VS 2005 中创建该库:51Testing软件测试网/`PBU;mo
51Testing软件测试网%x|N0e1Q/A3q6^1b
1.
m|&\{?'hh0   
C$pI3W!Hm051Testing软件测试网+s bP&f&{H0jU
启动 Visual Studio 2005 Beta 2。
"r wS1^']"MF2H3t051Testing软件测试网8n(XG)eUqeG
2.
rO`@ J PmFh;]0   
8mo;E/nr X$U051Testing软件测试网HY!O _,[o+Z
单击 File | New | Project。51Testing软件测试网J#P @^,I
51Testing软件测试网J+Q&_/JZLr!P#a0j
3.
(xF^MN0   51Testing软件测试网pI G3_1i

jCBEF5_0选择您选定的语言 Windows,并选择 Class Library 项目模板。51Testing软件测试网CKfPnOY"Dc*N

YyC4d,Q&^X:u,Cl&p04.51Testing软件测试网Gnm Z!@{"\ C6H
   
c[#J'J+f DN3F_0
X l3o7~/A3fe#A0将 Name 和 Solution Name 设置为 BankAccountDemo.Business,选择一个位置,并单击 OK 来创建该类库。51Testing软件测试网 ?Sq6y9\:M#f
51Testing软件测试网CJJ([b{
VS 2005 创建该类后,下一个任务就是创建针对您的项目设计的 BankAccount 类。为此,需要执行以下操作:51Testing软件测试网2lBj'Q W,o3F

VJuE mL/H01.51Testing软件测试网Bl-~ tS^-c-|
   51Testing软件测试网 c.R"c\4{V3y6Uz"Re

Jk0D/W g7T.{0在解决方案资源管理器中单击右键,并单击 Delete,从项目中移除该文件并将其从硬盘中删除。51Testing软件测试网n,r@6K(a\ U
51Testing软件测试网.@v(I kN)e Q!B
2.
JB4zcw#sQ4b0   
e v8D dX0
)z*cNfS]0右键单击 BankAccountDemo.Business 项目,然后单击 Add,之后单击 Class。
2TR8r&`I051Testing软件测试网{e|7C]j`!m+m4x
3.
"\hd5l5i!y0   51Testing软件测试网ua.xc0Q Cm$P T-c e
51Testing软件测试网-X3l t&C%\
选择文件名 BankAccount.cs,并单击 Add 创建类文件。51Testing软件测试网7D4We y u|
51Testing软件测试网&I/a,F%D*O"V k
4.51Testing软件测试网b#B9]FZr!c B6T JZ
   
XL-D[b0
]2L4F P%p0针对 BankAccount.cs 文件对代码进行以下更改。
mS(yj!t'u}0
"sr;b#b7SJ*Gy0using System;51Testing软件测试网6dc0t5[Bn['X
using System.Collections.Generic;51Testing软件测试网C iL7xa.cio
using System.Text;51Testing软件测试网1f'bg0VO
51Testing软件测试网*] T1YB}.BP
namespace BankAccountDemo.Business51Testing软件测试网T;F4?B*e L
{
x/y fe(d NR[5M L0    public class BankAccount
FS jMR0    {
a$S7a.EmD0        // Properties51Testing软件测试网E kr;c _n
        private float _currentBalance;
i'G;b^bhV+e[051Testing软件测试网O%A`3C-N^^ n,O
        public float CurrentBalance51Testing软件测试网!q{k0hCrv&@
        {51Testing软件测试网D&eE p6J$A
            get { return _currentBalance; }51Testing软件测试网xz T&e;Z"{*j
        }
L5t-c4@O a's0
.s D?ub g0        // Constructors51Testing软件测试网4h*e[ Ra:Q
        public BankAccount(float initialBalance)51Testing软件测试网G*`c.V:M,KdK
        {
{9a%w v0fa0Ly]0            this._currentBalance = initialBalance;51Testing软件测试网`"Kd-fpUwf {
        }
&_p6g b e{1{6D0
jy0HZ/u0        // Methods
&J? Bi z-u0        public void DepositMoney(float depositAmount)51Testing软件测试网]N0\w%y B5K ?a
        {
6O]+J6|!v$X6KQ7Z}_0            this._currentBalance += depositAmount;
`(j.T2~:}?:]R0        }51Testing软件测试网 `%{3aYvc ~1w

L8M2F2X iI0        public void MakePayment(float paymentAmount)51Testing软件测试网.d&Pp-T V o?0?4O
        {
H5{/q0Q8D'vM0            this._currentBalance -= paymentAmount;51Testing软件测试网!?V6zN+Vt
        }51Testing软件测试网 I8q_;^]`-o
    }51Testing软件测试网3yp0~`6k
51Testing软件测试网N.eo9I~/S7|
}51Testing软件测试网*gK$kz$Sqv
51Testing软件测试网R4IP L6efLJ

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