This class is about defining class, memory management, and new feature, especially Property in Objective-C 2.0. 

define class is not familiar to C/C++ programmer, because its look is so different, We have to use '@interface' instead of 'class' and method cannot be in bracket, and method name and member variable's name can be equal. But it is not to hard to use. it is so easy!!. 

And memory management... it is really different from C/C++. There is global (This statement can be wrong) memory pool, called autorelease. It works by reference count (retain count) and it is not freed (dealloc) even though receive release message, if it's reference count (retain count) is not be 0. 

And property is also not familiar to me. i think is is similar with get {} / set {} in C#. it can reduce some boring code, and can be used by dot syntax. so convenient. 

Anyway, Here is my assignment 2-A

#import <Cocoa/Cocoa.h>



@interface PolygonShape : NSObject {

int numberOfSides;

int minimumNumberOfSides;

int maximumNumberOfSides;

float angleInDegrees;

float angleInRadians;

NSString* name;

}


- (void) dealloc;

- (id)init;

- (id)initWithNumberOfSides: (int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max; 

- (void) description;


@property (readwrite) int numberOfSides;

@property (readwrite) int minimumNumberOfSides;

@property (readwrite) int maximumNumberOfSides;

@property (readonly) float angleInDegrees;

@property (readonly) float angleInRadians;

@property (readonly) NSString* name;

@end



#import "PolygonShape.h"


@implementation PolygonShape


@synthesize numberOfSides;

@synthesize minimumNumberOfSides;

@synthesize maximumNumberOfSides;


- (void)dealloc

{

NSLog(@"dealloc is called. This Polygon ivar is destroyed");

[super dealloc];

}


- (void) setNumberOfSides: (int) value

{

if (value < minimumNumberOfSides)

{

NSLog(@"Invalid number of sides: %d is less than the maximum of %d allowed", value, minimumNumberOfSides);

}

else if (value > maximumNumberOfSides)

{

NSLog(@"Invalid number of sides: %d is greater than the maximum of %d allowed", value, maximumNumberOfSides);

}

else

{

numberOfSides = value;

}

}


- (void) setMinimumNumberOfSides: (int) value

{

if (value > 2)

{

minimumNumberOfSides = value;

}

else

{

NSLog(@"Invalid minimum number of sides: %d is less than the minimum of 2 allowed", value);

}

}


- (void) setMaximumNumberOfSides: (int) value

{

if (value <= 12)

{

maximumNumberOfSides = value;

}

else

{

NSLog(@"Invalid maximum number of sides: %d is greater than the maximum of 12 allowed", value);

}

}


- (id)init

{

[self initWithNumberOfSides:5 minimumNumberOfSides:3 maximumNumberOfSides:10];

return self;

}


- (id)initWithNumberOfSides: (int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max

{

[super init];

self.minimumNumberOfSides = min;

self.maximumNumberOfSides = max;

self.numberOfSides = sides;

return self;

}


- (float)angleInDegrees

{

return (180 * (numberOfSides - 2) / numberOfSides);

}


- (float)angleInRadians

{

return self.angleInDegrees * 2 * 3.14 / 360;

}


- (NSString*)name

{

NSMutableString* nameOfPolygon = [NSMutableString string];

switch (numberOfSides)

{

case 3 : nameOfPolygon = @"triangle"; break;

case 4 : nameOfPolygon = @"square"; break;

case 5 : nameOfPolygon = @"pentagon"; break;

case 6 : nameOfPolygon = @"hexagon"; break;

case 7 : nameOfPolygon = @"heptagon"; break;

case 8 : nameOfPolygon = @"octagon"; break;

case 9 : nameOfPolygon = @"enneagon"; break;

case 10 : nameOfPolygon = @"decagon"; break;

case 11 : nameOfPolygon = @"hendecagon"; break;

case 12 : nameOfPolygon = @"dodecagon"; break;

default : nameOfPolygon = @"";

}

return nameOfPolygon;

}


- (void)description

{

NSLog(@"Hello, I'm a %d-sided polygon (aka a %@) with angles of %f degrees (%f radians)", numberOfSides, self.name, self.angleInDegrees, self.angleInRadians);

}

@end



저작자 표시 비영리 동일 조건 변경 허락
Posted by yunseong
I skipped first chapter, because it is just brief about iPhone programming (cocoa framework), and there are not much stuff to think. I can finish first assignment just followed given guide. Anyone can do it ;-)

Actually i already study about objective-c a few months back. but i cannot study with concentration, so i almost forgot everything. This class  reminds me, and i can remember what i studied ago.  And, i can use some unfamiliar class like NSEnumerator, NSURL, NSProcessInfo, so on. 

Here is assgnment 1-B.  Because these are my private, there is no comment ;-)

