본문 바로가기
컴퓨터공학

소프트웨어 공학 : 테스트

by oobw 2023. 10. 23.

소프트웨어 개발에 있어서 테스트 단계는 빠질 수 없고 매우 중요합니다. 테스트는 시스템의 오류를 발견하기 위한 과정으로 시스템이 주어진 요구 사항을 만족하는지 판단하게 됩니다. 이번 글에서는 소프트웨어 공학의 관점에서 테스트에 대해 알아보겠습니다.  

1. 테스트의 정의

테스트란 "시스템이 정해진 요구를 만족하는지, 예상과 실제 경과가 어떤 차이를 보이는지 수동 또는 자동 방법을 동원하여 검사하고 평가하는 일련의 과정"이라고 정의할 수 있습니다. 테스트는 특정 조건 하에서 시스템이나 구성 요소를 실행하여 예상되는 결과와 실제 결과를 비교함으로써 소프트웨어의 특성을 평가합니다. 이는 시스템의 정확성, 완결성, 보안성 등 다양한 품질 속성을 확인하고, 기능적 및 비기능적 요구사항이 올바르게 충족되었는지 평가하기 위해 수행됩니다.

 

테스트의 주요 목적은 다음의 세 가지입니다.

1. 결함 검출: 소프트웨어에서 잠재적으로 존재할 수 있는 버그나 오류를 찾아내는 것.

2. 품질 보장: 소프트웨어의 품질이 기대치와 일치하는지 확인하는 것.

3. 요구사항 충족 확인: 소프트웨어가 사용자나 이해관계자의 요구사항을 정확하게 충족하는지 검증하는 것.


테스트는 일반적으로 계획, 설계, 실행 및 결과 분석의 단계를 거치며, 이는 소프트웨어의 각 개발 단계에서 반복적으로 수행됩니다.

2. 오류의 종류

소프트웨어 개발 및 테스트 과정에서 다양한 유형의 오류들이 발생할 수 있습니다. 오류의 종류는 그 원인, 발생 단계, 그리고 표현되는 형태에 따라 분류될 수 있습니다. 다음은 주요 오류의 종류입니다.

1) 구문 오류 (Syntax Errors)

구문 오류는 프로그래머가 프로그래밍 언어의 규칙 또는 문법을 정확하게 따르지 않아 발생하는 오류입니다. 컴파일러나 인터프리터는 소스 코드를 분석하면서 이러한 오류를 찾아내고, 대부분의 개발 환경에서는 오류의 위치와 함께 오류 메시지를 제공합니다. 구문 오류는 보통 프로그래밍 초보자에게 자주 발생하며, 올바른 문법을 사용하지 않았을 때 발생합니다. 예를 들어, 파이썬에서 콜론(:)을 잊어버리거나, 변수를 잘못된 방식으로 선언할 때 이러한 오류가 발생할 수 있습니다.

2) 런타임 오류 (Runtime Errors)

런타임 오류는 프로그램 실행 중에 발생하는 오류로, 코드의 구문이 올바를 때도 발생할 수 있습니다. 이러한 오류는 대개 예외 처리를 통해 해결할 수 있으며, 미처 예측하지 못한 상황에서 발생합니다. 예를 들어, 사용자로부터 숫자 입력을 받기를 기대하고 있었지만 문자열을 받게 될 경우나 배열의 범위를 벗어나 접근하려고 할 때, 또는 메모리에 접근할 권한이 없는 영역에 접근하려 할 때 런타임 오류가 발생할 수 있습니다.

3) 논리 오류 (Logical Errors)

논리 오류는 프로그램이 문법적으로는 올바르게 동작하나, 의도한 바와 다르게 작동할 때 발생합니다. 이러한 오류는 테스트나 코드 리뷰 없이는 쉽게 발견되지 않습니다. 예를 들어, 반복문의 조건을 잘못 설정하거나, 잘못된 조건문을 사용하여 의도와 다르게 동작하게 되는 경우가 논리 오류에 해당합니다.

4) 인터페이스 오류 (Interface Errors)

인터페이스 오류는 두 개의 모듈이나 시스템 간의 상호 작용에서 발생하는 오류입니다. 함수나 메서드를 호출할 때 올바르지 않은 파라미터 값을 전달하거나, 약속된 반환 값을 제대로 처리하지 않을 때 이러한 오류가 발생합니다. 인터페이스 오류는 통합 테스트 단계에서 주로 발견되며, 각 모듈이나 시스템의 독립적인 테스트에서는 감지되지 않을 수 있습니다.

