-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathTestDrivenDevelopment.html
347 lines (292 loc) · 11.7 KB
/
TestDrivenDevelopment.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>TestDrivenDevelopment</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
/* Author: Nicolas Hery - http://nicolashery.com */
/* Version: 29d1c5bc36da364ad5aa86946d420b7bbc54a253 */
/* Source: https://github.com/nicolahery/markdownpad-github */
/* RESET
=============================================================================*/
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
}
/* BODY
=============================================================================*/
body {
font-family: Helvetica, arial, freesans, clean, sans-serif;
font-size: 14px;
line-height: 1.6;
color: #333;
background-color: #fff;
padding: 20px;
max-width: 960px;
margin: 0 auto;
}
body>*:first-child {
margin-top: 0 !important;
}
body>*:last-child {
margin-bottom: 0 !important;
}
/* BLOCKS
=============================================================================*/
p, blockquote, ul, ol, dl, table, pre {
margin: 15px 0;
}
/* HEADERS
=============================================================================*/
h1, h2, h3, h4, h5, h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
}
h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
font-size: inherit;
}
h1 {
font-size: 28px;
color: #000;
}
h2 {
font-size: 24px;
border-bottom: 1px solid #ccc;
color: #000;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
h5 {
font-size: 14px;
}
h6 {
color: #777;
font-size: 14px;
}
body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
margin-top: 0;
padding-top: 0;
}
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}
h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
margin-top: 10px;
}
/* LINKS
=============================================================================*/
a {
color: #4183C4;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* LISTS
=============================================================================*/
ul, ol {
padding-left: 30px;
}
ul li > :first-child,
ol li > :first-child,
ul li ul:first-of-type,
ol li ol:first-of-type,
ul li ol:first-of-type,
ol li ul:first-of-type {
margin-top: 0px;
}
ul ul, ul ol, ol ol, ol ul {
margin-bottom: 0;
}
dl {
padding: 0;
}
dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px;
}
dl dt:first-child {
padding: 0;
}
dl dt>:first-child {
margin-top: 0px;
}
dl dt>:last-child {
margin-bottom: 0px;
}
dl dd {
margin: 0 0 15px;
padding: 0 15px;
}
dl dd>:first-child {
margin-top: 0px;
}
dl dd>:last-child {
margin-bottom: 0px;
}
/* CODE
=============================================================================*/
pre, code, tt {
font-size: 12px;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}
code, tt {
margin: 0 0px;
padding: 0px 0px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}
pre>code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}
pre {
background-color: #f8f8f8;
border: 1px solid #ccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}
pre code, pre tt {
background-color: transparent;
border: none;
}
/* QUOTES
=============================================================================*/
blockquote {
border-left: 4px solid #DDD;
padding: 0 15px;
color: #777;
}
blockquote>:first-child {
margin-top: 0px;
}
blockquote>:last-child {
margin-bottom: 0px;
}
/* HORIZONTAL RULES
=============================================================================*/
hr {
clear: both;
margin: 15px 0;
height: 0px;
overflow: hidden;
border: none;
background: transparent;
border-bottom: 4px solid #ddd;
padding: 0;
}
/* TABLES
=============================================================================*/
table th {
font-weight: bold;
}
table th, table td {
border: 1px solid #ccc;
padding: 6px 13px;
}
table tr {
border-top: 1px solid #ccc;
background-color: #fff;
}
table tr:nth-child(2n) {
background-color: #f8f8f8;
}
/* IMAGES
=============================================================================*/
img {
max-width: 100%
}
</style>
</head>
<body>
<h1>敏捷开发-编程实践之测试驱动开发</h1>
<h2>背景概述</h2>
<p>软件开发按步骤分为:需求分析、概要设计、详细设计、编码、测试、软件交付、验收、软件维护。需求是千变万化的,人们总结出了各种不同的软件开发过程;不同的开发过程有与其相适应软件开发模型,比如教科书上了瀑布开发模型、螺旋开发模型等等(<a href="http://baike.baidu.com/view/8300.htm">参考</a>)。</p>
<p>软件开发过程是在某种需求背景下的价值观和方法论,像IBM总结并实践的统一开发过程(<a href="http://zh.wikipedia.org/wiki/IBM-Rational%E7%BB%9F%E4%B8%80%E8%BF%87%E7%A8%8B">RUP</a>)是一种重量级的大型商业软件开发过程。对于小型的软件开发团队,现在流行一种被称之为敏捷开发的软件开发过程,下面要说的就是此过程中对软件开发的编码和测试步骤的一种实践方法——TDD。</p>
<h2>名词解释</h2>
<ul>
<li>TDD(Test Driven Development): 测试驱动开发</li>
</ul>
<h2>什么是测试驱动开发</h2>
<p>一般来说,程序开发都是先编码完成功能开发,然后再写测试代码。这样可能存在这样的问题:</p>
<ul>
<li>先开发功能,开发者很可能对功能进行过度设计,把时间浪费在可能不需要的功能上</li>
<li>设计出的接口可能不完善,可能出现功能都实现,但使用起来比较别扭,使的软件质量降低</li>
<li>很可能完成功能后,因为种种理由放弃编写测试代码,导致功能实现中留下太他的隐患</li>
<li>功能完成一段时间以后,发现功能上有不足,想动手重构时发现有太多的代码依赖此模块,怕重构导致太多的问题而放弃重构</li>
</ul>
<p>测试驱动开发是从另外一个角度进行程序开发:</p>
<ul>
<li>简单来说,它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行</li>
<li>从原理上来说,在开发功能代码之前,先编写测试代码,开发人员站在使用者的角度对功能模块的接口进行思考,在写测试例的同时明确功能需求并完善接口设计;之后开发功能代码的时候可以做到要做的事情心中有数</li>
<li>从效率上来说,在写测试的时候同时明确功能需求,可以省去详细设计的文档要求;另外,因为一开始就对功能需求比较明确,有效的减少了开发时反复的次数</li>
<li>从维护上来说,因为有测试例存在,对功能模块的各种修改都不会存在隐患,在需要的时候可以对整个功能模块进行大胆的重构来进行优化和改进</li>
</ul>
<h3>参考资料</h3>
<ul>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-tdd/">浅谈测试驱动开发(TDD)</a></li>
<li><a href="http://baike.baidu.com/view/184088.htm">测试驱动开发</a></li>
<li><a href="http://www.360doc.com/content/07/0516/17/15822_503491.shtml">测试驱动开发TDD简介入门</a></li>
</ul>
<h3>适用场景</h3>
<p>人员有变动的小型团队开发中小型项目,需要持续开发并维护来响应需求变更。</p>
<ul>
<li><a href="http://www.csdn.net/article/2011-12-27/309713">拒绝测试驱动开发(TDD)的10个理由</a></li>
</ul>
<h3>优缺点</h3>
<ul>
<li><a href="http://liweibird.blog.51cto.com/631764/568391">敏捷开发-测试驱动开发优缺点</a></li>
</ul>
<h3>实践要点</h3>
<ul>
<li>项目适合吗</li>
<li>改变开发者的思维</li>
<li>理论只是理论,要和具体项目相结合</li>
<li>只是说说是改变不了任何东西,要具体去做</li>
</ul>
<h2>C++项目开发TDD实践的助推器——C++单元测试框架</h2>
<h3>单元测试框架</h3>
<p>是用来辅助开发者快速编写测试例并进行测试的功能库,每种不同的语言都有适合自己开发语言的测试框架,对于C++来说也不例外,且有很多测试框架可选,比如:CppUnit,UnitCpp, CxxTest,Boost.Test等等(<a href="http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B">已知列表</a>),下面要说的是GoogleTest,简称gtest.</p>
<h3>概念介绍</h3>
<ul>
<li>Test Case: 测试例,测试员具体编写的东西,包含对被测试对象的一个或一组相关的功能接口的测试代码段</li>
<li>Test Suite: 测试包/组, 是test Case的一种组织结构,一个Test Suite包含一组相关的测试例,可能是一个被测试对象所有功能接口的测试</li>
<li>Test Framework: 对编写好的测试例根据某种策略挨个执行测试例并输出测试结果的功能框架</li>
</ul>
<h3>参考资料</h3>
<ul>
<li><a href="https://code.google.com/p/googletest/">googletest</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/03/31/1426758.html">玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/04/06/1430364.html">玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/04/06/1430396.html">玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/04/08/1431297.html">玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/04/08/1432043.html">玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/04/10/1432789.html">玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/04/11/1433744.html">玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/04/12/1434155.html">玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2009/08/02/1536901.html">gtest中如何跳出当前测试案例</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2010/01/09/beautiful-testcase.html">编写优美的GTest测试案例</a></li>
</ul>
</body>
</html>
<!-- This document was created with MarkdownPad, the Markdown editor for Windows (http://markdownpad.com) -->