void PrintPathInfo()

{

NSString *path = @"~";

path = [path stringByExpandingTildeInPath];

NSLog(@"My home folder is %@", path);

NSArray *pathCompArray = [path pathComponents];

NSEnumerator *foreachEnum = [pathCompArray objectEnumerator];

NSString* item;

while (item = [foreachEnum nextObject])

{

NSLog(@"%@\n", item);

}

}


void PrintProcessInfo()

{

NSString *processName = [[NSProcessInfo processInfo] processName];

int processId = [[NSProcessInfo processInfo] processIdentifier];

NSString* outputStr = [NSString stringWithFormat: @"Process Name : %@, Process ID : '%d'",

  processName, processId];

NSLog(outputStr);

}


void PrintBookmarkInfo()

{

NSArray *keyArray = [NSArray arrayWithObjects: @"Stanford University"

@"Apple"

@"CS193P",

@"Stanford on iTunes U",

@"Stanford Mall", nil];

NSArray *strValueArray = [NSArray arrayWithObjects: @"http://www.stanford.edu",

  @"http://www.apple.com",

  @"http://cs193p.stanford.edu",

  @"http://itunes.stanford.edu",

  @"stanfordshop.com", nil];

NSMutableDictionary *bookMark = [NSMutableDictionary dictionaryWithCapacity: 5];

// c-style iteration

for (int nIdx = 0; nIdx < [keyArray count]; nIdx++)

{

[bookMark setValue: [NSURL URLWithString: [strValueArray objectAtIndex: nIdx]] forKey: [keyArray objectAtIndex: nIdx]]; 

}

NSEnumerator *keyEnum = [bookMark keyEnumerator];

NSString* key;

// Iteration with enumerator

while (key = [keyEnum nextObject])

{

NSURL *url = [bookMark objectForKey: key];

NSLog(@"Key : '%@' URL : '%@'\n", key, [url relativeString]);

}

}


void PrintIntrospectionInfo()

{

NSMutableArray *anyObjArray = [NSMutableArray arrayWithCapacity: 5];

NSString *string = [NSString stringWithFormat: @"Hello, Mac!!!!"];

NSURL *url = [NSURL URLWithString: @"http://www.apple.com"];

NSProcessInfo *processInfo = [NSProcessInfo processInfo];

NSDictionary *dic = [NSDictionary dictionary];

[anyObjArray addObject: string];

[anyObjArray addObject: url];

[anyObjArray addObject: processInfo];

[anyObjArray addObject: dic];

NSEnumerator *objEnum = [anyObjArray objectEnumerator];

NSObject *obj;

while (obj = [objEnum nextObject])

{

NSLog(@"Class Name : %@\n", [obj className]);

NSLog(@"Is member of NSString : %@", [obj isMemberOfClass: [NSString class]] ? @"YES" : @"NO");

NSLog(@"Is kind of NSString : %@", [obj isKindOfClass: [NSString class]] ? @"YES" : @"NO");

SEL sel = @selector(lowercaseString);

if ([obj respondsToSelector: sel] == YES)

{

NSLog(@"lowercaseString is '%@'", [obj performSelector: sel]);

}

else

{

NSLog(@"Responds to lowercaseString : NO");

}

NSLog(@"====================================");

}

[anyObjArray removeAllObjects];

[anyObjArray release];

}




저작자 표시 비영리 동일 조건 변경 허락
Posted by yunseong
This section is about studying "iPhone application Programming" class which is established at Stanford University online class in iTunes U. I think this stuff is so good to study not only iPhone programming but also english. My english is not so good, so i always worry about it. This will be able to help me. Of course, i cannot understand what they say yet, but it becomes better. 

Actually, I already watch lesson 1 ~ 3, and i already finish assignments 2-1 from first one. I cannot make sure that my codes are all right, but i'll publish these code even though my codes can be wrong. 
 I hope, i can finish this class, not to be tedious. ;-). I think studying iphone programming is not press me. sometimes studying things can be burden. but i think i am really able to enjoy this ;-). it is the reason that i decide to study iPhone programming. 