5) 퍼포먼스 오류 (Performance Errors)

퍼포먼스 오류는 프로그램의 실행 속도, 반응 시간, 자원 사용률 등 성능 관련 문제로 발생하는 오류입니다. 예를 들어, 프로그램이 너무 많은 메모리를 사용하거나, 데이터베이스 쿼리 최적화가 제대로 이루어지지 않아 시스템 반응이 느려지는 경우가 퍼포먼스 오류에 해당합니다.

6) 하드웨어 오류 (Hardware Errors)

하드웨어 오류는 컴퓨터의 물리적 장치에서 발생하는 문제로 인한 오류입니다. 디스크의 물리적 손상, 메모리 칩의 결함, 과열 등의 문제로 인해 발생하는 오류가 여기에 해당합니다. 이러한 오류는 하드웨어의 교체나 수리를 통해 해결될 수 있습니다.

7) 외부 오류 (External Errors)

외부 오류는 프로그램 자체의 문제가 아닌 외부 환경, 예를 들어 네트워크 문제, 외부 서비스의 다운타임 등에 의해 발생하는 오류입니다. 이러한 오류는 프로그램의 수정 없이도 외부 환경의 문제를 해결함으로써 해결될 수 있습니다.

3. 테스트의 단계

다양한 테스트 단계를 거쳐 소프트웨어의 다양한 측면을 검증합니다. 테스트단계는 단위 테스트(unit test), 통합 테스트(integration test), 시스템 테스트(system test), 리그레션 테스트(regression test), 인수 테스트(acceptance test)로 구분될 수 있습니다.

1) 단위 테스트 (Unit Test)

단위 테스트는 소프트웨어의 가장 작은 단위, 즉 함수나 메서드 등의 독립된 부분을 테스트하는 과정입니다. 이 단계에서는 개별적인 코드 조각이 정상적으로 동작하는지, 주어진 입력에 대해 예상된 출력을 반환하는지 확인합니다. 단위 테스트는 자동화되어 실행되며, 코드의 각 부분이 올바르게 동작하는지 빠르게 판단할 수 있게 해 줍니다.

2) 통합 테스트 (Integration Test)

통합 테스트는 여러 개의 단위가 함께 동작할 때 제대로 동작하는지 검증하는 과정입니다. 특히, 서로 다른 단위나 모듈 간의 인터페이스를 중심으로 테스트가 이루어집니다. 이 단계에서는 데이터 교환, 함수 호출, 서브시스템의 연동 등이 올바르게 이루어지는지 확인합니다.

3) 시스템 테스트 (System Test)

시스템 테스트는 통합 테스트 후 전체 시스템이 명세에 따라 정상적으로 동작하는지 확인하는 과정입니다. 시스템의 전체 기능, 성능, 안정성 등을 검증하는데 중점을 둡니다. 또한, 다양한 환경에서의 호환성도 함께 검토됩니다.

4) 리그레션 테스트 (Regression Test)

리그레션 테스트는 소프트웨어의 변경이 있을 때 그 변경으로 인해 기존의 기능에 문제가 발생하지 않는지 검사하는 테스트입니다. 코드의 일부분을 수정하거나 기능을 추가, 변경했을 때, 그로 인해 기존의 기능들에 부작용이 발생하지 않는지 확인하기 위해 주로 사용됩니다.

5) 인수 테스트 (Acceptance Test)

인수 테스트는 소프트웨어가 실제 사용 환경에서 사용자의 요구사항과 기대치를 충족하는지 확인하는 테스트입니다. 이 단계에서는 실제 사용자나 대리 사용자가 참여하여, 사용자의 시나리오와 비즈니스 프로세스에 따라 테스트가 진행됩니다. 만약 소프트웨어가 인수 테스트를 통과한다면, 실제 운영 환경에 배포될 준비가 된 것으로 간주됩니다.

 

테스트의 단계

위의 그림에는 테스트 단계와 소프트웨어 개발 단계의 관계를 나타냅니다.  일반적으로 소프트웨어 개발 단계가 진행될 때마다 관련된 테스트 단계가 함께 이루어집니다. 예를 들면, 코드 작성 후 단위 테스트가 진행되며, 여러 모듈이 통합될 때 통합 테스트가 이루어지고, 최종적으로 제품이 완성될 때 인수 테스트가 수행됩니다