22
Logic Coverage Yongho Ryu December 18, 2014 - Coverage Criteria for Logical Expressions. Paul Ammann, Jeff Offutt and Hong Huang 데이터베이스에서 유사 검색(Similarity search)인공지능에서 지식표현 (Knowledge representation)공부하고 있어서, 이번 소프트웨어 테스팅 발표 주제를 이와 관련 있는 Logic Coverage잡아 보았습니다 . , 그럼 시작해볼까요 ?

20141218화 software testing. logic coverage (yongho ryu) 보고서

Embed Size (px)

Citation preview

Logic Coverage

Yongho Ryu

December 18, 2014

- Coverage Criteria for Logical Expressions. Paul Ammann, Jeff Offutt and Hong Huang

데이터베이스에서 유사 검색(Similarity search)와 인공지능에서 지식표현(Knowledge representation)을 공부하고 있어서, 이번 소프트웨어 테스팅 발표 주제를 이와 관련 있는 Logic Coverage로 잡아 보았습니다 . 자, 그럼 시작해볼까요?

Goal

if (s > t) && (C || (x < y))o.m();

elseo.n();

먼저, 이 주제의 목표입니다 . 이 코드를 보시면 if-else문이 있고, if-else문의 조건에 따라서 o.m() 함수나 o.n()함수가 실행됩니다 . 코드 전체가 실행되어 커버리지 100%를 만족되도록 하려면 조건을 어떻게 두어야 할까요?

o.m()함수가 실행되도록 조건이 참이 되도록 맞추는 것 하나, o.n()함수가 실행되도록 조건이 거짓이 되도록 맞추는 것 하나를 할 수 있겠는데요 , 이렇게 하면 과연 커버리지는 만족될까요? 어떻게 효율적으로 커버리지는 만족되면서 보다 적은 테스트를 효율적으로 할 수 있을까요? Logic Coverage에서 다루는 것 중의 하나가 바로 이것입니다.

Terms

Predicates¬ – the negation operator

Clauses

∧ – the and operator∨ – the or operator

→ – the implication operator⊕ – the exclusive or operator

↔ – the equivalence operator

a b a ⊕ b

T T F

T F T

F T T

F F F

용어를 살펴보겠습니다 . Predicate은 참, 거짓 값을 가지는 값입니다 . 그리고, 다음과 같은 Operator들을 포함할 수 있습니다 . 이 중에서 중요한 것이 Exclusive OR입니다. 뒤에서 조건 쌍을 만들어낼 때 활용할 것입니다 . Exclusive OR은 같으면 거짓이고 서로 다르면 참입니다 .

Clause는 Predicate이지만 위와 같은 Operator를 포함하지 않는 것입니다 .

Definition (PC)Predicate Coverage (PC):

For each p ∈ P, TR contains two requirements: p evaluates to true, and p evaluates to false.

For example, P = a ∧ b

TRpc = { (a = true, b = true), (a = true, b = false) }

a b a ∧ b

T T T

T F F

Predicate Coverage는 명제가 참 또는 거짓의 값을 가지는데 , 참 또는 거짓이 모두 발생되는 것을 말합니다 . 위의 예를 보면, a는 참, b는 참일 때 a ∧ b인 P는 참이 발생되었고, 이제 거짓만 발생하면 Predicate Coverage가 만족하는데 , a가 참, b는 거짓일 때, P는 거짓이 되면서 이 커버리지를 만족합니다 .

Definition (CC)Clause Coverage (CC):

For each c ∈ C, TR contains two requirements: c evaluates totrue, and c evaluates to false.

For example, P = a ∧ b

TRcc = { (a = true, b = false), (a = false, b = true) }

a b a ∧ b

T F F

F T F

Clause coverage는 명제 P뿐만 아니라 명제를 구성하는 clause까지 참 또는 거짓이 고루 발생되는 것입니다 . 앞의 Predicate coverage의 사례에서는 비록 Predicate coverage는 만족되었지만 clause 중의 하나인 a는 참 값만 발생했지 거짓은 발생하지 않았습니다 . 그래서 a도 참, 거짓이 고루 발생되도록 위와 같이 맞추면 a와 b의 Clause coverage까지 만족하는 것입니다 . 하지만 a and b = p의 값을 보면 거짓(F)만 발생해서 Predicate Coverage는 만족하지 않고 있음을 볼 수 있습니다 .