저작자 표시 비영리 동일 조건 변경 허락
Posted by yunseong
막상 글을 쓰려니 내용에 대한 확신이 없어서 쉽게 써지질 않네요 -_-;; 틀린 내용을 유포했다가 잡혀가는건 아닌지 -_-;;
원래 블로깅을 하면서의 목적 중 하나가 공부한 내용을 남기는 것이었는데, 혼자 책보고 공부하는 내용을 올리는 것이라 그닥 확신이 없네요. 
사실 어느분이 '이건 틀려요, 이게 맞지 않나요?' 라고 말을 해주시면 저도 더 안목이 넓어지고 좋겠지만, 아쉽게도 이 블로그는 그리 방문객이 많은 편이 아니라 그런 토론할 기회조차 없네요. 이 블로그의 내용은 개인이 공부해서 올리는 내용이기 때문에, 틀린 내용이 있을 수 있음을 미리 감안하고 보시는게 좋을 것 같습니다. 

저번 포스팅에서 '수학적인' orthogonal array를 만들어 보았습니다. 그런데 'Software testing'에서 OA를 사용하는 이유 중 하나는 coverage의 희생을 최소화 하면서 test case의 수를 효율적으로 줄이기 위해서 입니다. 어떻게 줄일 수 있을까요?
물론 parameter의 모든 조합의 경우의 수를 다 테스트하는 것 (Exhaustive testing) 이 coverage가 더 높긴 합니다만, software의 특성상(?) 모든 parameter의 조합과 2개의 (pair) parameter의 조합에 의한 coverage가 큰 차이가 없다는 것을 전제로 합니다. 정말 그래? 라고 말할 수도 있지만, 많은 자료에서 실제로 그런 결과가 나온다고 하네요. 

어쨌든, OA를 이용한 test case의 최적화를 알아보겠습니다. Exhaustive testing에서는  k개의 parameter가 있고, 각 parameter가 v개의 값을 가지고 있다면, v의 k승 만큼의 tuple (test case)을 가지게 됩니다. 그러나 OA를 이용한다면 v의 제곱 만큼의 tuple을 가지게 됩니다. k는 갯수에 영향을 미치지 않습니다. 직접 만들어 보죠 ^^;

5개의 parameter가 있고 (k = 5), 각 parameter는 3개의 값 (v = 3)을 가지고 있는 경우의 test case최적화를 해보겠습니다. 


위와 같이 있다면, Exhaustive testing의 경우에는 3 x 3 x 3 x 3 x 3 = 243개의 조합이 있어야 합니다. 

OA를 작성할 때, k개의 parameter가 있다면, k - 2개의 Orthogonal Latin Square가 있어야 합니다. (Latin Square는 지난번 포스팅을 참조하세요)


위와 같이 3개의 Orthogonal Latin Square를 만들었습니다. 그리고 위의 3개의 orthogonal latin square를 합치겠습니다 (Superimposing)


근데 왜 k개의 parameter의 조합을 할 때, k-2개의 Latin Square가 필요할까요? 2개의 pair orthogonal 조합은 쉽게 만들어 낼 수 있기 때문입니다. 그건 바로 table의 row, column의 index입니다. table의 row, column을 조합에 포함시켜 위의 table을 array로 표현하면


아래 테이블이 완성된 OA를 이용한 Pair-wise 조합입니다. Result의 5개의 숫자 조합은 각 Parameter내 값이 index를 나타냅니다. (오른쪽에 다 표현해놨습니다 ^^)


위의 표를 살펴보면, 2개의 Parameter를 선택해서 (2개의 Column) 조합을 살펴보면, 2개의 column단위로는 모든 조합을 이루고 있음을 알 수 있습니다. 예를 들면 Param3, Param4의 조합을 보면

{(G,J), (G, K), (G, L), (H, K), (H, L), (H, J), (I, L), (I, J), (I, K)} 

을 모두 가지고 있음을 알 수 있습니다. 즉, 만약에 이렇게 2개의 parameter의 조합으로도 Exhaustive testing와 비슷한 coverage를 이룰 수 있다면, testing의 효율이 엄청나게 올라가겠죠 (243개 --> 9개, 약 97%의 resource 절약).

다음 포스팅때에는 Pair-wise를 만드는 또 다른 방법인 IPO (In Parameter Order)를 알아보도록 하겠습니다 ^^

'Software Testing > Knowledge Base' 카테고리의 다른 글

