모두에게 이것이 무엇인지 생각해 볼 시간을 30 초씩 주실 수 있나요 ?
특정 시스템의 로그인 모듈 기능에 대한 초기 클래스 다이어그램입니다.
최신 소프트웨어가 계속해서 복잡해짐에 따라 코드 그래프는 테스터에게 복잡한 코드 논리를 쉽게 이해할 수 있는 직관적인 방법을 제공합니다 . 이 기사에서는 코드 그래프를 자세히 살펴보고 시각적 코드 그래프가 소프트웨어 테스터의 역량을 향상시키는 방법과 발굴된 실제 시나리오 및 실제 사례를 통해 테스트를 수행하는 방법을 보여줍니다.
1. 코드 다이어그램이란 무엇입니까?
코드 다이어그램은 코드 구조, 클래스 간의 관계 또는 코드 요소 간의 상호 작용을 나타내는 데 사용되는 그래픽 도구를 의미합니다. 일반적인 유형에는 클래스 다이어그램, 시퀀스 다이어그램, 활동 다이어그램, 구성 요소 다이어그램 등이 포함됩니다.
코드 맵은 다음 두 부분으로 구성됩니다.
- 노드( Nodes )는 클래스, 개체, 활동과 같은 코드 요소를 나타냅니다.
- 에지는 연관, 상속, 종속성과 같은 노드 간의 관계를 나타냅니다 .
조합 관계의 클래스 다이어그램을 예로 들어 보겠습니다.
2. 코드 시각화의 이점
코드 시각화는 코드 구조와 관계를 그래픽으로 표시합니다. 팀 구성원은 소프트웨어 테스트 프로세스 중에 코드 다이어그램을 사용하여 서로 간의 의사소통 및 협업 개선, 효율성 및 집중력 향상 등 많은 이점을 얻을 수 있습니다. 이를 통해 소프트웨어 테스터는 코드 논리와 관계를 더 빠르게 이해하고 코드를 읽고 이해하는 데 소요되는 시간을 줄일 수 있습니다.
1 커뮤니케이션 및 협업 향상
코드 다이어그램의 중요한 역할은 기술 인력과 비기술 인력 간의 격차를 해소하는 것입니다. 테스터는 코드에 익숙하지 않은 관리자, 고객, 구성원에게 코드 흐름을 쉽게 설명할 수 있습니다.
전 Siemens 소프트웨어 엔지니어였던 Stelios Manioudakis는 의사소통과 협업을 개선하는 데 있어 코드 다이어그램의 역할을 완벽하게 설명하기 위해 자신을 예로 들었습니다.
소프트웨어 테스터로 일하던 초기에 그는 새로운 피트니스 트래커 앱을 개발하는 프로젝트에 참여했습니다. 수면 추적 알고리즘을 통해 센서 데이터를 분석하여 수면 단계(얕은 수면, 깊은 수면)를 결정하고 수면 보고서를 생성합니다. 하지만 알고리즘을 테스트하는 과정에서 기술적인 지식이 없는 사람이 코드만으로는 알고리즘 로직을 이해하기 어렵기 때문에 많은 어려움을 겪었습니다.
코드 다이어그램이 유용한 곳입니다. 다양한 센서 판독값과 수면 패턴 계산을 위한 시각적 알고리즘 흐름과 결정 지점을 사용하여 제품 관리자와 UI 디자이너가 불안정한 수면 패턴이나 누락된 센서 데이터 등 코드 다이어그램을 통해 테스트해야 하는 잠재적인 시나리오를 이해할 수 있도록 합니다.
이 외에도 코드 맵은 개발자와의 협업을 촉진합니다. 코드 검토 중에 테스터와 개발자는 코드 맵을 참조하여 의도한 논리와 실제 구현 간의 잠재적인 차이점을 더 잘 식별할 수 있습니다. 결국 피트니스 추적 애플리케이션의 수면 추적 알고리즘이 테스트를 성공적으로 통과했으며 코드 다이어그램이 중요한 역할을 했습니다.
2 효율성과 집중력 향상
테스터는 코드 다이어그램을 통해 테스트를 보다 효율적으로 계획, 작성 및 실행할 수 있어 반복 작업이 줄어들고 테스트 범위와 품질이 향상됩니다.
뉴스 푸시 알고리즘을 예로 들면 이 알고리즘은 사용자의 관심과 상호 작용을 기반으로 개인화된 추천을 제공합니다. 처음에 테스터는 코드를 한 줄씩 주의 깊게 살펴보아야 합니다. 이는 모든 잠재적인 테스트 시나리오를 식별하기 어렵게 만드는 시간 소모적이고 힘든 접근 방식입니다. 하지만 코드 다이어그램은 사용자 선호도, 게시물 상호 작용, 콘텐츠 최신성 등 영향을 미치는 요소를 직관적인 방식으로 표시합니다. 뿐만 아니라 코드 다이어그램은 명확한 결정 지점과 분기 경로를 제공합니다.
- 인기 주제: 사용자가 인기 있는 콘텐츠를 놓치지 않도록 정보 스트림에서 인기 주제가 먼저 표시되는 테스트 시나리오에 중점을 둡니다.
- 개인화된 추천: 다양한 관심사와 상호 작용을 가진 다양한 사용자 프로필을 테스트하여 알고리즘이 관련 콘텐츠를 정확하게 추천하는지 확인합니다.
- 엣지 케이스: 비활성 사용자나 상호 작용이 제한된 사용자와 같은 잠재적인 엣지 케이스가 강조 표시됩니다. 테스터는 이러한 상황에서 알고리즘이 실패하지 않도록 특정 테스트 사례를 설계할 수 있습니다.
코드 다이어그램을 사용하는 것이 코드를 한 줄씩 검사하는 것보다 훨씬 빠르다는 것은 분명합니다. 이를 통해 테스터는 알고리즘의 주요 영역에 우선순위를 부여하여 철저한 테스트를 보장하고 사용자에게 보다 안정적이고 개인화된 뉴스피드 경험을 제공할 수 있습니다.
3 문서 유지관리성 향상
문서화를 통해 팀 구성원은 코드 리팩토링 후 또는 새 팀 구성원이 코드를 검토해야 할 때 프로그램 흐름과 잠재적 테스트 포인트를 보다 빠르게 이해할 수 있습니다.
예를 들어, 전자상거래 플랫폼의 재고 관리 시스템은 수년 전에 구축되었습니다. 요즘에는 유지 관리가 점점 더 복잡해지고 새로운 기능을 구현하기가 점점 더 어려워지고 있습니다. 복잡한 재고 관리 로직에 직면한 시스템 조정 과정에서 코드 다이어그램은 제품 추가 및 업데이트부터 주문 처리 및 재고 수준 관리까지 모든 것을 직관적으로 표시합니다.
이러한 방식으로 테스터는 조정된 재고 관리 시스템이 효율적으로 유지되고 코드 다이어그램의 역할이 자명하다는 것을 확인할 수 있습니다.
- 보다 명확하게 의사소통: 코드 다이어그램을 사용하여 새로운 팀 구성원에게 시스템 기능을 설명합니다. 코드 주석과 함께 이러한 다이어그램은 명확하고 간결한 개요를 제공하므로 시스템의 논리 및 테스트 고려 사항을 더 빠르게 파악할 수 있습니다.
- 효율적인 코드 검토: 코드 검토 중에 코드 다이어그램과 코드 주석을 참조하면 잠재적인 문제를 조기에 식별하는 데 도움이 될 수 있습니다. 변경 사항이 전체 프로세스에 미치는 영향을 시각화함으로써 팀은 수정 사항이 시스템의 다른 부분에 의도하지 않은 부작용을 일으키지 않도록 할 수 있습니다.
- 미래 보장형 유지 관리: 시스템이 발전하고 새로운 기능이 추가됨에 따라 코드 다이어그램은 귀중한 참조 포인트 역할을 합니다. 프로젝트에 참여하지 않은 테스터라도 기존 논리와 잠재적 영향 영역을 쉽게 이해할 수 있으므로 보다 효율적이고 목표화된 테스트 노력이 가능합니다.
4. 문제를 조기에 발견
코드 다이어그램은 일반 텍스트 코드 검토에서 놓칠 수 있는 문제를 드러낼 수 있습니다. 왜냐하면 코드 다이어그램이 복잡할수록 오류가 발생하기 쉬운 코드가 더 복잡해지기 때문입니다.
예를 들어, 병원의 예약 예약 시스템에는 업데이트 프로세스 중에 환자가 온라인으로 예약 일정을 변경할 수 있는 새로운 기능이 도입되었습니다. 코드 검토 및 테스트 케이스 설계 후 큰 문제가 발견되지 않으면 새로운 기능을 사용할 수 있습니다.
그러나 충돌하는 약속의 특정 부분을 처리하는 데 관련된 복잡성을 고려하여 테스터는 추가 검사 및 검증을 위해 코드 다이어그램을 사용하기로 결정했습니다. 코드 다이어그램은 텍스트 전용 리뷰에서 간과될 수 있는 잠재적인 문제를 보여줍니다.
- 다중 결정 지점: 기존 약속, 의사 가용성, 시간 제약 등 다양한 요소를 기반으로 하는 수많은 결정 지점입니다. 이 복잡한 분기 구조는 테스트 중에 가능한 모든 시나리오를 고려하기 어렵기 때문에 오류 위험이 더 높다는 것을 의미합니다.
- 숨겨진 논리: 다이어그램의 복잡한 특성으로 인해 코드 논리를 시각적으로 이해하기가 매우 어렵습니다. 이는 코드에서 숨겨진 조건이나 예상치 못한 동작에 대한 우려를 불러일으킵니다.
결과적으로 테스터는 코드 다이어그램을 기반으로 새로운 기능을 다시 조정했습니다.
- 테스트 우선순위 지정: 날짜가 충돌하는 시나리오에 대한 테스트 우선순위를 지정합니다. 복잡한 논리에서 잠재적인 오류를 노출할 수 있는 극단적인 경우와 조합에 중점을 둡니다.
- 개발자와 협업: 시각적 표현의 도움으로 테스터는 발견된 복잡성을 개발자와 논의합니다. 협업을 통해 논리를 단순화하고 순환적 복잡성을 줄이는 코드 리팩토링 노력이 이루어졌습니다.
테스터는 코드 맵을 사용하여 잠재적인 문제를 사전에 식별하고 개발자와 협력하여 문제를 해결합니다. 이는 병원 예약 일정 시스템의 무결성과 신뢰성을 보장합니다.
5 구조화된 프로그래밍 연결
코드 다이어그램은 구조화된 프로그래밍 원칙(순서, 선택 및 반복)에 완벽하게 들어맞습니다. 이러한 기본 구조는 특정 그래픽 패턴에 직접 매핑되어 이러한 공통 구조의 테스트를 단순화합니다.
(1) 단순화된 테스트 설계: 구조적 프로그래밍은 시퀀스, 선택( if-else) 및 반복(루프)과 같이 명확하게 정의된 구조를 강조합니다코드 맵은 이러한 구조를 특정 패턴에 직접 매핑합니다.
- 시퀀스: 다른 문장 다음에 이어지는 하나의 문장을 나타내는 직선 노드
![순서](https://cdn.easycorp.cn/web/data/upload/zentao/202404/f_ca2615af5c2c841b49e6172f2eef9118.png)
- 선택: 단일 진입 노드, 조건부 노드 및 두 개의 나가는 에지(참에 대해 하나, 거짓에 대해 하나)가 있는 분기 구조로, 별도의 명령문 시퀀스로 이어집니다.
![선택하다](https://cdn.easycorp.cn/web/data/upload/zentao/202404/f_e220c560ad82a7bb5e4f72cc26890852.png)
- 반복: 항목 노드, 조건 노드, 조건 노드를 반환하는 에지, 루프 본문을 가리키는 에지(문 시퀀스)가 있는 루프 패턴
(2) 더욱 쉬워진 테스트 케이스 시각화: 코드 다이어그램에서 이러한 친숙한 패턴을 식별함으로써 테스터는 프로그램의 흐름과 해당 테스트 케이스를 빠르게 이해할 수 있습니다. 예를 들어, 다이어그램의 루프 패턴은 경계 조건 및 예상 동작을 포함하여 루프의 다양한 반복을 포괄하는 테스트 사례의 필요성을 나타냅니다.
6 복잡성 측정에 대한 추가 정보
사이클 수는 프로그램 테스트의 어려움을 평가하는 데 도움이 되는 코드 그래프의 복잡성을 기반으로 한 척도입니다. 복잡성이 높을수록(경로가 많을수록) 테스트가 더욱 철저해집니다. 하지만 더 자세히 알아보겠습니다.
- 루프 수: 이 측정항목은 코드 그래프의 구조에서 파생되며 프로그램의 독립적인 실행 경로 수를 추정하는 데 사용됩니다. 루프 수가 높을수록 일반적으로 중첩 루프, 다중 결정 지점 또는 GOTO 문과 같은 요인으로 인해 복잡성이 높아집니다.
- 스마트 테스트 계획: 사이클 번호는 테스터를 위한 지침 역할을 하며 포괄적인 테스트에 필요한 노력의 양을 나타냅니다. 루프 수가 높은 프로그램은 루프 수가 적은 프로그램보다 모든 잠재적 실행 경로를 포괄하는 테스트 사례가 더 많이 필요합니다. 이를 통해 테스터는 작업 우선순위를 정하고 복잡한 섹션을 포괄적으로 다룰 수 있습니다.
다음은 두 개의 연속된 if-else 문이 있는 간단한 프로그램을 고려한 빠른 예입니다 .
if condition1:
# statements for if condition1 is true
else:
if condition2:
# statements for if condition2 is true
else:
# statements for both conditions false
마디:
- 노드 1 : 프로그램의 시작점으로, 코드 실행의 시작을 나타냅니다.
- 노드 2 : 결정 노드 조건1 . 이 노드는 조건을 평가하고 결과(true 또는 false)에 따라 실행 흐름을 결정합니다.
- 노드 3 : 조건 1 문 블록 이 true인 경우 실행됩니다 . 이 노드는 Condition1 의 "if" 블록 내의 모든 코드를 나타냅니다 .
- 노드 4 : 조건1 과 연결된 "else" 노드입니다 . 이 노드는 조건2가 확인되지 않은 경우 (즉, 조건1 이 거짓인 경우) 대체 경로를 나타냅니다.
- 노드 5 : 조건2 의 결정 노드입니다 . 이 노드는 조건을 평가하고 그 결과(true 또는 false)에 따라 실행 흐름을 결정합니다.
- 노드 6 : 조건2 가 true일 때 실행되는 명령문 블록입니다 . 이 노드는 조건2 의 "if" 코드 블록에 있는 모든 코드를 나타냅니다.
- 노드 7 : 조건2 와 연결된 "else" 노드 - 이 노드는 프로그램의 끝을 나타내며 조건1 과 조건2 가 모두 거짓인 경우 실행되는 코드를 나타냅니다.
옆:
- Edge 1 : 노드 1 과 노드 2를 연결하며 , 시작점에서 첫 번째 결정점까지의 초기 흐름을 나타냅니다.
- Edge 2 (true): 조건 1은 노드 2 와 노드 3을 연결하여 true인 경우 실행할 프로세스를 나타냅니다.
- Edge 3 (false): 조건1은 노드 2 와 노드 4를 연결하며 , false인 경우 대체 흐름이 채택됨을 나타냅니다.
- Edge 4 : "else" 블록 에서 조건1의 두 번째 결정 지점 까지 의 흐름을 나타내는 노드 4 와 노드 5를 연결합니다.
- Edge 5 (true): 조건 2는 노드 5 와 노드 6을 연결하여 true인 경우 실행될 프로세스를 나타냅니다.
- Edge 6 (false): 조건 2는 노드 5 와 노드 7을 연결하여 false인 경우 끝점을 나타냅니다.
해당 코드 그래프는 세 개의 결정 지점과 여러 실행 경로가 있는 분기 구조를 갖습니다. 이 그래프의 주기 수는 4 (노드 - 가장자리 + 2 )입니다. 이는 논리가 단순한 구조의 프로그램보다 더 복잡하고 더 많은 테스트 사례가 필요할 수 있음을 나타냅니다.
이러한 이점을 이해함으로써 소프트웨어 테스터는 코드 다이어그램을 활용하여 프로그램 논리를 효과적으로 탐색하고 효과적인 테스트 사례를 설계하며 고품질 소프트웨어를 제공하는 데 도움을 줄 수 있습니다.
원수 4 를 도출하는 방법을 자세히 설명하겠습니다 .
- 순환 복잡도는 프로그램에 얼마나 많은 독립 경로가 있는지 알려줍니다. 경로가 많을수록 테스트가 더 복잡해집니다.
- 이 코드에는 두 가지 결정이 있습니다( 조건1 및 조건2 확인 ). 각 결정은 경로에 잠재적 분기점(참 또는 거짓)을 만듭니다.
- 그러나 else 블록 조건1 은 결정 조건2 를 직접 가리키 므로 거기에는 실제 분기가 없습니다. 이는 또 다른 결정 지점으로 이어지는 일방 통행로와 같습니다.
- 따라서 우리는 독립적인 결정 포인트인 초기 포인트 , 조건1 (참 또는 거짓) , 조건2 (참 또는 거짓)만 계산합니다.
3개의 결정 지점이 있지만 시작점 때문에 1을 추가하는 것이 순환 복잡도를 계산하는 일반적인 방법이므로 최종 숫자는 3 + 1 = 4 입니다 .
기억하다:
- 순환적 복잡성이 높다고 해서 반드시 코드가 나쁘다는 의미는 아니지만 더 많은 테스트 시나리오를 고려해야 함을 의미합니다.
- 복잡성이 4 인 이 코드 조각은 그다지 복잡하지 않지만 결정 횟수와 조건 중첩이 증가함에 따라 순환적 복잡성과 테스트 노력이 크게 증가합니다.
3. 코드 다이어그램의 한계
코드 다이어그램은 의사소통과 협업을 개선하고 효율성과 집중력을 높이는 이점이 있지만 테스터는 다음 사항에도 주의를 기울여야 합니다.
1 요소를 실행할 수 없습니다.
- 주석 및 선언 무시: 코드 다이어그램은 실행 가능한 명령문으로 표시되는 프로그램 내의 제어 흐름에 주로 중점을 둡니다. 주석 및 데이터 선언과 같은 실행 불가능한 요소는 코드 실행에 직접적인 영향을 미치지 않기 때문에 일반적으로 무시됩니다.
- 오해의 가능성: 이러한 요소를 생략하면 다이어그램이 단순화될 수 있지만 일부 오해가 발생할 수 있습니다. 테스터는 이러한 무시된 요소를 인식하고 테스트 중에 이를 고려해야 데이터 초기화, 논리 주석 또는 기타 실행 불가능한 코드 섹션과 관련된 잠재적인 문제를 간과하지 않도록 해야 합니다.
2 경로 타당성 구별
- 의미 있는 경로 식별의 과제: 코드 그래프의 모든 경로가 유효하거나 의미 있는 실행 시퀀스를 나타내는 것은 아닙니다. 특정 경로는 그래프 구조에 따라 기술적으로 실행 가능(위상적으로 실행 가능)하지만 프로그램 논리의 맥락에서는 비논리적이거나 의미가 없습니다(의미적으로 실행 불가능).
- 테스트 노력 증가: 실행 가능한 테스트 경로를 식별하고 우선 순위를 지정하는 것은 어려울 수 있으며 테스터의 추가 노력이 필요할 수 있습니다. 유효한 경로와 유효하지 않은 경로를 구별하기 위해 프로그램 논리와 컨텍스트를 분석해야 하며, 이로 인해 테스트 사례 설계 및 실행 시간이 추가로 소요될 수 있습니다.
3 이러한 제한 사항 완화
- 다른 테스트 기술과 결합: 코드 다이어그램은 코드 검토 또는 데이터 흐름 분석과 같은 다른 테스트 기술과 결합할 때 가장 잘 작동합니다. 이러한 기술은 실행할 수 없는 요소와 해당 요소의 잠재적 영향을 식별하는 데 도움이 되는 동시에 프로그램의 논리를 이해하여 경로의 타당성을 더 잘 평가하는 데도 도움이 됩니다.
- 중요 경로에 집중: 테스터는 코드 그래프에서 위험도가 높거나 중요한 경로를 테스트하는 데 우선 순위를 지정할 수 있습니다. 여기에는 루프 조건, 예상되는 사용자 입력, 잠재적인 오류 시나리오 등의 요소를 고려하여 테스트에 가장 큰 영향을 미칠 경로를 결정하는 작업이 포함됩니다.
테스터는 이러한 제한 사항을 이해하고 해결함으로써 코드 그래프를 효과적으로 활용할 수 있습니다. 테스트의 본질적인 한계와 다른 테스트 방법과의 결합 필요성을 인정하면서 포괄적이고 효율적인 테스트를 수행할 수 있습니다.
4. 마지막에 쓰세요
ZenTao 소프트웨어 팀이 독립적으로 개발한 엔터프라이즈 IM 소프트웨어는 채팅과 협업을 유기적으로 결합하는 오픈 소스 애플리케이션 draw.oi를 통합합니다 . 이 기사의 모든 코드 다이어그램은 이 기능을 사용하여 완성됩니다. 코드 다이어그램을 활용함으로써 소프트웨어 테스터는 프로그램 논리를 더 깊이 이해할 수 있습니다. 보다 효과적인 테스트 케이스를 설계하고 고품질 소프트웨어 제공에 기여할 수 있습니다.
소프트웨어 환경이 계속 발전함에 따라 코드 다이어그램은 애플리케이션의 안정성과 견고성을 보장하는 데 계속해서 중요한 도구가 될 것이라는 점을 인정해야 합니다.
*참고: 코드 그래프: Stelios Maniooudakis의 테스터를 위한 가이드
RustDesk는 만연한 사기로 국내 서비스 Taobao(taobao.com)를 중단하고 웹 버전 최적화 작업을 재개했으며 Apple은 M4 칩을 출시했으며 고등학생들은 성인식으로 자신의 오픈 소스 프로그래밍 언어를 만들었습니다. 네티즌들은 다음과 같이 논평했습니다. 변호인인 Yunfeng은 Alibaba에서 사임했으며 향후 Windows 플랫폼의 Visual Studio Code 1.89를 독립 게임 프로그래머를 위한 대상인 Huawei에 의해 공식적으로 발표되었습니다. Yu Chengdong의 직업 조정은 "FFmpeg Pillar of Shame"에 포함되었습니다. ” 15년 전, 오늘 그는 우리에게 감사해야 합니다. Tencent QQ Video가 이전의 수치심을 복수한다고요? 화중과기대학교 오픈소스 미러 스테이션이 외부 네트워크 접속에 공식적으로 개방되었습니다.