(Goal)

if (s > t) && (C || (x < y))o.m();

elseo.n();

a ∧ (b ∨ c) = P

자, 이제 아까 목표에서 조건을 다시 한번 살펴보면 간단하게 , a ∧ (b ∨ c)로 나타낼 수 있고 이를 P로 표현하겠습니다 .

⓪ Predicate Coveragea b c p

1 T T T T

2 T T F T

3 T F T T

4 T F F F

5 F T T F

6 F T F F

7 F F T F

8 F F F F

TRpc = {(1,5), (1,6), (1,7), (1,8), (2,5), (2,6), (2,7), (2,8), (3,5), (3,6), (3,7), (3,8), (4,5), (4,6), (4,7), (4,8)}

a ∧ (b ∨ c) = (s > t) && (C || (x < y))

(1, 5) = (a = T, b = T, c = T), (a = F, b = T, c = T)

= ((s > t) = T, C = T, (x < y) = T), ((s > t) = F, b = T, (x < y) = T)

우선, Predicate coverage입니다. 이 커버리지가 만족되도록, P가 True가 되도록 하는 a, b, c값 하나와 False가 되도록 하는 a, b, c값 하나를 조합하면 됩니다.

이렇게 (1, 5)부터 (1, 6), (1, 7), … (4, 8)에 이르는 쌍 각각은 P의 Predicate coverage를 만족하는 쌍들입니다. 각 쌍을 테스트하면 Predicate coverage는 만족을 하지만 a, b, c 각각의 Clause coverage는 달성이 안 되는 문제점이 있습니다. 그래서 Pa, Pb, Pc개념을 도입하여, 다른 Coverage들을 전개해보겠습니다.

Determination

P = a ∧ (b ∨ c)

Def. Given a major clause ci in predicate p, we say that ci determines p if the minor clauses cj ∈ p, j ≠ i have values so that changing the truth value of ci changes the truth value of p

P = a ∧ (b ∨ c)Pa = Pa=true ⊕ Pa=false

Pa=true = true ∧ (b ∨ c)

Pa=false = false ∧ (b ∨ c)

먼저, determination이라는 용어를 정의할 필요가 있습니다 . 정의는 위와 같은데요 , 쉽게 예를 들어 설명하자면 , 만약에 P = a ∧ (b ∨ c) 에서 a가 major clause라면 a가 참인지, 거짓인지에 따라 P도 참 또는 거짓이 됩니다. 이 때의 a를 Pa로 나타내고 , 이런 major clause인 a는 아래의 식을 통해 만들 수 있습니다 .