Combinational Analysis #3  (3) 2009/03/05
Combinational Analysis #2  (2) 2009/03/01
Combinational Analysis #1  (0) 2009/02/05
결함 정보는 Test case로 관리해라!!  (0) 2009/01/02
Issue Tracker (Bug Tracker)적용의 어려움  (0) 2009/01/02
Posted by yunseong
어느새 마지막 포스팅에서 한달 가까이 지났군요. 지난 마지막 포스팅때, Orthogonal Array (직교 배열) 에 대해서 알아보다가
멈췄네요 ㅎㅎ

저는 개인적으로는 수학을 잘 하지 못해서 그런지, 직교 배열은 관련 자료를 찾기도 쉽지가 않더군요. 사실 지난 한 달동안 직교 배열에 대해서 많이 찾아봤는데요, 워낙 여기저기 찾아보고 정리를 잘 못해서 출처도 딱히 적기가 어렵네요 -_-;; 어쨌든 근 한 달만의 포스팅이 허접하지 않게 적어보겠습니다 ^^;

직교 배열의 개론(?) 부터 말씀 드리면.
직교 배열은 Latin Square라는 수학적 행렬을 기반으로 합니다. Latin Square란, 정사각형 (row와 column의 갯수가 같은) 행렬 중, 특정 row나 column에 중복된 요소가 존재하지 않으면서 모든 요소가 한번씩 나타나는 행렬을 말합니다. 그림으로 설명하는 게 낫겠죠 ^^; 요소가 3인 (n=3) Latin Square는 아래와 같이 2개를 예로 들 수 있습니다.



위와 같은 모양을 하게 됩니다. M1, M2 두 행렬의 어느 row 혹은 column에도 요소가 중복되지 않습니다.

그럼 이제 위의 두 행렬을 합쳐보겠습니다. M1과 M2의 각 행과 열에 매치되는 요소들을 합합니다. 그러면


처럼 되겠죠. 이 행렬 L의 특징은, 행렬 내의 어떤 요소도 중복된 짝(pair)이 없다는 것입니다. 이런 경우를 우리는
두 행렬이 '직교한다', 'Mutual Orthogonal Latin Square(MOLS)'라고 합니다.
 2개의 배열을 합쳤고, 어떤 요소도 중복되지 않았다는 것은? 그렇죠,  pair-wise입니다. 단 여기서의 pair-wise는 커버리지를 
만족하는 최소의 pair-wise는 아닙니다. 단순히 수학적인 pair-wise (서로소) 입니다. 

요소가 3개인 Latin Square는 실제로 위의 2개 보다 더 많습니다. 정확히 계산하는 법은 모르곘으나, 얼추 해봐도 3개는 넘는군요.
그렇지만, Orthogonal하며, 요소가 3개인 Latin Square는 위의 행렬조합밖에 없습니다. 

그 이유는... (사실 여기부터는 찾아본 자료에 이러이러 하다고 하니까 그런 줄 알고 있는 내용입니다. 수학적으로 증명할 줄 모릅니다 -_-;;;)

수학적으로 orthogonal한 행렬은 요소가 n개 (단 여기서 n은 소수 (prime number) 혹은 소수의 제곱값 이어야 함) 일 때 
MOLS(n) = n - 1을 만족한다고 합니다. 즉 요소가 3이기 때문에 MOLS인 Latin Square는 3 - 1개 인 것입니다. 

