소프트웨어 테스트에서의 순환 복잡도 (예시 포함)
⚡ 스마트 요약
순환 복잡도(Cyclomatic Complexity)는 1976년 토마스 맥케이브가 개발한 소프트웨어 측정 지표로, 프로그램의 독립적인 실행 경로 수를 계산합니다. 제어 흐름 그래프에서 계산되며, 모든 분기를 완벽하게 커버하는 데 필요한 테스트 케이스 수를 나타냅니다.

맥케이브의 순환적 복잡성이란 무엇입니까?
소프트웨어 테스트의 순환 복잡도 소프트웨어 프로그램의 복잡도를 측정하는 데 사용되는 테스트 메트릭입니다. 소프트웨어 프로그램의 소스 코드에서 독립적인 경로를 정량적으로 측정한 것입니다. 순환 복잡도는 제어 흐름 그래프를 사용하거나 소프트웨어 프로그램 내의 함수, 모듈, 메서드 또는 클래스와 관련하여 계산할 수 있습니다.
독립 경로는 다른 경로에서 이전에 통과한 적이 없는 가장자리가 하나 이상 있는 경로로 정의됩니다.
이 메트릭은 1976년 Thomas J. McCabe에 의해 개발되었으며 프로그램의 제어 흐름 표현을 기반으로 합니다. 제어 흐름은 프로그램을 노드와 에지로 구성된 그래프로 묘사합니다.
그래프에서 노드는 처리 작업을 나타내고 가장자리는 노드 간의 제어 흐름을 나타냅니다.
프로그램의 흐름 그래프 표기법
프로그램의 흐름 그래프 표기법은 가장자리를 통해 연결된 여러 노드를 정의합니다. 다음은 if-else, While, Until 및 일반적인 흐름 순서와 같은 문에 대한 흐름 다이어그램입니다.
순환 복잡도를 계산하는 방법
수학적 표현:
수학적으로는 그래프 다이어그램을 통과하는 독립적인 경로들의 집합입니다. Code 프로그램의 복잡성은 다음 공식을 사용하여 정의할 수 있습니다.
V(G) = E - N + 2
어디에,
E - 모서리 수
N – 노드 수
V (G) = P + 1
여기서 P = 조건자 노드 수(조건을 포함하는 노드)
예 -
i = 0; n=4; //N-Number of nodes present in the graph while (i<n-1) do j = i + 1; while (j<n) do if A[i]<A[j] then swap(A[i], A[j]); end do; j=j+1; end do;
이 프로그램의 흐름 그래프는 다음과 같습니다.
수학적으로 계산하고,
- V(G) = 9 - 7 + 2 = 4
- V(G) = 3 + 1 = 4 (조건 노드는 1,2 노드임)
기본 설정네 가지 독립적인 실행 경로:
- 1, 7
- 1, 2, 6, 1, 7
- 1, 2, 3, 4, 5, 2, 6, 1, 7
- 1, 2, 3, 5, 2, 6, 1, 7
순환 복잡도의 속성
순환 복잡도의 속성은 다음과 같습니다.
- V(G)는 그래프의 최대 독립 경로 수입니다.
- V(G) >=1
- V(G) = 1이면 G는 하나의 경로를 갖습니다.
- 일반적으로 사용되는 지침은 단일 모듈에 대해 V(G) 값을 10 이하로 유지하는 것입니다.
이 지표가 소프트웨어 테스트에 유용한 이유는 무엇일까요?
기본 경로 테스트는 화이트 박스 기법 중 하나로, 테스트 중에 적어도 하나의 명령문이 실행되도록 보장합니다. 이 테스트는 프로그램의 모든 선형적으로 독립적인 경로를 검사합니다. 즉, 필요한 테스트 케이스의 수는 프로그램의 순환 복잡도와 같습니다..
이 메트릭은 사이클로매틱 복잡도(M)의 속성 때문에 유용합니다.
- M은 분기 적용 범위(상한)를 달성하기 위한 테스트 사례의 수일 수 있습니다.
- M은 그래프를 통과하는 경로의 수일 수 있습니다. (하한)
이 예를 고려하십시오 -
If (Condition 1) Statement 1 Else Statement 2 If (Condition 2) Statement 3 Else Statement 4
이 프로그램의 순환 복잡도는 8-7+2=3입니다.
복잡도가 3으로 계산되었으므로 위 예제의 전체 경로 범위를 위해서는 XNUMX개의 테스트 케이스가 필요합니다.
따라야 할 단계
순환 복잡도를 계산하고 테스트 케이스를 설계하려면 다음 단계를 따라야 합니다.
1단계 – 코드의 노드와 에지를 사용하여 그래프 구성
2단계 – 독립 경로 식별
3단계 – 순환 복잡도 계산
4단계 – 테스트 케이스 설계
기본 세트가 구성되면, 테스트 사례 모든 경로를 실행하도록 작성되어야 합니다.
뷔(G) 자세히 보기
프로그램이 작으면 사이클로매틱 복잡도를 수동으로 계산할 수 있습니다. 프로그램이 매우 복잡하면 더 많은 흐름 그래프가 포함되므로 자동화된 도구를 사용해야 합니다. 복잡도 수를 기준으로 팀은 측정을 위해 취해야 할 조치를 결론 내릴 수 있습니다.
다음 표는 복잡도 번호와 v(G)에 해당하는 의미를 간략하게 보여줍니다.
| 복잡도 숫자 | 의미 |
|---|---|
| 1 ~ 10 |
구조화되고 잘 작성된 코드 높은 테스트 가능성 비용과 노력이 적게 듭니다. |
| 11 ~ 20 |
복잡한 코드 중간 테스트 가능성 비용과 노력은 중간 정도입니다. |
| 21 ~ 40 |
매우 복잡한 코드 낮은 테스트 가능성 비용과 노력이 많이 든다 |
| > 40 |
전혀 테스트할 수 없음 매우 높은 비용과 노력이 필요합니다. |
순환 복잡도 계산 도구
애플리케이션의 복잡성을 결정하는 데 사용할 수 있는 도구가 많이 있습니다. 일부 복잡성 계산 도구는 특정 기술에 사용됩니다. 복잡성은 프로그램의 결정 지점 수로 찾을 수 있습니다. 결정 지점은 소스 코드의 if, for, for-each, while, do, catch, case 문입니다.
도구의 예는 다음과 같습니다.
- OCLint – C 및 관련 언어에 대한 정적 코드 분석기
- SonarQube – 25개 이상의 언어에 걸쳐 순환적 복잡성과 인지적 복잡성을 보고합니다.
- Visual Studio Code Metrics – .NET 어셈블리용 내장 순환 복잡도 분석 기능
- Radon 및 Lizard – 명령줄 복잡성 분석기 Python 그리고 다국어 프로젝트의 경우 각각
- G메트릭스 – 측정항목 찾기 Java 관련 애플리케이션
순환 복잡도의 활용
순환 복잡도는 매우 유용할 수 있습니다.
- 개발자와 테스터가 독립적인 경로 실행을 결정하는 데 도움이 됩니다.
- 개발자는 모든 경로가 최소 한 번 이상 테스트되었음을 확신할 수 있습니다.
- 알려지지 않은 경로에 더 집중할 수 있도록 도와줍니다.
- 코드 적용 범위 개선 소프트웨어 공학
- 애플리케이션 또는 프로그램과 관련된 위험을 평가합니다.
- 주기 초기에 이러한 지표를 사용하면 프로그램의 위험이 줄어듭니다.
순환 복잡도를 줄이는 방법
높은 복잡도 수치는 신호일 뿐, 최종적인 결론은 아닙니다. 실제로 달성 가능한 대부분의 간소화는 네 번의 리팩토링을 통해 이루어집니다.
- Extract 방법. 분기문을 별도의 함수로 분리하면 복잡성이 두 모듈로 분산됩니다. 시스템 전체의 복잡성은 변하지 않지만, 각 단위는 독립적으로 테스트할 수 있게 됩니다.
- 조건부 체인을 조회로 대체하세요. 동일한 변수를 테스트하는 긴 if-else-if 문은 맵이나 스위치를 사용하면 여러 결정 지점을 하나로 통합할 수 있습니다.
- 가드 절을 사용하십시오. 잘못된 입력이 있을 경우 조기에 반환함으로써, 동작 방식은 변경하지 않고도 하나의 큰 if-else 블록이 만들어내는 중첩 구조를 없앨 수 있습니다.
- 조건문을 다형성으로 대체하세요. 타입에 따라 조건이 바뀌는 경우, 각 분기를 별도의 클래스로 분리하면 조건문 자체가 완전히 사라집니다.
이전에는 V(G) = 4였습니다.
if (user != null) { if (user.isActive()) { if (user.hasRole("admin")) { return grantAccess(); } } } return denyAccess();
이후, 동일한 동작에서 중첩 구조를 제거한 경우:
if (user == null) return denyAccess(); if (!user.isActive()) return denyAccess(); if (!user.hasRole("admin")) return denyAccess(); return grantAccess();
해당 측정 방식에 대한 주의 사항입니다. 순환 복잡도는 난이도가 아닌 결정 횟수를 나타냅니다. 간단한 경우 20개를 포함하는 switch 문은 복잡도가 21이지만 읽기 쉽습니다. 반면, 복잡하게 중첩된 블록은 복잡도가 8에 불과하더라도 이해하기 훨씬 어려울 수 있습니다. 이 수치는 검토가 필요한 후보를 찾는 데 사용해야 하며, 조작의 대상으로 삼아서는 안 됩니다.


.png)
.png)