Pa = Pa=true ⊕ Pa=false (Pa=true는 P = a ∧ (b ∨ c)에서 a 대신에 true 값을 넣은 값, true ∧ (b ∨ c)를 뜻하고, Pa=false는 a 대신에 false를 넣은 값, false ∧ (b ∨ c)뜻합니다. 그래서 Pa는 이 둘 Pa=true와 Pa=false를 Exclusive OR을 한 값이 됩니다. 다음 장에서 Pa를 풀어보겠습니다 .

Formula (Pa)P = a ∧ (b ∨ c)Pa = Pa=true ⊕ Pa=false

Pa=true = true ∧ (b ∨ c)

Pa=false = false ∧ (b ∨ c)

Pa = Pa=true ⊕ Pa=false = true ∧ (b ∨ c) ⊕ false ∧ (b ∨ c)

= (b ∨ c) ⊕ false b c b ∨ c false (b ∨ c) ⊕false

T T T F T

T F T F T

F T T F T

F F F F F

= b ∨ c

Pa를 계산하면 Pa =b ∨ c가 도출됩니다 .

Formula (Pb)P = a ∧ (b ∨ c)Pb = Pb=true ⊕ Pb=false

Pb=true = a ∧ (true ∨ c)

Pb=false = a ∧ (false ∨ c)

Pb = Pb=true ⊕ Pb=false = a ∧ (true ∨ c) ⊕ a ∧ (false ∨ c)

= a ∧ true ⊕ a ∧ c a c a ∧c a ∧~c a ⊕ a ∧c

T T T F F

T F F T T

F T F F F

F F F F F

= a ⊕ a ∧ c

= a ∧ ~c

Pb를 계산하면 Pb =a ∧ ~c 가 도출됩니다 .

Formula (Pc)P = a ∧ (b ∨ c)Pc = Pc=true ⊕ Pc=false

Pc=true = a ∧ (b ∨ true)

Pc=false = a ∧ (b ∨ false)

Pc = Pc=true ⊕ Pc=false = a ∧ (b ∨ true) ⊕ a ∧ (b ∨ false)

= a ∧ true ⊕ a ∧ b a b a ∧ b a ∧~b a ⊕ a ∧b

T T T F F

T F F T T

F T F F F

F F F F F

= a ⊕ a ∧ b

= a ∧ ~b

Pc를 계산하면 Pc =a ∧ ~b 가 도출됩니다 .

Formula (Pa, Pb, Pc)

Pa = b ∨ c (= Pa=true ⊕ Pa=false)

Pb = a ∧ ~c (= Pb=true ⊕ Pb=false)

Pc = a ∧ ~b (= Pc=true ⊕ Pc=false)

정리하면 Pa, Pb, Pc는 다음과 같습니다.

Truth table

a b c P Pa Pb Pc

1 T T T T T

2 T T F T T T

3 T F T T T T

4 T F F F T T

5 F T T F T

6 F T F F T

7 F F T F T

8 F F F F

P = a∧(b∨c), Pa = b∨c, Pb = a∧~c, Pc = a∧~b

이렇게 해서 a, b, c, P, Pa, Pb, Pc를 포함하는 진리표를 완성했습니다. 이를 기준으로 앞으로 CoC, GACC, CACC, RACC, GICC, RICC를 살펴볼 것입니다.

① Combinational Coverage (CoC)

a b c P Pa Pb Pc

1 T T T T T

2 T T F T T T

3 T F T T T T

4 T F F F T T

5 F T T F T

6 F T F F T

7 F F T F T

8 F F F F

Def. For each p ∈ P, TR has test requirements for the clause in Cp to evaluate to each possible combination of truth values.

P = a∧(b∨c), Pa = b∨c, Pb = a∧~c, Pc = a∧~b

먼저, Combinational Coverage(CoC)입니다. 모든 clause, P = a ∧ (b ∨ c)에서는 a, b, c가 나올 수 있는 진리값들의 모든 조합을 모두 다 테스트 하는 것입니다 . a가 참, 거짓, b가 참, 거짓, c가 참, 거짓으로 모든 경우의 수는 2 * 2 * 2 = 8 가지가 나옵니다. 위의 진리표에서 1번부터 8번까지를 모두 테스트 하여 커버리지를 만족시키는 것입니다.

커버리지는 100% 달성하지만 , 너무 비용이 크고 clause가 늘어나면 테스트해야할 양이 기하급수적으로 늘어나(2^n) 비현실적입니다 .

② General Active Clause Coverage (GACC)

a b c P Pa Pb Pc

1 T T T T T

2 T T F T T T

3 T F T T T T

4 T F F F T T

5 F T T F T

6 F T F F T

7 F F T F T

8 F F F F

Def. For each p ∈ P and each major clause ci ∈ Cp, choose minor clause cj, j ≠ i so that ci determines p. TR has two requirements for each ci: ci evaluates to true and ci evaluates to false. The values chosen for the minor clauses cj do not need to be the same when ci is true as when ci is false.

P = a∧(b∨c), Pa = b∨c, Pb = a∧~c, Pc = a∧~b

Major Clause Set of possible tests

a (1, 5), (1,6), (1,7), (2,5), (2,6), (2,7), (3,5), (3,6), (3,7)

b (2,4)

c (3,4)

다음으로 General Active Clause Coverage (GACC)입니다. 앞서, 언급한 Determination과 major clause, Pa, Pb, Pc 개념이 사용됩니다. Pa가 T인 행은 모두 a의 진리값에 따라서 P의 값이 결정되는 행입니다. 1, 2, 3, 5, 6, 7행을 보면 모두 a의 진리 값에 따라서 P의 값이 결정되고 그 값 또한 같습니다. 이는 Pa를 계산할 때 그렇게 되도록 Pa를 Pa=true ⊕ Pa=false로 계산을 했기 때문입니다 .

이제 major clause가 a일 때의 행 1, 2, 3, 5, 6, 7행 중에서 Predicate coverage가 만족되도록 P의 진리값이 참과 거짓이 나오도록 쌍을 구하면 위 표에서와 같이 (1,5), (1,6), (1,7), …, (3,7)이 나옵니다 . 마찬가지로 , major clause가 b일 때는 (2,4)가 나오고, major clause가 c일 때는 (3,4)가 나옵니다 .

- GACC의 맨 마지막 문장은 앞으로 전개할 CACC와 RACC와의 차이점인데 , 여기 GACC에서는 minor clause까지 반드시 같을 필요는 없습니다 .

- CACC에서는 minor clause의 진리 값은 동일할 때, major clause의 진리 값을 두 가지로 나누어 따져봅니다 . minor clause의 진리 값이 같은 상태에서 major clause가 한 값(참이라고 하자)일 때, P가 참이 되고, major clause가 반대 값(거짓이라고 하자)일 때, P는 거짓이 되어야 하는 minor clause를 찾습니다 .

- RACC에서는 제일 엄격한데 , minor clause의 진리 값이 major clause와 같아야 합니다.

일단, 다음의 CACC로 진행해보겠습니다 .

③ Correlated Active Clause Coverage (CACC)

a b c P Pa Pb Pc

1 T T T T T

2 T T F T T T

3 T F T T T T

4 T F F F T T

5 F T T F T

6 F T F F T

7 F F T F T

8 F F F F

Def. For each p ∈ P and each major clause ci ∈ Cp, choose minor clause cj, j ≠ i so that ci determines p. TR has two requirements for each ci: ci evaluates to true and ci evaluates to false. The values chosen for the minor clauses cj must cause p to be true for one value of the major clause ci and false for the other

P = a∧(b∨c), Pa = b∨c, Pb = a∧~c, Pc = a∧~b

Major Clause Set of possible tests

a (1, 5), (1,6), (1,7), (2,5), (2,6), (2,7), (3,5), (3,6), (3,7)

b (2,4)

c (3,4)

이어서 Correlated Active Clause Coverage (CACC)입니다.

major clause가 a인 경우는, 1, 2, 3, 5, 6, 7행이 해당됩니다. 자연스레 b, c가 minor clause입니다. 그 중에서 1행의 minor clause b, c의 진리값은 T, T입니다. P의 값이 T가 되었습니다. 이 때, minor clause인 b, c의 진리값은 그대로 T, T이면서 major clause인 a와, P가 반대의 진리값(여기서는 각각 F, F)이 되는 부분이 바로 쌍입니다. 5행에 해당됩니다.

이렇게 쌍을 찾으면 major clause가 a인 경우에는 (1,5) (1,6), (1,7), (2,5), (2,6), (2,7), (3,5), (3,6), (3,7)이 됩니다. major clause가 b인 경우에는 (2,4)가 되며, major clause가 c인 경우에는 (3,4)가 됩니다.

다름으로 RACC입니다.

④ Restricted Active Clause Coverage (RACC)

a b c P Pa Pb Pc

1 T T T T T

2 T T F T T T

3 T F T T T T

4 T F F F T T

5 F T T F T

6 F T F F T

7 F F T F T

8 F F F F

Def. For each p ∈ P and each major clause ci ∈ Cp, choose minor clause cj, j ≠ i so that ci determines p. TR has two requirements for each ci: ci evaluates to true and ci evaluates to false. The values chosen for the minor clauses cj must be the same when ci is true as when ci is false.

P = a∧(b∨c), Pa = b∨c, Pb = a∧~c, Pc = a∧~b

Major Clause Set of possible tests

a (1, 5), (2,6), (3,7)

b (2,4)

c (3,4)

Restricted Active Clause Coverage (RACC)입니다.

major clause가 a일 때를 살펴보면, 1, 2, 3, 5, 6, 7행이 해당되고, minor clause인 b, c가 a의 진리 값이 참과 거짓인 경우에 모두 같은 행은 (1,5), (2,6), (3,7)이 RACC를 만족하는 쌍입니다. major clause가 b일 때는 (2,4)가 해당되고, major clause가 c일 때는 (3,4)가 해당됩니다.

지금까지는 모두 P를 determine하는 major clause ci가 있는 경우 (반대 급부로 minor clause cj)인 Active Clause Coverage (ACC)를 살펴보았습니다. 이제는 이 major clause가 P를 determine하지 않는 Inactive Clause Coverage (ICC)를 살펴보도록 하겠습니다.

먼저, ACC와 ICC의 정의에 대해서 한번 짚고 넘어가도록 하겠습니다.

ACC, Inactive Clause Coverage (ICC)

Def. Active Clause Coverage (ACC): For each p ∈ P and each major clause ci ∈ Cp, choose minor clause cj, j ≠ i so that ci determines p. TR has two requirements for each ci: ci evaluates to true and ci evaluates to false.

Def. Inactive Clause Coverage (ICC): For each p ∈ P and each major clause ci ∈ Cp, choose minor clause cj, j ≠ i so that ci does not determine p. TR has four requirements for ci under these circumstances: (1) ci evaluates to true with p true, (2) ci evaluates to false with p true, (3) ci evaluates to true with p false, (4) ci evaluates to false with p false.

Active Clause Coverage (ACC)는 앞서서 GACC, CACC, RACC를 통해서 살펴봤듯이, major clause가 p를 determine하는 것입니다 . (ACC에서는 Pa, Pb, Pc의 값이 T인 행들에서 쌍을 찾았다)

이에 반해서 Inactive Clause Coverage (ICC)에서는 major clause가 P를 determine하지 않습니다 . (이제부터는 Pa, Pb, Pc의 값들이 F인 행들에서 쌍을 찾을 것이다)

★여기에서 중요한 것이, determine이라는 개념입니다 . major clause인 a가 P를 determine하는 경우가 Pa의 값이 T이고, 반대의 경우가 Pa의 값이 F입니다. 앞 부분인 ACC (GACC, CACC, RACC) 에서는 모두 Pa, Pb, Pc가 T인 행에서 쌍을 찾은 반면, 뒤의 ICC (GICC, RICC)에서는 Pa, Pb, Pc의 값이 F인 행에서 쌍을 찾습니다 .

이제 GICC와 RICC를 살펴보겠습니다 .

⑤ General Inactive Clause Coverage (GICC)

a b c P Pa Pb Pc

1 T T T T F F

2 T T F T F

3 T F T T F

4 T F F F F

5 F T T F F F

6 F T F F F F

7 F F T F F F

8 F F F F F F F

Def. For each p ∈ P and each major clause ci ∈ Cp, choose minor clause cj, j ≠ i so that ci does not determine p. TR has four requirements for ci under these circumstances: (1) ci evaluates to true with p true, (2) ci evaluates to false with p true, (3) ci evaluates to true with p false, (4) ci evaluates to false with p false. The values chosen for the minor clauses cj vary amongst the four cases.

P = a∧(b∨c), Pa = b∨c, Pb = a∧~c, Pc = a∧~b

Major Clause Set of possible tests

a No feasilbe pairs for P=T P=F: (4,8)

b P=T: (1,3) P=F: (5,7), (5,8), (6,7), (6,8)

c P=T: (1,2) P=F: (5,6), (5,8), (7,6), (7,8)

우선, General Inactive Clause Coverage (GICC)입니다.

major clause가 a일 때를 살펴보면, 4행과 8행이 Pa의 값이 F라 ICC에 해당합니다. P의 값이 참인 행은 없고, P의 값이 거짓인 행 중에서 4행과 8행의 b값이 각각 T, F로 쌍이 되는 조건을 만족합니다.

major clause가 b일 때는, Pb의 값이 F인 행은 1, 3, 5, 6, 7, 8행이 해당합니다. P의 값이 참인 행에서는 1행과 3행에서 b값이 각각 T, F로 쌍이 됩니다. P의 값이 거짓인 행에서는 서로 다른 b의 값을 갖는 행들인 (5,7), (5,8), (6,7), (6,8)이 쌍이 됩니다.

major clause가 c일 때는, Pc의 값이 F인 행은 1, 2, 5, 6, 7, 8행이 해당됩니다. 마찬가지 방법으로 하면 표와 같은 쌍이 나옵니다.

이제 마지막으로 RICC에 대해서 살펴보겠습니다.

⑥ Restricted Inactive Clause Coverage (RICC)

a b c P Pa Pb Pc

1 T T T T F F

2 T T F T F

3 T F T T F

4 T F F F F

5 F T T F F F

6 F T F F F F

7 F F T F F F

8 F F F F F F F

Def. For each p ∈ P and each major clause ci ∈ Cp, choose minor clause cj, j ≠ i so that ci does not determine p. TR has four requirements for ci under these circumstances: (1) ci evaluates to true with p true, (2) ci evaluates to false with p true, (3) ci evaluates to true with p false, (4) ci evaluates to false with p false. The values chosen for the minor clauses cj must be the same in caes (1) and (2), and the values chosen for the minor clauses cj must also be the same in caese (3) and (4)

P = a∧(b∨c)

Major Clause Set of possible tests

a No feasilbe pairs for P=T P=F: (4,8)

b P=T: (1,3) P=F: (5,7), (6,8)

c P=T: (1,2) P=F: (5,6), (7,8)

끝으로, Restricted Inactive Clause Coverage (RICC)입니다.

‘Restricted’라는 말에서 의미하는 것처럼 훨씬 제한적입니다. 앞의 조건에서 minor clause들 또한 같은 것만이 쌍으로 됩니다.

먼저, major clause가 a인 경우에, ICC가 되려면 Pa의 값은 F이어야 하고, 해당하는 행은 4, 8행입니다. P가 T일 때는 해당 행이 없고, F일 때는 4행과 8행이 있습니다. major clause인 a의 값은 서로 달라야 하고, minor clause인 b, c의 값은 서로 같아야 합니다. (4,8) 쌍이 해당합니다.

major clause가 b인 경우에는 마찬가지로 ICC가 되려면 Pb의 값은 F이어야 하고, 해당하는 행은 1, 3, 5, 6, 7, 8행입니다. P가 T일 때는 1, 3행이 해당하는데, major clause인 b의 값이 서로 다르고, minor clause인 a, c의 값은 같으므로 (1, 3)은 쌍이 됩니다. P가 F일 때는 5, 6, 7, 8행 중에서, major clause인 b의 값은 서로 다르고, minor clause인 a, c의 값은 서로 같은 행은 5, 7행, 6, 8행이 되어 (5,7), (6,8)이 쌍이 됩니다. 앞서 GICC에서 쌍이 되었던 (5,8)과 (6,7)은 minor clause인 a, c의 값이 서로 달라 조건에 맞지 않습니다.

major clause가 c인 경우에도 마찬가지로 하면 위의 표와 같이 나옵니다.

이상으로, ACC에서 GACC, CACC, RACC와 ICC에서 GICC, RICC를 살펴봤고, 다음 장에서 이들 사이의 포함 관계를 끝으로 글을 맺습니다.

Subsumption relations among logic coverageComplete Clause Coverage (CoC)

Restricted Active Clause Coverage (RACC)

Restricted Inactive Clause Coverage (RICC)

Correlated Active Clause Coverage (CACC)

General Active Clause Coverage (GACC)

Clause Coverage (CC)

Predicate Coverage (PC)

General Inactive Clause Coverage (GICC)

가장 완벽한 커버리지를 보장하는 것은 제일 상단의 Complete Clause Coverage (CoC, 앞에서는 Combinational Coverage)입니다. 하지만 앞서 살펴보았듯이 clause가 하나 더 생길 때마다 2의 제곱에 비례하여 테스트해야할 쌍이 기하급수적으로 커져서 실현하기가 어렵습니다 . 반대로 아래로 내려올수록 쌍을 찾아서 테스트하기에도 간단하지만 다른 커버리지까지 보장하지 못해서 100% 커버리지를 달성하기 힘듭니다. 그리고 ACC계열과 ICC계열의 커버리지는 서로 포함하지 않습니다 .

감사합니다 .

Thank you

한 학기 동안 지도해 주셔서 배움에 대한 재미와 즐거움을 느낍니다 . (이 마지막 보고서를 쓰면서도요 )

소중한 추억 만들어주셔서 참 감사합니다^-^