자, 다음은 요소 갯수가 더 많은 latin square를 만드는 법을 알아보겠습니다. (사실 이거 찾는데 시간이 엄청 오래 걸렸습니다. 다 tool돌리면 나온다고 그런 설명만 있어서... 근데 또 알고 보니 별거 아니라는 -_-_

요소가 5개인 orthogonal array를 만들어보겠습니다. 


쉽죠? -_-;; 딱 보시면 규칙을 아실껍니다. 값이 1인 요소를 기준으로 보면, 1의 row내 index가 row가 내려갈수록 0 --> 4 --> 3--> 2--> 1로 바뀌는 것을 알 수 있습니다. 2, 3, 4, 5 모두 마찬가지 입니다. 

다음 행렬 보시겠습니다. 

이번에도 값이 1인 요소를 기준으로 살펴보면, 0 --> 3 --> 1 --> 4 --> 2 이렇게 2씩 줄어드는 것을 알 수 있습니다. (index 값이 0보다 작아지면 반대쪽 끝으로 간다고 (look around) 생각하세요)
아까는 1씩 줄어들고, 이번엔 2씩 줄어듭니다. 3번째는? 4번째는? 3씩, 4씩 줄이면 될 듯 합니다. 

역시 됩니다. 이 행렬 중 2개를 선택해서 합쳐보면, 그 조합된 값은 모두 pair-wise하게 됩니다. 

참고로, 5 역시 소수이기에 위의 방법이 가능합니다. 8이나 10개의 요소를 가진 행렬을 위의 방법으로 만들어보시면
Latin Square조차 성립할 수 없다는 것을 알게 되실겁니다. (한 column에 중복된 값이 나오게 됩니다). 다른 방법을 통해 Orthogonal array를 찾으셔야 합니다.
또 덧붙이면, 2보다 큰 요소를 갖는다면 모두 MOLS를 만들 수 있으나, '6'은 예외입니다. 6개의 요소를 가진 MOLS는 만들 수 없다는군요. 이는 Eulean Number와 연관이 있다고는 하나 제가 그거에 대해 아는 바가 없습니다. -_-;;

어쨌든 orthogonal Array의 개념은 이 정도로 정리하겠습니다. 다음 포스트는 이 orthogonal array를 어떻게 테스트 케이스에 적용하는 가를 적어보겠습니다. (이번엔 한 달씩이나 걸리진 않아요 ㅎㅎ)

참조 목록
- Foundation of Software Testing:: Chapter 4. Test Generation. Aditya P.Mathur. Purdue University.
- A Practical Strategy for Testing Pair-wise Coverage of Network Interfaces. Allan W.Williams et. al
- An Evaluation of Combination Strategies for Test Case Selection. Mats Grindal et.al

'Software Testing > Knowledge Base' 카테고리의 다른 글

Combinational Analysis #3  (3) 2009/03/05
Combinational Analysis #2  (2) 2009/03/01
Combinational Analysis #1  (0) 2009/02/05
결함 정보는 Test case로 관리해라!!  (0) 2009/01/02
Issue Tracker (Bug Tracker)적용의 어려움  (0) 2009/01/02
Posted by yunseong
본 글은 Microsoft Press의 How to Test Software at Microsoft와  'An Evaluation of Combination Strategies for Test Case Selection' (Mats Grindal et al) paper를 참조했음을 미리 밝힙니다.



어떤 한 Test case의 parameter가 여러개 일 때, 이들을 어떻게 조합시킬 수 있을까요? 일반적으로 2가지 방법이 있습니다. 

첫째는 Random 혹은 ad-hoc 방식으로 조합하는 것입니다. 이 것은 tester의 능력과 경험에 따라 다른 결과가 나올 수 있으며 운에 따라 결과가 영향을 받을 수도 있습니다. 이 부분은 논외로 하겠습니다 ^^;

두번쨰는 좀더 제어를 가능하게 하여 시스템적인 접근을 하는 것입니다. 이러한 방법 중에는 EC (Each Choice), BC (Base Choice), OA (Orthogonal Array), 그리고 Exhaustive Test 등이 있습니다. EC부터 살펴보겠습니다. 

EC는 가장 단순한 Test case combination technique입니다. 1-wise test로 볼 수도 있습니다. 예를 들어 설명하는 것이 가장 이해가 빠를 것 같네요 

  1. p1 = {v1, v2, v3}
  2. p2 = {v4, v5, v6}
  3. p3 = {v7, v8}

위와 같이 각각의 parameter는 다른 값과 다른 갯수를 가지고 있다고 가정합니다. 물론 각각의 parameter는 다른 parameter에 대해 독립적입니다. (영향을 받지 않습니다. 영향을 받는 다면 그것은 하나의 parameter로 묶어야 합니다). 

tc(n) = f(p1, p2, p3)라 표현한다고 가정하면, EC의 경우에는 다음과 같이 조합될 수 있습니다.
  1. tc(0) = f(v1, v4, v7)
  2. tc(1) = f(v2, v5, v8)
  3. tc(2) = f(v3, v6, v7)

위와 같이 조합할 수 있습니다. 위의 parameter를 분석해보면, p1이 가질 수 있는 3개의 값을 모두 한번 씩 이용했고 (coverage를 확보했고), p2, p3역시 모두 마찬가지 입니다. 단, tc(2)를 보면 이미 위에 나와있던 v7이 다시 나왔습니다. 이는 p3가 갖는 value의 갯수가 하나 적으므로, 중복되게 들어간 것입니다. 위의 값을 보면 알 수 있듯이, 모든 값이 각각 한번씩 선택되었습니다. (Each Choice). EC의 경우 test case의 갯수는 가장 많은 value를 가진 parameter의 value 갯수가 됩니다. 

2번째로 BC (Base Choice)를 알아보겠습니다. BC역시 1-wise test이지만, BC의 coverage는 n-wise test에 뒤지지 않는다는 연구결과가 있다고 합니다. 어쨌든 한번 조합을 만들어보겠습니다. 
BC의 Key point는 'Base Case'가 있어야 한다는 것입니다. 이 base case는 사용자의 관점에서 가장 선택될 빈도가 높고, 단순하며, 일반적으로는 정상동작할 수 있는 것을 선택하는 것이 좋습니다. (Most common, Most normal)

Assume that base case is [v1, v4, v7] 

위처럼 가정하면, 다음과 같은 parameter의 조합이 나오게 됩니다.
  1. tc(0) = f(v1, v4, v7)
  2. tc(1) = f(v2, v4, v7)
  3. tc(2) = f(v3, v4, v7)
  4. tc(3) = f(v1, v5, v7)
  5. tc(4) = f(v1, v6, v7)
  6. tc(5) = f(v1, v4, v8)

위에 주황색으로 표시한 부분을 제외하면 모두 base case의 값을 유지하고 있습니다. 즉, base case에서 하나의 parameter에만 변경을 주어 해당 variation에 대한 동작의 추이를 볼 수 있는 조합법 입니다.  BC의 coverage를 모두 만족하는 test case의 최소 갯수는 1 + (각 parameter의 value 갯수 - 1)입니다.  즉, 위의 예를 들면, 1 + (3 - 1) + (3 - 1) + (2 - 1) = 6 입니다. (사실 ∑를 써서 표현해야 하는데, 잘 못쓰겠네요 -_-;;)

다음은 OA (Orthogonal Array, 직교배열) 입니다. 이 것은 다음 post에....

'Software Testing > Knowledge Base' 카테고리의 다른 글

Combinational Analysis #3  (3) 2009/03/05
Combinational Analysis #2  (2) 2009/03/01
Combinational Analysis #1  (0) 2009/02/05
결함 정보는 Test case로 관리해라!!  (0) 2009/01/02
Issue Tracker (Bug Tracker)적용의 어려움  (0) 2009/01/02
Posted by yunseong
About me2009/01/31 00:00
어느새 2009년의 1월이 끝나갑니다.

한달쯤 전에 (잊지 않아요 12월 30일) 퇴근버스에서 회사 선배님께 이런 저런 이야기를 들었습니다.

한 30분쯤 이야기를 듣고, 지난 2년을 반성했습니다.

선배는 그저 자신의 이야기를 해주었지만, 저에게는 왜 너는 그렇게 살고 있냐라고 꾸짖는 듯 했습니다.

왜이렇게 아무생각 없이 살았나, 이것밖에 안되는 것이었나 하는 생각에

가슴이 터져버리는줄 알았습니다.

나는 주변에 불만에 가득차있으면서 정작 스스로에게는 한없이 관대하고, 현실에 만족해버린

오만하고 불손한 사람이 되어있었습니다.

그런 자신에 대한 후회와 실망과 함께, 또 기쁨이 가득 찼습니다.

여태까지 아무 노력도 하지 않았지만, 이젠 의지와 목표라는 것이 생겼습니다.

목표한 바를 이루기 위해서는 정말 많은 노력이 필요할 것 같습니다.


그렇게 한달이 지났습니다.

이 전과 다른 생각과 조금 더 강한 의지를 가지게 되었다는 것에

스스로를 대견스럽게 생각하게 하기도 하지만...

아직 멀었습니다.

갈 길은 너무나도 멉니다. 목표에 대해 알면 알수록 더 자신이 없어집니다.

또, 저의 짧고 부족한 능력에 실망도 많이 합니다.

그래도 이젠 어쩔 수 없습니다. 아무리 늦은 걸음으로 가더라도 가지 않으면 견딜 수 없을 것 같습니다.


선택한 길과 방법이 맞는 건지에 대한 확신은 없습니다.

그렇지만 여태까지 확신을 가지고 선택한 길은 없었습니다. 그럴 능력이 저에겐 없습니다.

대신, 어떤 길이든 선택한 길을 최선을 다해서 가다보면 좋은 결과가 있을 것이라고 믿습니다.


2009년 한달이 지난 지금, 한 달전의 의지를 다시 가슴에 되새기기 위해, 한 달 늦은 다짐을 블로그에 적습니다.


2009년 1월 30일 23시 59분

'About me' 카테고리의 다른 글

1달 늦은 2009년 다짐  (1) 2009/01/31
Season 2 START!!  (0) 2007/03/05
Posted by yunseong
아래 포스팅한 글에서 Risk based Testing에 대해서 잠시 언급했었습니다. 
책을 읽다 보니 이 부분에 대한 어느정도 자세한 언급이 나오더군요. Risk based testing에서 가장 중요한 risk를 측정하는 방법에 대한 설명이 있었습니다.
아래 적은 내용 중 일부 내용은 wikipedia에서 참고한 내용도 있습니다.

FMEA는 시스템에서 발생할 수 있는 잠재적인 실패 (Failure Mode)를 분석하여 도출하고, 이에 대한 위험도를 정량화하는 분석작업 중 하나입니다. FMEA는 최종적으로  정량화된 RPN (Risk Priority Number)를 산출하게 됩니다. 

RPN은 높은게 risky하다 혹은 낮은게 risky하다라는 정의는 없습니다. 측정하는 주최가 정하면 됩니다. 즉, 1점이 가장 risky할 수도 있고 만점이 가장 risky할 수도 있습니다. (wikipedia의 점수매김과 제 책의 점수매김이 반대더군요 ^^;)

이 RPN을 결정하는 요소는 다음과 같습니다 (이 부분은 책과 wikipedia에서 말하는 내용이 약간 다릅니다만, 어느정도 일치합니다)
  • Severity - 말그대로 심각도입니다. 이 failure가 발생했을 때, 사용자가 당하게(?) 되는 impact에 따라 분류합니다.
    ex) 1 - Critical, 2 - Major, 3 - Average, 4 - Minor, 5 - Enhancement. (어디서 많이 보던 것이지요 ^^)
  • Priority - Bug의 fix 우선순위 입니다. '반드시 ASAP로 수정해야 함'에서 부터, '다음번 release에 수정해도 됨' 정도로 분류합니다.
    ex) 1 - Urgent, 2 - Essential, 3 - Valuable, 4 - Desirable, 5 - Discretionary
  • Likelihood - 발생 확률입니다. '모든 사용자, 연산시 항상 발생함' 에서 '거의 발생하지 않음' 까지 단계 정도로 분류합니다.
    ex) 1 - Very Likely, 2 - Likely, 3 - Possible, 4 - Unlikely, 5 - Very Unlikely

