Verification and Validation - 1
1. 소프트웨어의 품질이란?
소프트웨어 품질이란 명시된 요구사항 및 내재된 요구사항(반드시 명시하지 않아도 당연히 그럴 것이라고 가정하는 것들을 의미한다. 예를 들면, 동작 속도는 빨라야 한다.) 을 얼마나 잘 충족하는가를 나타내는 소프트웨어 특성의 총체이다. 소프트웨어 및 시스템 개발 과정에서 오류를 줄이고 소프트웨어의 품질을 향상하는 것이 중요하다. ISO 25010(소프트웨어 품질 모델을 정의하는 국제 표준)에서는 소프트웨어 품질 특성을 아래와 같이 정의하고 있다.
1. 기능성 (Functional Suitability): 요구 사항에 맞는 기능이 구현되었는지 확인
2. 신뢰성 (Reliability): 소프트웨어가 안정적으로 동작하고, 오류 없이 지속적인 성능을 제공하는 능력
3. 사용성 (Usability): 소프트웨어의 사용자가 인터페이스를 쉽게 이해하고 사용할 수 있는 정도
4. 효율성 (Performance Efficiency): 자원을 적절히 활용하면서 성능을 최적화하는 능력
5. 유지보수성 (Maintainability): 소프트웨어가 향후 수정, 업데이트, 기능 확장 등을 쉽게 할 수 있는 능력
6. 이식성 (Portability): 소프트웨어가 다양한 환경에서 실행될 수 있는 능력
7. 상호운영성 (Compatibility): 다른 시스템과의 상호적으로 연동하는 능력
8. 보안성 (Security): 소프트웨어가 외부의 위협으로부터 보호되고, 데이터 유출 방지 및 권한 관리가 철저히 이루어지는 정도
각각의 주특성에 대한 부특성과 설명은 Table 1.과 같다.
Table 1. 접기/펼치기
주특성 | 부특성 | 설명 |
---|---|---|
기능성 | 기능 성숙도 (Functional Completeness) | 명시된 요구사항의 구현 정도 |
기능 정확도 (Functional Correctness) | 정의된 정밀도에 따라 정확하게 결과를 제공하는 정도 | |
기능 타당성 (Functional Appropriateness) | 사용자의 목적 달성에 소프트웨어가 도움을 주는 정도 | |
효율성 | 시간 반응성 (Time-behavior) | 기능 수행 시 응답 처리시간과 처리율이 요구사항을 충족시키는 정도 |
요소 활용 (Resource Utilization) | 기능 수행 시 사용되는 자원의 유형 및 양이 요구사항을 만족시키는 정도 | |
기억 용량 (Capacity) | 제품 혹은 시스템 파라미터(최근 사용자 수, 통신 대역폭 등)의 최대 한계가 요구사항을 만족시키는 정도 | |
호환성 | 공존성 (Co-existence) | 다른 소프트웨어에 해로운 영향을 주지 않고 환경 및 자원을 공유하면서 요구된 기능을 효과적으로 수행하는 정도 |
상호 운용성 (Interoperability) | 둘 혹은 그 이상의 시스템, 제품 혹은 구성요소가 정보를 교환하거나 교환된 정보를 이상 없이 사용할 수 있는 정도 | |
사용성 | 타당성 식별력 (Appropriateness recognisability) | 사용자의 요구에 적절한 기능인지 식별할 수 있는 정도 |
학습성 (Learnability) | 사용자가 소프트웨어의 사용법을 배워 명시된 목적을 달성할 수 있는 정도 | |
운용성 (Operability) | 제품 혹은 시스템의 작동 및 제어를 쉽게 할 수 있는 정도 | |
사용자 오류 보호 (User error protection) | 소프트웨어가 발생한 오류로부터 사용자를 보호하는 정도 (버튼 비활성화, 알림 창 등) | |
사용자 인터페이스 미학 (User interface aesthetics) | 사용자 인터페이스가 사용자에게 만족스러운 정도 | |
접근성 (Accessibility) | 연령과 장애에 관계없이 사용할 수 있는 정도 | |
신뢰성 | 성숙성 (Maturity) | 소프트웨어 구성요소가 표준적 환경에서 신뢰도 요구를 충족시키는 정도 |
가용성 (Availability) | 사용자가 원하는 시간에 사용 및 접근이 가능한 정도 | |
결점 완화 (Fault tolerance) | 하드웨어 혹은 소프트웨어에 결함이 존재하더라도 시스템, 이를 극복하고 의도한 대로 동작하는 정도 | |
회복 가능성 (Recoverability) | 중단 및 실패 발생 시 제품 혹은 시스템이 데이터를 복구할 수 있는 정도 | |
보안성 | 기밀성 (Confidentiality) | 제품 혹은 시스템이 반드시 권한이 있는 데이터에만 접근 가능하도록 하는 정도 |
무결성 (Integrity) | 시스템, 제품 혹은 구성요소가 컴퓨터 프로그램 혹은 데이터에 대해 무단으로 접근 혹은 변경되는 것을 방지하는 정도 | |
부인 방지 (Non-repudiation) | 사건 및 행위 후에 부인하지 못하도록 행동 및 사건에 대해 입증되는 정도 | |
책임성 (Accountability) | 시스템 내의 각 개인을 유일하게 식별하여 언제 어떠한 행동을 하였는지 기록하여 그 행위자를 추적할 수 있는 정도 | |
진본성 (Authenticity) | 사건 및 행동에 대해 행위자임을 증명할 수 있는 정도 | |
유지보수성 | 모듈성 (Modularity) | 최소의 영향을 가진 개별 구성요소로 구성된 정도 |
재사용성 (Reusability) | 자산이 하나 이상의 시스템에서 사용될 수 있거나, 다른 자산을 구축하는 데 사용될 수 있는 정도 | |
분석성 (Analyzability) | 시스템 변화에 대해 어떠한 영향을 받는지 효과적이고 효율적으로 평가할 수 있는 정도 | |
수정 가능성 (Modifiability) | 제품 혹은 시스템이 장애 없이 효과적이고 효율적으로 수정될 수 있는 정도 | |
시험 가능성 (Testability) | 제품 혹은 시스템에 대해 테스트 기준을 효과적이고 효율적으로 수립할 수 있는 정도 또는 이들 기준을 만족하는지 효과적으로 테스트할 수 있는 정도 | |
이식성 | 적용성 (Adaptability) | 제품 혹은 시스템이 다른 하드웨어, 소프트웨어 혹은 기타 사용 환경에 효과적이고 효율적으로 적용될 수 있는 정도 |
설치성 (Installability) | 제품 또는 시스템이 성공적으로 설치 및 제거될 수 있는 정도 | |
대치성 (Replaceability) | 제품이 동일한 환경에서 동일한 목적을 위해 다른 지정 소프트웨어 제품으로 대치될 수 있는 정도 |
2. 소프트웨어의 품질 지표
소프트웨어의 품질을 판단하는데 도움이 되는 일반적인 지표는 아래와 같다.
2.1 규모 관련 지표
1. 라인수(LOC: line of code): 보통, 공백을 제외한 라인 수를 의미
2. 주석 제외 라인 수: // 등의 주석을 제외한 라인 수를 의미
3. 주석 비율: 전체 코드 중, 주석이 차지하는 비율
주석이 많다고 좋은 것은 아니다. 주석없이 이해할 수 있도록 작성된 코드가 좋은 코드이다.
4. 함수 라인 수: 함수 내 라인의 수
특히, 함수 라인수가 길면 소스코드를 이해하기 어렵고, 테스트 하기 어렵다. 함수 라인의 수를 줄이기 위해 리팩토링을 수행한다. 리팩토링이란, 함수의 입/출력은 고정한 채 내부 로직을 개선하는 방법이다.
2.2 복잡도 관련 지표
1. 순한 복잡도: 함수의 제어 흐름이 얼마나 복잡한지를 의미하며, 분기문이 많을수록 복잡도가 높아진다.
2.3 의존성 관련 지표
1. 함수 별 호출하는 건수: 각각의 함수가 다른 함수를 호출하는 수
2. 함수 별 호출되는 건수: 각각의 함수가 다른 함수로 부터 호출되는 수
3. 변경 영향 비율: 하나의 함수가 변경되면 얼마나 코드에 영향을 주는가
4. 상호참조: 서로가 서로를 참조하는 형태
무한루프에 빠질 수 있기 때문에 상호참조하지 않도록 해야한다.
open source인 Doxygen을 사용하면 각각의 의존성을 다이어그램으로 확인할 수 있다.
2.4 기타
1. 코드 중복: 단순히 copy-past 한 코드를 의미
코드 중복은 유지보수와 리팩토링을 어렵게하며, 무엇보다도 결함까지 함께 복사한다.
3. Verification & Validation
Verification은 요구사항 명세서에 맞게 올바른 제품이 만들어졌는지 검증하는 것이다. 반면, Validation은 고객이 의도한 환경이나 사용 목적에 맞게 올바르게 만들어졌는지 검증하는 것이다. SW를 테스팅한다는 것은, V&V을 수행한다는 것을 의미한다.