-
Notifications
You must be signed in to change notification settings - Fork 0
/
The Inquiry Method for Test Planning(kor).html
872 lines (872 loc) · 54.4 KB
/
The Inquiry Method for Test Planning(kor).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
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 1.5.4">
<meta name="author" content="2016-06-06">
<title>테스트 계획할 때에 필요한 질문들 (The Inquiry Method for Test Planning)</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
/* Remove comment around @import statement below when using as a custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
audio,canvas,video{display:inline-block}
audio:not([controls]){display:none;height:0}
[hidden],template{display:none}
script{display:none!important}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
body{margin:0}
a{background:transparent}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
body{-webkit-font-smoothing:antialiased}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.center{margin-left:auto;margin-right:auto}
.spread{width:100%}
p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:none}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.no-bullet{list-style:none}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite:before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7;font-weight:bold}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
body{tab-size:4}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
.clearfix:after,.float-group:after{clear:both}
*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menu{color:rgba(0,0,0,.8)}
b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
b.button:before{content:"[";padding:0 3px 0 2px}
b.button:after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
#header:after,#content:after,#footnotes:after,#footer:after{clear:both}
#content{margin-top:1.25em}
#content:before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span:before{content:"\00a0\2013\00a0"}
#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark:before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber:after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media only screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
.sect1{padding-bottom:.625em}
@media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
.sect1+.sect1{border-top:1px solid #efefed}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
@media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.listingblock>.content{position:relative}
.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
.listingblock:hover code[data-lang]:before{display:block}
.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
table.pyhltable td.code{padding-left:.75em;padding-right:0}
pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
pre.pygments .lineno{display:inline-block;margin-right:.25em}
table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
.quoteblock .quoteblock blockquote:before{display:none}
.verseblock{margin:0 1em 1.25em 1em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract{margin:0 0 1.25em 0;display:block}
.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
table.tableblock{max-width:100%;border-collapse:separate}
table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot{border-width:1px 0}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
td>div.verse{white-space:pre}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
ul.inline>li>*{display:block}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
.colist>table tr>td:last-of-type{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background-color:#00fafa}
.black{color:#000}
.black-background{background-color:#000}
.blue{color:#0000bf}
.blue-background{background-color:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background-color:#fa00fa}
.gray{color:#606060}
.gray-background{background-color:#7d7d7d}
.green{color:#006000}
.green-background{background-color:#007d00}
.lime{color:#00bf00}
.lime-background{background-color:#00fa00}
.maroon{color:#600000}
.maroon-background{background-color:#7d0000}
.navy{color:#000060}
.navy-background{background-color:#00007d}
.olive{color:#606000}
.olive-background{background-color:#7d7d00}
.purple{color:#600060}
.purple-background{background-color:#7d007d}
.red{color:#bf0000}
.red-background{background-color:#fa0000}
.silver{color:#909090}
.silver-background{background-color:#bcbcbc}
.teal{color:#006060}
.teal-background{background-color:#007d7d}
.white{color:#bfbfbf}
.white-background{background-color:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background-color:#fafa00}
span.icon>.fa{cursor:default}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]:after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@media print{@page{margin:1.25cm .75cm}
*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]:after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
.sect1{padding-bottom:0!important}
.sect1+.sect1{border:0!important}
#header>h1:first-child{margin-top:1.25rem}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span:before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]:before{display:block}
#footer{background:none!important;padding:0 .9375em}
#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
</head>
<body class="article">
<div id="header">
<h1>테스트 계획할 때에 필요한 질문들 (The Inquiry Method for Test Planning)</h1>
<div class="details">
<span id="author" class="author">Anthony Vallone (http://www.anthonysapps.com/anthony)</span><br>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/3.1.0/css/font-awesome.min.css">
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>2016.6.6에 Google testing blog에 올라온 <a href="http://googletesting.blogspot.kr/2016/06/the-inquiry-method-for-test-planning.html?utm_source=feedburner&utm_medium=email&utm_campaign=Feed:+blogspot/RLXA+">The Inquiry Method for Test Planning (by Anthony Vallone)</a>의 포스팅을 번역하였다.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>테스트 플래닝을 하면서 이런 질문을 던져본 적이 언제였던가 반성하면서, 바로 즉답은 찾지 못해도 질문은 던져 볼 수 있지 않겠는가를 생각하며 번역해본다.</p>
</li>
<li>
<p>참고로, 질문에 대해서는 영어 병기를 하였으며 가급적 영어 질문으로 되새겨 보기를…​ 테스트 플랜 때 마다 스스로 이 질문을 던져보기를 바래본다.</p>
</li>
</ul>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>테스트 플랜을 만드는 것은 복잡한 작업이다. 이상적인 테스트 플랜은 <a href="https://en.wikipedia.org/wiki/Cost%E2%80%93benefit_analysis">비용 편익 분석(cost-benefit analysis)</a>과 <a href="https://en.wikipedia.org/wiki/Risk_analysis">위험 분석(risk analysis)</a>의 원칙을 적용하여 만들어지며, 소프트웨어 개발의 다음과 같은 요소들이 극적인 균형을 이룬다.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>구현 비용(Implementation cost)</strong>: 특정 시나리오에 대해 테스트 가능한(testable) 기능을 만들고, 자동화 테스트를 구현하는 시간과 복잡도는 매우 다양하다. 이런 부분은 단기간에 걸쳐 개발 비용에 영향을 준다.</p>
</li>
<li>
<p><strong>유지보수 비용(Maintenance cost)</strong>: 테스트 또는 테스트 플랜은 유지보수가 쉬운 것 부터 어려운 것까지 매우 다양하다. 이는 장기적으로 개발 비용에 영향을 준다. 수동 테스트의 경우 장기간에 걸쳐 비용을 든다.</p>
</li>
<li>
<p><strong>통화 비용(Monetary cost)</strong>: 어떤 테스트 접근 방식은 실제로 돈이 들어간다.</p>
</li>
<li>
<p><strong>이득(Benefit)</strong>: 정도는 다양하지만, 테스트를 통해 이슈를 예방하고 생산성을 지원할 수 있다. 개발 주기 상에서 빨리 문제를 잡을 수록, 더 많은 이득을 얻는다.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>이런 요소들이 효과적으로 균형잡힌 플랜을 만드는 것은 프로젝트 중요도, 구현의 상세 정도, 가용한 리소스 및 팀 의견에 크게 좌우된다. 많은 프로젝트에서 비용이 적게 들고 큰 이득을 주는 단위테스트로 괄목할 만한 커버리지를 달성할 수 있음에도 불구하고, 더 큰 테스트(larger test)와 복잡한 조건을 갖는 케이스에 더 무게를 두기도 한다. 미션 크리티컬 프로젝트는 가능한 리스크를 반드시 최소화해야한다. 그래서 그럴 경우에는 모든 단계에 었어 엄격한 테스트를 개발하고 더 높은 비용도 감당케 된다.</p>
</div>
<div class="paragraph">
<p>이 가이드는 프로젝트에 이런 요소들을 어떻게 균형을 주어야하는 지에 대해서는 독자의 몫으로 놔둔다. 또한 테스트 템플릿도 제공하지 않는다. 왜냐하면 템플릿은 너무 일반적이거나 너무 자세하고 또한 빨리 구식이 되어버리기 때문이다. 대신에 테스테 플랜을 작성함에 있어 어떻게 최적의 내용을 선택할 것인지에 대해 초점을 둔다.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_테스트_플랜_vs_전략_test_plan_vs_strategy">테스트 플랜 vs. 전략 (Test plan vs. strategy)</h2>
<div class="sectionbody">
<div class="paragraph">
<p>계속 나아가기에 앞서, 먼저 테스트 플랜을 정의하는 2 가지 일반적인 방법을 분류해보자.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>단일 테스트 플랜(Single test plan)</strong>: 어떤 프로젝트는 프로젝트애서 계획되고 구현되는 모든 테스팅을 기술하는 단일 "테스트 플랜(test plan)"을 갖는다.</p>
</li>
<li>
<p><strong>단일 테스트 전략과 다중 플랜(Single test strategy and many plans)</strong>: 어떤 프로젝트는 하나의 "테스트 전략(test strategy)" 문서와 함께 다수의 작은 "테스트 플랜(test plan)"문서를 갖는다. 대게 전략(strategy)은 테스트 접근 방법과 목표를 전반적으로 담는 반면에, 플랜(plan)은 특정 기능 또는 업데이트 사항을 담는다.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>두 가지 모두 프로젝트 설계 문서로 통합될 수 있다. 둘 다 잘 작동하기 때문에 프로젝트에 맞게 선택하면 된다. 일반적으로 말하면, 안정적인 프로젝트에서는 단일 플랜이 좋고, 반면에 빠르게 변하는 프로젝트에서는 자주 변경되지 않는 전략과 빈번히 추가되는 플랜이 최적의 조합이다.</p>
</div>
<div class="paragraph">
<p>이 가이드의 목적 상, 두 개의 테스트 문서 모두를 "테스트 플랜(test plan)"으로 간단히 부르겠다. 만약 여러 문서를 다룬다면, 아래 제시되는 조언을 문서들에 대해 적용하기만 하면 된다.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_내용_선택_content_selection">내용 선택 (Content selection)</h2>
<div class="sectionbody">
<div class="paragraph">
<p>테스트 플랜의 내용을 작성하는 좋은 방법은 답이 필요한 질문을 모두 나열해보는 것이다. 아래의 리스트는 프로젝트에 따라 적용 될 수도 혹은 안 될 수도 있지만, 중요한 질문들을 광범위하게 모아 정리한 것이다. 리스트 전체를 찬찬히 살펴보면서 적용할 것들을 선택해보라. 이들 질문에 답을 해가면서 테스트 플랜에 들어가는 내용을 채우게 되고, 선택한 내용을 팀에서 선호하는 양식에 맞게 플랜 구조를 갖춰 만들면 된다.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_사전_조건_prerequisites">사전 조건 (Prerequisites)</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><strong>테스트 플랜이 필요한가?</strong> 프로젝트 설계 문서나 명확한 프로덕트 비전이 없다면, 테스트 플랜을 작성하기에는 너무 이르다 할수 있다.</p>
</li>
<li>
<p><strong>프로젝트 설계에 테스트가능성(testability)이 고려되어있는가?</strong> 프로젝트가 구현에 깊이 들어가기 전에, 모든 시나리오는 테스트 가능할 수 있도록 설계 되어야한다(가능하다면 자동화 될 수 있도록). 프로젝트 설계 문서와 테스트 플랜 모두에 테스트 가능성(testability)에 대한 커멘트를 담고 있어야한다.</p>
</li>
<li>
<p><strong>플랜을 지속적으로 업데이트할 것인가?</strong> 혹 그렇다면, 지나치게 상세한 부분을 추가하는 것은 주의할 필요가 있다. 그렇지 않으면 플랜을 유지보수하기에 너무 힘들 수 있다.</p>
</li>
<li>
<p><strong>이와 같은 품질에 대한 노력이 다른 팀과 겹치지 않는가?</strong> 혹 그렇다면, 어떻게 중복 작업을 피할 것인가?</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_리스크_risk">리스크 (Risk)</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><strong>중대한 프로젝트 리스크가 있는가? 그렇다면 어떻게 완화할 것인가? (Are there any significant project risks, and how will you mitigate them?)</strong></p>
<div class="ulist">
<ul>
<li>
<p>사람이나 동물에 대한 상해 (Injury to people or animals)</p>
</li>
<li>
<p>사용자 데이터의 보안과 무결성 (Security and integrity of user data)</p>
</li>
<li>
<p>사용자 개인정보보호 (User privacy)</p>
</li>
<li>
<p>회사 시스템에 대한 보안 (Security of company systems)</p>
</li>
<li>
<p>하드웨어 또는 자신에 대한 피해 (Hardware or property damage)</p>
</li>
<li>
<p>법규 준수 이슈 (Legal and compliance issues)</p>
</li>
<li>
<p>대외비 및 중요 데이타에 대한 누출 (Exposure of confidential or sensitive data)</p>
</li>
<li>
<p>데이터 손실 및 변조 (Data loss or corruption)</p>
</li>
<li>
<p>수익 손실 (Revenue loss)</p>
</li>
<li>
<p>회복불가한 시나리오(Unrecoverable scenarios)</p>
</li>
<li>
<p>SLA (SLAs)</p>
</li>
<li>
<p>성능 요구사항 (Performance requirements)</p>
</li>
<li>
<p>사용자에게 잘못된 정보 전달 (Misinforming users)</p>
</li>
<li>
<p>타 프로젝트에 영향 (Impact to other projects)</p>
</li>
<li>
<p>타 프로젝트로 부터의 영향 (Impact from other projects)</p>
</li>
<li>
<p>회사 평판에 영향 (Impact to company’s public image)</p>
</li>
<li>
<p>생산성 저하 (Loss of productivity)</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>프로젝트의 기술적 취약점은 무엇인가? (What are the project’s technical vulnerabilities?)</strong></p>
<div class="ulist">
<ul>
<li>
<p>해킹당하기 쉬운, 깨지기 쉬운 기능이나 컴포넌트 또는 대규모 리팩토링 필요한 부분</p>
</li>
<li>
<p>자주 이슈를 발생 시킨 플랫폼 또는 의존성 요소들</p>
</li>
<li>
<p>사용자가 시스템에 해를 끼칠 가능성</p>
</li>
<li>
<p>과거 이슈들에서 보여지는 트렌드</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_커버리지_coverage">커버리지 (Coverage)</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><strong>테스트 외양은 무엇처럼 보이나? (What does the test surface look like?)</strong> 하나의 메소드를 갖는 간단한 라이브러리인가? 또는 수많은 유스케이스를 갖는 멀티 플랫폼 클라이언트-서버 스테이트풀 시스템인가? 장애를 일으킬 수 있을 만한 부분을 찾도록 시스템 설계와 아키텍쳐를 기술해보라.</p>
</li>
<li>
<p><strong>기능은 무엇인가? (What are the features?)</strong> 모든 기능에 대한 요약 리스트를 만들고, 기능 카테고리 별로 어떻게 테스트할지를 기술해보라.</p>
</li>
<li>
<p><strong>테스테 제외 영역은 무엇인가? (What will not be tested?)</strong> 모든 가능성을 커버하는 테스트 스윗은 없다. 이 부분에 대한 내용을 앞 부분에 두고, 특정 케이스를 테스트 하지 않는 근거를 적어두는 것이 최적의 방법이다. 예) 낮은 우선순위를 갖는 낮은 리스크에 대한 영역, 가능성이 적은 복잡한 케이스들, 다른 팀에 의해 커버되는 영역, 테스팅할 수 있는 준비가 되어있지 않은 기능들 등..</p>
</li>
<li>
<p><strong>단위(소규모) 테스트, 통합(중규모) 테스트 및 시스템(대규모) 테스트가 무엇을 커버하는가? (What is covered by unit (small), integration (medium), and system (large) tests?)</strong> 가능할 할 수 있는 대로 테스트는 더 작게 만들고, 남겨진 작은 영역에 대해서만 더 큰 테스트를 만들라. 어떤 크기의 테스트로 테스트 케이스의 특정 부분을 테스트하는 것이 가장 최적인지를 기술하고, 그 근거를 제시하라.</p>
</li>
<li>
<p><strong>수동테스트 vs 자동화테스트, 무엇을 수동 또는 자동화로 테스트할 것인가? (What will be tested manually vs. automated?)</strong> 실현가능하고 비용대비 효과가 클 경우, 자동화는 항상 최고의 선택이다. 많은 프로젝트에서 모든 테스트를 자동화 할 수 있다. 하지만, 수동 테스트를 선택하는 것이 좋을 때가 있다. 수동으로 테스트할 테스트 케이스를 기술하고 근거를 제시하라.</p>
</li>
<li>
<p><strong>각각의 테스트 영역을 어떻게 커버할 것인가? (How are you covering each test category?)</strong> 다음을 고려해보라</p>
<div class="ulist">
<ul>
<li>
<p><a href="http://www.w3.org/wiki/Accessibility_testing">접근성(accessibility)</a></p>
</li>
<li>
<p><a href="http://en.wikipedia.org/wiki/Functional_testing">기능(functional)</a></p>
</li>
<li>
<p><a href="http://en.wikipedia.org/wiki/Fuzz_testing">퍼징(fuzz)</a></p>
</li>
<li>
<p>국제화 및 현지화(internationalization and localization)</p>
</li>
<li>
<p><a href="http://en.wikipedia.org/wiki/Software_performance_testing">성능(performance)</a>, <a href="http://en.wikipedia.org/wiki/Load_testing">로드(load)</a>, <a href="http://en.wikipedia.org/wiki/Stress_testing">스트레스(stress)</a>, 및 <a href="https://en.wikipedia.org/wiki/Soak_testing">지속성 또는 소크 (endurance (aka soak))</a></p>
</li>
<li>
<p>개인정보보호(privacy)</p>
</li>
<li>
<p><a href="http://en.wikipedia.org/wiki/Security_testing">보안(security)</a></p>
</li>
<li>
<p><a href="http://en.wikipedia.org/wiki/Smoke_testing_(software)">스모크(smoke)</a></p>
</li>
<li>
<p><a href="http://en.wikipedia.org/wiki/Stability_testing">안정성(stability)</a></p>
</li>
<li>
<p><a href="http://en.wikipedia.org/wiki/Usability_testing">사용성(usability)</a></p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>정적 및 동적 분석 툴을 사용할 것인가? (Will you use static and/or dynamic analysis tools?)</strong> <a href="https://en.wikipedia.org/wiki/Static_program_analysis">정적 분석 툴</a> 및 <a href="https://en.wikipedia.org/wiki/Dynamic_program_analysis">동적 분석 툴</a>은 리뷰나 테스트로 찾기 어려운 문제를 발견할 수 있다. 이 툴에 대한 사용을 고려해보라.</p>
</li>
<li>
<p><strong>시스템 컴포넌트 및 의존성에 대한 스텁(stub), 목(mock), 페이크(fake), 스테이징(stage)을 어떻게 만들 것인가? 아니면 테스팅 기간동안에만 사용할 것인가?(How will system components and dependencies be stubbed, mocked, faked, staged, or used normally during testing?)</strong> 이들 각각은 사용해야하는 좋은 이유가 있고, 커버리지에 영향을 주는 부분이 다르다.</p>
</li>
<li>
<p><strong>테스트 대상이 되는 빌드는 무엇인가? (What builds are your tests running against?)</strong> 테스트 대상은 HEAD 빌드, 스테이지 빌드인가 아니면 릴리즈 대상 후보인가? 만약 HEAD에 대해서만 테스트한다면, 어떻게 릴리즈의 개별 변경리스트의 셋을 선별하여 릴리즈 빌드를 테스트할 것인가? 그리고 보통 HEAD 빌드에서 볼 수 없는 시스템 형상 변경은 어떻게 테스트할 것인가?</p>
</li>
<li>
<p><strong>팀 외부에서 수핼될 테스팅의 종류는 무엇인가? (What kind of testing will be done outside of your team?)</strong> 예를 들면,</p>
<div class="ulist">
<ul>
<li>
<p><a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">도그푸딩(Dogfooding)</a></p>
</li>
<li>
<p>외부 클라우드소싱 테스팅</p>
</li>
<li>
<p>공개 알파/베타 버전 (릴리즈 전에 어떻게 테스트할 것인가?)</p>
</li>
<li>
<p>외부 신뢰할 만한 테스터들</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>데이터 마이그레이션은 어떻게 테스트하는가? (How are data migrations tested?)</strong> 마이그레이션 전후 결과에 대한 특별한 테스트가 필요할 수도 있다.</p>
</li>
<li>
<p><strong>하위 호환성에 대한 고려가 필요하지 않은가? (Do you need to be concerned with backward compatibility?)</strong> 이미 다수의 사용자에게 배포되어 사용 중이거나, 타 시스템과 의존성이 있는 시스템의 프로토콜, 환경설정, 기능 및 동작이 있을 수 있다.</p>
</li>
<li>
<p><strong>서버/클라이언트/디바이스 소프트웨어에 대한 업그레이드 시나리오 테스트가 필요한가? 또는 소프트웨어에서 사용중인 의존성/플랫폼/API에 대한 업그레이트 테스트가 필요한가? (Do you need to test upgrade scenarios for server/client/device software or dependencies/platforms/APIs that the software utilizes?)</strong></p>
</li>
<li>
<p><strong>라인 커버러지 목표가 필요한가? (Do you have line coverage goals?)</strong></p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_툴사용_및_인프라스트럭쳐_tooling_and_infrastructure">툴사용 및 인프라스트럭쳐 (Tooling and Infrastructure)</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><strong>새로운 테스트 프레임워크가 필요한가? (Do you need new test frameworks?)</strong> 필요하다면, 플랜에 이를 적어두고 설계에 대한 링크를 추가한다.</p>
</li>
<li>
<p><strong>새로운 테스트 랩 셋업이 필요한가? (Do you need a new test lab setup?)</strong> 필요하다면, 플랜에 이를 적어두고 설계에 대한 링크를 추가한다.</p>
</li>
<li>
<p><strong>프로젝트가 다른 프로젝트에 서비스를 제공한다면, 다른 프로젝트 사용자에게 테스트툴을 제공하는가? (If your project offers a service to other projects, are you providing test tools to those users?)</strong> 목(mock), 페이크(fake) 또는 신뢰할 만한 스테이지 서버를 사용자에게 제공해서, 사용자의 시스템에서 제공하는 시스템과 통합 테스트를 해볼 수 있도록 하라.</p>
</li>
<li>
<p><strong>엔드-투-엔드 테스팅의 경우, 테스트 인프라스트럭쳐와 테스트 대상 시스템, 그리고 다른 의존성이 있는 부분들을 어떻게 관리할 것인가? (For end-to-end testing, how will test infrastructure, systems under test, and other dependencies be managed?)</strong> 이들을 어떻게 배포할 것인가? 어떻게 셋업/티어다운 (setup/torn-down)이 지속되도록 할 것인가? 데이터 센터 간의 마이그레이션이 필요할 때 이를 어떻게 처리할 것인가?</p>
</li>
<li>
<p><strong>시스템 디버그 또는 테스트 실패시 도움을 주는 새로운 툴이 필요한가? (Do you need tools to help debug system or test failures?)</strong> 있는 툴을 사용할 수도 있고, 새로운 툴을 개발해야할 수도 있다.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_프로세스_process">프로세스 (Process)</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><strong>테스트 일정에 대한 요구사항이 있는가? (Are there test schedule requirements?)</strong> 확정 일정이 언제이며, 테스트가 진행되어야 (또는 테스트 결과가 언제 제공되어야) 하는가? 다른 것보다 먼저 완료해야하는 중요한 테스트가 있는가?</p>
</li>
<li>
<p><strong>빌드와 테스트는 어떻게 지속적으로 수행되는가? (How are builds and tests run continuously?)</strong> 대부분의 작은 테스트(small test)는 <a href="https://en.wikipedia.org/wiki/Continuous_integration">CI(continuous integration)</a> 툴로 수행된다. 하지만 큰 테스트(large test)는 다른 접근 방법이 필요하다. 대안으로 필요할 때에 큰 테스트를 수행하도록 하는 옵션이 필요할 수도 있다.</p>
</li>
<li>
<p><strong>빌드 및 테스트 결과를 어떻게 보고하고 모니터링할 것인가? (How will build and test results be reported and monitored?)</strong></p>
<div class="ulist">
<ul>
<li>
<p>CI를 모니터링하는 로테이션 팀이 있는가?</p>
</li>
<li>
<p>큰 테스트(large test)를 모니터링할 때에는 전문성을 갖고 있는 사람이 필요할 수도 있다.</p>
</li>
<li>
<p>테스트 결과 및 다른 프로젝트 상태를 볼 수 있는 대시보드가 필요한가?</p>
</li>
<li>
<p>누가 이메일 알림을 받을 것이고 어떻게 알림을 줄 것인가?</p>
</li>
<li>
<p>테스트를 모니터링하는 사람이 커뮤니케이션할 때 간단히 말로 할 것인가?</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>릴리즈시에 테스트를 어떻게 사용하는가? (How are tests used when releasing?)</strong></p>
<div class="ulist">
<ul>
<li>
<p>릴리즈 후보에 대해 명시적으로 수행할 테스트가 있는가? 또는 릴리즈 프로세스는 지속적으로 보고되는 테스트 결과에 의존하는가?</p>
</li>
<li>
<p>시스템 컴포넌트나 의존요소들이 개별적으로 릴리즈된다면, 각 릴리즈 별로 수행할 테스트가 있는가?</p>
</li>
<li>
<p>"릴리즈 블로커(release blocker)" 버그가 있다면 릴리즈 매니저는 실제 릴리즈를 중단시킬 것인가? 릴리즈 블로킹 영역이 무엇인지에 대한 합의가 있었는가?</p>
</li>
<li>
<p>카나리아 릴리즈(canary releases)는 언제 수행할 것이며, 어떻게 진행 사항을 모니터하고 테스트할 것인가?</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>외부 사용자가 어떻게 버그 리포트를 할 것인가? (How will external users report bugs?)</strong> 피드백 링크 또는 리포트를 수집할 툴을 고려해보라.</p>
</li>
<li>
<p><strong>버그 트리아지(bug triage)는 어떻게 진행할 것인가? (How does bug triage work?)</strong> 트리아지 후보에 들어갈 버그 분류나 레이블을 고려하라. 버그 리포트를 작성할 때에 팀이 반드시 넣도록 하고, 버그 리포트 템플릿을 만들 때에도 이를 알 수 있도록 하라. 하나의 버그 트래커를 사용하고 있는가? 또는 자동이나 수동 임포트 셋업이 필요한가?</p>
</li>
<li>
<p><strong>발견할 수 있었던 버그를 닫기 전에 새 테스트를 생성하는 규칙이 있는가? (Do you have a policy for submitting new tests before closing bugs that could have been caught?)</strong></p>
</li>
<li>
<p><strong>반영되지 않은 변경에 대해 어떻게 테스트를 사용하는가? (How are tests used for unsubmitted changes?)</strong> 실험 빌드에 대해 누구든지 전체 테스트를 수행할 수 있다면 (이럴 수 있다면 좋다), 어떻게 이를 제공할지 고민해보라.</p>
</li>
<li>
<p><strong>팀 멤버가 어떻게 테스트를 생성하고 디버그할 수 있는가? (How can team members create and/or debug tests?)</strong> 어떻게 이를 제공할지 고민해보라.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_유용성_utility">유용성 (Utility)</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><strong>누가 테스트 플랜을 읽는가? (Who are the test plan readers?)</strong> 어떤 테스트 플랜은 소수의 사람만이 읽는 반면, 어떤 것은 많은 사람이 읽는다. 최소한 모든 이해관계자(프로젝트 관리자, 테크 리드, 기획자)로 부터의 리뷰는 받아야한다. 플랜을 작성할 때에는 예상되는 독자에 대해 반드시 이해하고, 플랜을 이해할 수 있도록 배경을 충분히 설명해야한다. 그리고 플랜을 읽을 사람들이 가질만한 모든 질문에 대해 대답해본다(비록 대답을 갖고 있지 않더라도). 또한 이를 읽은 사람들이 더 많은 정보를 얻을 수 있도록, 테스트 플랜에 대해 물어볼 수 있는 연락처를 추가해보라.</p>
</li>
<li>
<p><strong>어떻게 실제 테스트 케이스에 대해 리뷰할 수 있는가? (How can readers review the actual test cases?)</strong> 수동 케이스는 테스트 케이스 관리 툴에 있거나, 별도 문서 또는 테스트플랜 내에 있기도 한다. 자동화 테스트 케이스를 포함하는 디렉토리 링크를 제공하는 것도 고려해보라.</p>
</li>
<li>
<p><strong>요구사항, 기능과 테스트 간의 추적성이 필요한가? (Do you need traceability between requirements, features, and tests?)</strong></p>
</li>
<li>
<p><strong>제품 상태 및 품질 목표에 대한 일반적인 목표를 갖고 있는가? 어떻게 성공에 대해 측정할 것인가? (Do you have any general product health or quality goals and how will you measure success?)</strong> 다음을 고려해보자</p>
<div class="ulist">
<ul>
<li>
<p>릴리즈 흐름/리듬 (Release cadence)</p>
</li>
<li>
<p>운영상 사용자가 발견한 버그 수 (Number of bugs caught by users in production)</p>
</li>
<li>
<p>릴리즈 테스팅에서 발견한 버그 수 (Number of bugs caught in release testing)</p>
</li>
<li>
<p>시간에 흐름에 따른 오픈 버그 수 (Number of open bugs over time)</p>
</li>
<li>
<p>코드 커버리지 (Code coverage)</p>
</li>
<li>
<p>수동 테스트 비용 (Cost of manual testing)</p>
</li>
<li>
<p>새로운 테스트 생성의 어려움 (Difficulty of creating new tests)</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2016-06-13 21:54:36 KST
</div>
</div>
</body>
</html>