RPN은 위의 각 요소의 점수를 곱해서 계산합니다. 만약 각 요소가 5단계까지 있다면 RPN은  1점에서 5 x 5 x 5 = 125점의 범위를 갖게 됩니다. 이 때 점수가 낮은 것을 risky하다고 한다면,  1점 (Severity - Critical, Priority - Urgent, Likelihood - Very Likely) 이 가장 risky한 failure mode가 되어 집중적으로 test해야 할 대상이 되는 것입니다. 

이 산출된 RPN의 점수 대역을 분류하여, 얼마나 집중적으로 이 failure mode에 대해서 테스트 할지를 전략적으로 정하게 됩니다. 
예를 들어 RPN 1 ~ 15점까지에 testing resource의 몇 %를 할당함, 머 이런 식으로 하게 됩니다.

이렇게 Risk based Testing에서 risk를 정량화 하는 기법은 FMEA말고도 COE (Cost Of Exposure), ANSI/ISO 9126 등이 있습니다. 참고하세요 ;-)
Posted by yunseong
요새 읽고 있는 Critical Testing Process란 책의 일부를 발췌하여 생각을 적은 글입니다.

이 책에서는 Quality Risk Analysis Process란 과정을 제시했습니다. 
총 6단계로 나누었으며, 내용은 다음과 같습니다. 

  1. 핵심 테스팅 포인트와 품질에 대한 이해관계자를 선별합니다. 이 이해관계자는 품질분석활동에 참여해야 합니다. 
  2. 핵심관계자들과 품질분석활동의 기술과 방법에 대해 조사합니다. 조사가 충분히 되면, 기술을 제시하고, 일치를 이끌어냅니다.
  3. 품질위험에 대해 아이디어를 모으고, 그 위험에 따라 실패했을 때의 상황, 품질의 손상, 그리고 그러한 위험들의 우선순위에 대해 논의합니다.
  4. 분석단계에서 발생했던 놓친 요구사항, 설계문제 등등 다른 문서에서 발생한 초기 버그에 대해 보고합니다.
  5. 기술적으로 도출된 품질위험에 대해 문서화 하고, 이해관계자들에게 그 문서를 배포합니다. 3,4,5 단계를 반복적으로 수행합니다.
  6. 품질위험분석 문서를 프로젝트 문서로 추가하고 변경관리를 합니다. 

