0%

200903 TIL

Testing

테스팅이란 응용 프로그램 또는 시스템(구성요소)의 동작과 성능, 안정성이 요구 하는 수준을 만족하는지 확인하기 위해 결함을 발견하는 과정이라고 할 수 있다.

  • 정적 테스트: 프로그램을 개발하기 전에 요구사항 등을 리뷰 하는 것
  • 동적 테스트: 프로그램 개발 이후에 실제 실행하면서 테스트 하는 것

소프트웨어 개발, 유지보수, 운영 시 테스팅의 역할

  1. Testing을 통해 release 전에 발견 되지 않은 결함들이 수정된다면, 운영 환경 내에서 발생하는 risk를 줄이는데 기여 할 수 있으며 소프트웨어 품질에 도움을 준다.
  2. Testing은 개발 초기의 요구사항 분석 단계 부터 review 및 insfection을 통해 정적으로 이뤄질 수 있으며 각각의 개발 단계에 대응하는 test level에 따른 testing이 이루어진다.
  3. 기존에 운영되는 소프트웨어 시스템이 유지 보수 활동으로 변경 및 단종되거나 환경이 변하는 경우, 변경된 소스트웨어에 대한 testing과 변경된 환경에서 운영 testing이 요구된다.
  4. 소프트웨어 testing은 계약상(법적) 요구조건들, 또는 산업에 특화된 표준들을 만족 시키기 위해서 필요하다.

Testing의 일반적인 원리

  1. Testing이 결함이 존재함을 밝히는 활동이다.
    Testing은 결함이 존재함을 드러내지만, 결함이 없다는 것을 증명할 수 없다.
    즉, 프로그램이 완벽하다고 증명할 수 없다.
    이는 Test한 부분까지만 잘 동작한다고 말할 수 있고 테스트를 하지 않은 부분은 결함이 있는지 없는지 예측할 수 없다.

  2. Exhaustive Testing은 불가능 하다.

    모든 가능성(입력과 사전 조건의 모든 조합)을 Testing 하는 것은 지극히 간단한 소프트웨어를 제외하고 가능하지 않다.

    • 한 프로그램 내의 내부 조건이 무수히 많음
    • 입력이 가질 수 있는 보든 값의 조건이 무수히 많음
    • GUI이벤트 발생 순서에 대한 조합도 무수히 많음

    완벽한 Testing 대신, 리스크 분석과 결정된 우선순위에 따라 Testing 활동 노력을 집중 시켜야 한다. (Risk-based testing)
    완벽한 Testing은 우주항공, 의료 등 안전이 최우선(Safety critical)인 소프트웨어를 개발 할 때 고려 할 수 있으나 실제로 완벽한 것은 아니고 강력한 Testing으로 볼 수 있다.

Test Driven Development

  • 새로 추가 되는 기능에 해당하는 Test를 먼저 작성, 이때 각 test는 간결 해야함
  • 테스트를 수행하고 새 테스트가 실패하는지 확인한다.
    • 새 테스트는 항상 실패해야만 테스트가 잘 작성됐다고 할 수 있다.
  • 코드를 작성
  • 테스트 수행
  • 코드의 refactor
  • 반복