소프트웨어 동적분석에서 Logic Coverage로 분류되는
RACC(Restricted Active Clause Coverage)와 CACC(Correlated Active Clause Coverage)가 있다.
RACC와 CACC를 만족하는 test case를 쉽게 찾는 방법을 알아보자.
좀 더 정확하게는 RACC와 CACC의 차이점 구별하는 방법을 쉽게 생각해보자.
Predicates 와 Clauses
우선 기본 용어이다.
predicate(술어)는 boolean으로 평가되는 표현식(expression)을 뜻한다.
clause(절)은 logical operators( ! && || ..) 이 없는 predicate를 뜻한다.
(a < b) ∨ f (z) ∧ D ∧ (m >= n*o)
아래 예시에서 clause는 총 4개 이다.
a < b
f(z)
D
(m >= n*o)
predicate는 (a<b) V f(z) 도 될 수 있고
p = (a < b) ∨ f (z) ∧ D ∧ (m >= n*o) 라고 했을때
p도 predicate가 될 수 있다.
Predicate Coverage / Clause Coverage / Combinatorial Coverage 와 그 한계
Predicate Coverage(PC)는 전체 Predicate가 T/F인지
Clause Coverage(CC)는 전체 Predicate안의 Clause가 각각 다 T일때 / 다 F일때
Combinatorial Coverage(CoC)는 전체 Predicate 안의 Cluase가 각각 T/F 모든 경우의 수를 고려
=> PC는 CC를 CC는 PC를 커버못하고 CoC는 비용이 너무 많이 듬.
그래서 major clause와 Active 라는 개념이 나옴.
Active Clauses
어떤 'clause가 Active되었다.'라는 개념을 이해하기 위해서는 major clause 개념을 이해해야하는데,
major clause란 전체 predicate안의 하나의 clause가 변하면 전체 predicate의 T/F 값이 변하는 경우 해당 clause를 major clause라고 한다.
* Active Clauses 라는 개념이 등장한 이유
진짜로 clause의 결과와 그로인해 프로그램 전체에 끼치는 영향을 파악하고 싶으면
그 cluase가 predicate의 determining factor로 작용해야한다.
기존의 CC는 clause의 변화가 항상 전체 predicate의 변화를 이끈다는 것을 보장하지못했다.
ACC그리고 RACC와 CACC
RACC와 CACC는 결국 ACC의 다른 두가지 버전이다.
ACC는 Active Clause Coverage의 줄임말이고 predicate 안에 있는 major clause의 T/F가 되게 하는 테스트 인풋을 찾으면 ACC를 만족한다. (ACC의 TR(Test Requirement)는 major cluase를 T/F로 만드는 것이다.)
이때 ACC의 중요한 개념이 바로 "major clause" 에 대해서 T/F를 만족시키는 것인데
major clause로 만드는 조건을 잘 생각해보면 RACC와 CACC를 쉽게 이해할 수 있다.
predicate에서 특정한 clause를 major clause로 만드는 조건
a ∧ (b ∨ c)
다음과 같은 predicate가 있다고 했을때
ACC 테스트 케이스를 만드려면 a / b / c 각각이 major clause가 되는 조건을 찾고
그 경우에서 a / b / c 각각이 T/F가 되는 인풋을 선택하면 된다.
a가 major clause가 되는 경우를 Pa라고 한다면,
Pa를 만드는 조건은 다음과 같이 나타낼 수 있다.
Pa = (b ∨ c)
왜냐하면 전체 predicate와 위의 식은 and 조건으로 묶여있기 때문에
후자가 true가 된다면 and 연산의 특성에 따라 전체 결과는 a에 의존적이기 때문이다. (determining factor)
*참고)
마찬가지로
Pb = a ∧ !c
Pc = a ∧ !b
만 만족하면 b도 c도 major clause가 되고 ACC 테스트 케이스를 만들 수 있다.
따라서 Pa = (b ∨ c) 를 만족하는 아무런 b와 c의 T/F 조합과 a가 T/F가 되는
테스트 케이스를 만들면 ACC 테스트 케이스가 된다.
이때!!! 논란이 아무리 Pa = (b ∨ c) 를 만족하더라도 실제 b와 c의 값(minor clause)이
달려져도 되는지 / 안되는지 논란이 있는데
달라져도 된다 -> CACC
달라지면 안된다 -> RACC다.
그러니까.. ACC관점에서는 사실
b c
T T
T F
F T
에 다가 각각 a T/F를 붙인것 :
(T, T, T) (F, T, T)
(T, T, F) (F, T, F)
(T, F, T) (F, F, T)
---- RACC ----
뿐만이 아니라
(T, T, T) (F, T, T)
(T, T, T) (F, T, F)
(T, T, T) (F, F, T)
(T, T, F) (F, T, T)
(T, T, F) (F, T, F)
(T, T, F) (F, F, T)
(T, F, T) (F, T, T)
(T, F, T) (F, T, F)
(T, F, T) (F, F, T)
---- CACC ----
가 다 되는 것이다.
결국 ACC의 관점에서
Pa를 만족하는 경우 minor clause 값이 뭐가 되는지 상관없으면
CACC상 문제가 없다.
결국 CACC에서 중요한건 Pa를 만족하는지 아닌지
RACC는 Pa를 만족함과 동시에 minor clause 값 자체가 테스트 케이스 쌍에서 같은지
까지 보는거다