대략 위와 같은 내용입니다. 

왜 이런 품질 분석활동을 하는 것일까요? 사실 위의 내용이 나온 chapter 에 잘 설명되어 있습니다. -_-;;, 아니 사실 이 책의 제목을 보면 이미 알 수도 있겠네요. 

"Critical"한 Testing을 하기 위해서 입니다. 중요하고 risk가 큰 부분에 "집중" 하고 많은 resource를 투입하여 Quality의 risk를 낮추자 (mitigate) 라는 것입니다. 결국 "risk 기반 testing"으로 귀결되겠군요. 

"risk기반 testing"에서 risk를 어떻게 측정해야 할까요? 위험도의 기준은 무엇일까요? 흔히 S/W의 목적에 따라 다르다고 합니다. 
당연히 그렇겠죠. 그런 뜬구릅 잡는 대답은 말고 (퍽)

Quality의 위험도를 결정하는 중요한 지표는 빈도가 있을 수 있을 것 같네요. 또... 복구 가능 여부 혹은 대체 가능 여부가 있을 듯 하구요. (지극히 제 개인적인 생각입니다. 이견이나 덧붙이고 싶으신 분은 대환영입니다 ^^)
아, 얼마전에 세미나가서 들은 내용인데 (권원일 님이 발표하신 내용입니다) Business risk와 Technical risk(잘 기억 안남 -_-)로 나눌 수 있다고 하셨었던게 기억이 나네요. 

어찌되었든 이 Quality Risk Analysis Process라는 것은 결국 Risk based testing을 잘 하기 위한 단계로 보이는 군요. 실제 업무에적용가능하다면 적용해보고 그 결과를 이 posting에 덧붙여보아야 겠습니다 ㅋ
Posted by yunseong
Software testing의 대가 Rex Black의 Critical Testing Processes라는 책을 올 1월부터 보고 있습니다.

근데 너무 어렵습니다.  매 문장마다 모르는 단어는 수두룩 하고, 

원래 주어 / 동사 이런 문법 따져가며 읽는 편은 아닌데, 이건 머 도통 이해가 안가는 문장이 한둘이 아니네요 ㅠㅠ

그래도 요약을 굳이 하자면, 1장의 Title은 큰 그림 먼저 보기 입니다.

Test 팀의 프로젝트 전체에서의 위치, 임무, 태도, 팀 내부 관리의 중점, mind 머 그런 내용에 대해 설명하고 있습니다. 

뒤를 쭈욱 훑어봤는데 답답하네요 -_-;;

인내력이 다하면 잠시 이 책을 덮고 다른 책을 봐야 할지도 모르겠습니다. 

벌써 "Metrics and Model in Software Quality Engineering"도 쉬고 있는데... 그 책은 영어도 영어지만

통계 머 이런 내용 (6 sigma, 등등) 이 많다 보니 도통 이해가 안가더군요...

쉬운게 없습니다 ㅠㅠ


I've read the "Critical Testing Process" written by Rex Black, who is most famous in software testing. 
But... it goes over my head!!! I know my english is poor...  but it is too difficult. 
There are so many delicate words in a sentence. 
Actually, i'm not acquainted with strict grammar like which is subject, and verb, but, some sentences are too complicated to me. 
But, positively, to say summary, the title of first chapter is "Start with Big Picture". 
It explains test team's context, task, attitude, management internal team member (testing team). 
i go over beyond this chapter, it make me feel heavy. 
If my patient is gone, i may replace to another book (i already bought a new book named "Host we test software at microsoft" ).
Already i gave up to read "Metric and Models in software Quality Engineering". ;-(. i'm not acquainted with statistics, but it deals with it, like 6 sigma, probability distribution... 

There is nothing to get easily.. T.T


Posted by yunseong