[ISTQB CTFL] 1. SW Testing의 기초

ks0108·2025년 6월 29일

ISTQB CTFL

목록 보기
1/1
post-thumbnail

✅ Testing이 왜 필요한가

소프트웨어는 점점 더 복잡해지고 있으며, 사용자 요구는 다양해지고 있다. 이러한 환경에서 테스팅은 더 이상 선택이 아닌 필수 요소이다. 많은 사람들이 테스팅을 단순히 '버그를 잡는 일'로 오해하지만, 테스팅은 제품의 신뢰성과 안정성을 확보하기 위한 핵심 품질 활동이다.

📌 테스팅의 목적

테스팅의 핵심 목적은 소프트웨어의 결함을 사전에 찾아내고, 품질을 향상시키며, 운영 중 발생할 수 있는 장애나 리스크를 줄이는 데 있다. 구체적인 목적은 다음과 같다.

  • 시스템이 요구사항을 충족하는지 확인한다.
  • 결함을 조기에 발견함으로써 수정 비용을 줄인다.
  • 제품이 실제 환경에서 안정적으로 동작하는지 평가한다.
  • 이해관계자(고객, 사용자 등)의 신뢰와 만족도를 높인다.

즉, 테스팅은 단순한 오류 탐지가 아니라, 제품이 신뢰할 수 있고 유용하며 요구사항에 부합하는지 확인하는 검증 활동이다!!

📌 테스팅은 소프트웨어 생명주기 전반에 기여한다.

테스트는 단지 릴리스 전 마지막 단계에서만 수행되어야 하는 활동이 아니다. 오히려 테스터는 개발 초기부터 적극적으로 참여해야 한다. 각 개발 단계에서 테스터가 개입함으로써 얻을 수 있는 이점은 다음과 같다.

🔹 요구사항 단계
테스터가 요구사항 리뷰나 사용자 스토리 개선 단계에 참여하면, 명확하지 않거나 테스트 불가능한 요구사항을 조기에 식별할 수 있다. 이는 잘못된 기능이 구현되는 리스크를 줄이고, 결함이 처음부터 시스템에 유입되는 것을 방지하는 데 효과적이다.

🔹 설계 단계
설계 과정에서 테스터가 시스템 설계자와 협업하면, 시스템 구조와 이에 대한 테스트 접근 방식에 대한 상호 이해도가 높아진다. 이러한 이해는 설계상의 결함을 줄이는 데 도움이 되며, 필요한 테스트 조건을 더 빨리 정의할 수 있게 한다.

🔹 개발 단계
테스터가 개발자와 협업하면 코드와 그것을 어떻게 테스트할 것인지에 대한 시야가 확장된다. 이는 테스트와 코드 양쪽에서 발생할 수 있는 결함을 줄이고, 더 견고한 품질 확보로 이어진다.

🔹 릴리스 전
릴리스 직전 테스터가 소프트웨어를 점검하고 검증하면, 그동안 놓쳤을 수 있는 장애를 마지막 순간에 걸러낼 수 있다. 이는 제품이 실제 사용자 요구를 만족시키고, 실사용 환경에서도 안정적으로 동작할 가능성을 높여준다.

즉, 테스팅은 단순한 기능 확인이 아니라 개발 전 과정에 걸쳐 품질을 지키는 과정이다! 테스팅이 제대로 수행되면 제품은 더 신뢰할 수 있고, 사용자 만족도는 높아지며, 유지보수 비용은 줄어든다. 테스팅을 정확하게 하는지 여부에 따라서 실패와 성공을 결정하기 때문에 테스팅은 개발 과정에서 반드시 필요한 과정이다.

✅ Testing이란 무엇인가

📌 소프트웨어 테스팅의 정의

소프트웨어 테스팅은 단순히 ‘버그 찾기’가 아니라 "소프트웨어 제품이 요구된 기능과 품질을 만족시키는지 검토하고, 오류나 결함이 있는지 탐지하는 활동" 이다. 즉, 사용자의 기대와 실제 구현된 시스템이 일치하는지 확인하는 검증 활동이라고 할 수 있으며, 테스팅을 통해서 시스템의 품질을 평가하고 운영 중 오류 가능성을 줄이는 역할을 한다.

테스팅은 아래와 같이 크게 두 가지 방법론으로 나눌 수 있다.

1. 정적 테스트

  • 소프트웨어을 실행하지 않고 결함을 찾아내는 테스트 방법론이다.
  • 프로그램 실행 과정이 없기 때문에 문서 검토, 자동화 도구 사용 등으로 테스트를 진행한다.
  • 예시로는 전문가들의 코드 리뷰, 정적 분석 도구 (SonarQube, Checkstyle) 사용 등이 있다.
  • 초기 단계에서 결함을 발견할 수 있기 때문에 비용과 시간을 절약할 수 있으며 프로그램 실행 없이 수행되므로, 실행 환경에 영향이 적다는 장점이 있다. 하지만 실행 환경에서의 동작을 반영하거나 결함의 심각도를 파악하는 것이 어렵다는 단점이 있다.

2. 동적 테스트

  • 실제로 소프트웨어를 실행하며 동작을 확인하는 테스트 방법론이다.
  • 다양한 테스트 기법을 통한 디버깅 과정을 통해서 결함을 파악하고 수정하는 과정을 진행한다.
  • 정적 테스팅에 비해 초기 단계에서 결함을 발견하기 어렵고 테스트 케이스 작성 및 실행에 많은 시간과 노력이 필요하지만 그만큼 실제 동작환경에 기반하여 정확한 오류나 성능 문제를 찾을수 있다는 장점이 있다.
  • 주요 테스트 기법으로는 화이트박스 테스트 (White-box Testing), 블랙박스 테스트 (Black-box Testing), 단위 테스트 (Unit Testing), 통합 테스트 (Integration Testing)등이 있다.

✅ Testing의 7가지 원리

1. 테스팅은 결함의 존재를 밝히는 활동이다
테스팅은 소프트웨어에 결함이 있음을 보여주는 활동이지, 결함이 없음을 증명할 수는 없다는 의미이다. 완벽하게 결함이 없는 소프트웨어는 존재하지 않기 때문에 테스트를 통과했다고 해서 “문제없다”고 단정지을 수는 없다. 테스트는 어디까지나 "이 상황에서는 오류가 보이지 않았다"는 증거만 제공할 뿐이다. 따라서 테스트의 목표를 "이 시스템에 문제가 없다"가 아니라 "이 시스템에서 문제가 어디에 있는지를 찾는 것"이라는 관점을 유지하는 것이 좋다.

2. 완벽한 테스팅은 불가능하다
모든 입력 조합과 모든 조건을 다 테스트하는 것이 가장 완벽한 테스트 방법이라 할 수 있지만 이 방법이 현실적으로 불가능하다는 의미다. 어떤 소프트웨어를 테스트 할 때, 가능한 입력 경우의 수를 조합해보면 조건에 따라 그 수가 기하급수적으로 늘어난다. 이 모든 케이스를 다 검증하는 데에는 시간, 인력, 비용이 감당되지 않기 때문에 모든 경우의 수를 입력해봄으로써 테스트를 진행하는 것은 불가능하다. 따라서 리스크 기반 테스트(Risk-Based Testing), 경계값 분석(BVA), 동등분할(EP) 같은 전략으로 테스트 범위를 줄이고 효과적으로 커버리지를 확보해야 한다.

3. 조기 테스팅은 시간과 비용을 절약한다
테스트는 가능한 한 빨리 시작해야 하며, 개발의 초기 단계에서 발견된 결함일수록 수정 비용이 적다는 의미이다. 시간이 지날수록 하나의 결함이 전체 시스템에 미치는 영향은 커지고, 수정에 필요한 시간과 비용도 증가한다. 이는 "Shift Left Testing" 개념으로도 연결된다. 예를 들어서 잘못된 요구사항을 요구사항 분석 단계에서 잡으면 문서만 수정하면 되지만, 개발 이후에 발견하면 전체 구조를 바꿔야 할 수도 있다. 따라서 요구사항 리뷰, 설계 리뷰, 코드 리뷰 같은 정적 테스팅 활동을 개발 초기에 적극적으로 도입하는 것이 중요하다.

4. 결함은 집중되어 나타난다
결함은 소프트웨어 전체에 균일하게 퍼져 있는 것이 아니라, 특정 모듈이나 영역에 집중적으로 존재하는 경우가 많다는 의미이다. 이는 파레토 법칙(80:20 법칙)과 연관되어 설명할 수 있는데, 이는 전체 코드 중 20%가 전체 결함의 80%를 유발하는 경향이 있다는 법칙이다. 따라서 과거 이력 분석(결함 빈도, 변경 이력)을 통해 결함이 집중된 영역에 더 많은 테스트 자원을 배분하는 전략이 필요하다.

5. 살충제 패러독스(Pesticide Paradox)를 피하라
동일한 테스트 케이스를 반복해서 실행하면, 더 이상 새로운 결함을 찾을 수 없게 된다는 의미이다. 농약을 계속 뿌리면 해충이 내성이 생기는 것처럼, 같은 테스트만 반복하면 이미 검증된 영역만 확인할 뿐 새로운 문제가 드러나지 않는다. 즉 테스트 케이스는 주기적으로 리뷰 및 갱신해야 하며, 새로운 경로, 예외적인 조합, 조건을 추가하는 것이 중요하다.

6. 테스팅은 정황(Context)에 따라 달라진다
모든 소프트웨어에 동일한 테스트 전략이나 기준을 적용할 수 없으며 소프트웨어의 특성과 목적, 도메인에 따라 테스트 기법은 달라져야 한다는 의미이다. 예를 들어 게임, 금융 시스템, 의료기기, 인공지능 소프트웨어 등과 같은 다른 분야의 개발은 각기 다른 요구사항과 규제가 존재하며, 이에 따라 테스트 방식도 달라진다.

7. 오류 부재의 궤변(Absence-of-errors fallacy)
결함이 없다고 해서, 시스템이 사용자에게 유용하거나 적절하다는 것을 의미하지 않는다는 의미이다. 명세대로 정확하게 구현된 시스템이라 하더라도, 요구사항 자체가 잘못되었거나 사용자의 기대와 어긋나 있다면, 그 소프트웨어는 실패한 것이다. 따라서 요구사항 자체의 적절성 검토도 테스팅의 일부로 간주해야 하며, 사용자 중심 테스트(User Acceptance Testing)나 유스케이스 기반 테스트가 중요해진다. 즉, 올바른 요구사항인지, 사용자 가치가 반영되었는지도 반드시 확인해야 한다.

✅ Test 프로세스

소프트웨어 테스트는 단순히 기능을 확인하는 활동이 아니라, 전반적인 품질을 확보하고 리스크를 줄이기 위한 체계적인 절차이다. 테스트 프로세스는 아래와 같은 일련의 활동으로 구성되어 있으며, 각각은 상호 연관되어 반복적으로 수행될 수 있다.

먼저, 테스트 계획(Test Planning) 단계에서는 전체 테스트의 방향을 정의한다. 이 단계에서는 테스트의 목적, 범위, 전략, 리스크, 일정, 자원 분배, 종료 기준 등을 설정하고, 테스트가 조직 내 품질 목표와 어떻게 연관되는지를 명확히 한다. 잘 수립된 계획은 이후 테스트 활동의 기준점이 되며, 실행 중 의사결정의 근거가 된다.

이후 진행되는 테스트 모니터링과 제어(Test Monitoring and Control) 단계는 테스트가 계획대로 진행되고 있는지를 지속적으로 확인하고, 필요한 경우 조치를 취하는 활동이다. 실제 진행 상황을 메트릭과 지표를 통해 추적하며, 일정 지연이나 결함 발생률 증가 등 예기치 못한 상황에 대해 테스트 범위, 우선순위, 자원 배치 등을 조정하는 제어 활동이 수반된다.

다음으로는 테스트 분석(Test Analysis) 이 진행된다. 이 단계에서는 “무엇을 테스트할 것인가?”를 명확히 하기 위해 요구사항, 설계 문서, 유스케이스 등을 분석하고, 테스트 대상에서 추출된 테스트 조건을 식별한다. 분석된 정보는 테스트 설계의 기초가 되며, 특히 결함 발생 가능성이 높은 영역을 식별하는 데 중요한 역할을 한다.

분석을 마친 후에는 테스트 설계(Test Design) 가 이어진다. 설계 단계에서는 테스트 조건을 바탕으로 구체적인 테스트 케이스와 테스트 시나리오를 작성하며, 입력값과 기대 결과를 명확히 정의한다. 테스트 케이스는 커버리지와 재사용성, 유지보수성까지 고려해 설계되어야 하며, 이와 함께 필요한 테스트 데이터, 환경 설정도 병행된다.

그 다음은 테스트 구현(Test Implementation) 단계이다. 이 단계에서는 설계된 테스트 케이스를 실제 실행 가능한 형태로 구현하고 정리한다. 테스트 스위트와 테스트 프로시저를 구성하며, 수동 테스트일 경우 실행 절차를 문서화하고, 자동화 테스트일 경우 스크립트를 작성하여 테스트 환경을 완비한다. 이 과정은 테스트 실행 단계의 품질과 효율성에 직결된다.

준비가 완료되면 테스트 실행(Test Execution) 단계로 넘어간다. 이 단계에서는 테스트 케이스를 실행하고, 실제 결과를 기대 결과와 비교하여 일치 여부를 판단한다. 테스트 중 발견된 결함은 즉시 리포트되며, 테스트 로그와 증거를 체계적으로 기록해야 한다. 실행은 반복적으로 수행될 수 있으며, 회귀 테스트나 확인 테스트도 이 단계에 포함된다.

마지막 단계는 테스트 완료(Test Completion) 이다. 테스트 활동을 공식적으로 종료하고, 결과를 정리하여 테스트 요약 보고서를 작성한다. 테스트 과정에서 수집한 메트릭, 결함 정보, 학습 내용 등을 기반으로 회고를 진행하며, 향후 테스트 프로세스 개선을 위한 액션 아이템을 도출한다. 또한 테스트 자산(케이스, 로그, 환경 정보 등)을 정리·보관하여 다음 프로젝트나 반복 주기에 활용할 수 있도록 한다.

이처럼 테스트 프로세스는 처음부터 끝까지 단계적으로 연결되어 있으며, 각 활동은 서로 영향을 주고받는다. 현실에서는 각 단계가 선형적으로만 진행되지 않고, 테스트 실행 도중 분석 단계로 돌아가거나 계획을 수정하는 일이 빈번하다. 따라서 테스트 프로세스는 반복적이고 유연하게 적용되어야 하며, 전체적인 흐름 속에서 품질 향상이라는 궁극적인 목적을 중심으로 설계되어야 한다.

✅ Testing의 심리학

소프트웨어 테스팅은 기술적 활동인 동시에 인간의 인지와 사고방식이 깊게 작용하는 심리적 활동이기도 하다. 개발자와 테스터는 같은 제품을 바라보더라도 목표, 관점, 접근 방식이 다르며, 이러한 차이에서 비롯되는 심리적 요인은 테스트의 품질, 협업 효율성, 결함 탐지 능력에 중요한 영향을 미친다. 테스팅의 심리학은 단지 감정 관리나 커뮤니케이션의 문제가 아니라, 테스트 전략 자체에도 영향을 주는 핵심 요소이다.

1. 인간의 심리와 테스트 인식

테스트 결과를 해석하고 받아들이는 데에는 확증 편향(Confirmation Bias), 인지 편향(Cognitive Bias) 같은 심리적 특성이 크게 작용한다. 확증 편향이란, 사람이 자신의 신념이나 기대에 맞는 정보만을 수용하고, 그렇지 않은 정보는 무시하거나 과소평가하는 경향을 말한다. 이는 개발자가 자신의 코드에 결함이 없다고 믿는 상태에서 테스트 결과를 부정하거나 무시하는 현상으로 나타날 수 있다.

예를 들어, 어떤 기능을 개발한 후 테스트에서 오류가 발생하면, 개발자는 "테스트가 잘못되었을 것이다", "환경 문제가 아닐까?"라고 생각하기 쉽다. 이는 단순한 자기방어가 아니라 인간의 본능적인 사고 패턴이다. 이러한 심리를 이해하지 못하면 테스트 결과를 객관적으로 받아들이는 데 장애가 발생하고, 결함 수정이 지연되며 품질 개선이 어려워질 수 있다.

2. 테스터와 개발자의 사고방식 차이

테스터와 개발자는 같은 제품을 다루지만 역할과 목적이 다르기 때문에 사고방식에도 근본적인 차이가 있다. 테스터의 관점에서 테스트의 주요 목표는 시스템의 결함을 발견하고 품질을 확보하는 것, 즉 제품에 대해 항상 ‘어디서 실패할 수 있을까?’ 를 고민하는 반면, 개발자는 시스템을 동작하게 만드는 것, 즉 ‘어떻게 하면 원하는 결과를 잘 낼 수 있을까?’ 를 고민한다. 이 두 관점이 다르기 때문에 사고하는 방향과 테스트를 대하는 태도도 다르게 나타나지만 이 두 관점은 모두 중요하며, 상호 보완적으로 작용해야 제품의 완성도가 높아진다.

3. 심리적 갈등과 협업의 어려움

개발자와 테스터 간에는 종종 심리적인 갈등이 발생한다. 테스터가 발견한 결함에 대해 개발자가 방어적인 태도를 보이거나, 테스터가 코드에 대한 깊은 이해 없이 과도한 문제 제기를 할 경우 협업이 악화될 수 있다. 이런 상황은 잘못 관리되면 품질 이슈보다는 감정의 대립으로 인해 프로젝트 전체에 악영향을 미칠 수 있다. 이런 문제를 방지하기 위해서는 상호 존중과 명확한 역할 이해, 그리고 건설적인 커뮤니케이션이 필요하다. 테스트는 개발자의 실패를 찾는 것이 아니라, 고객의 요구에 부합하는 소프트웨어를 함께 만들어가는 협업의 과정임을 팀 전체가 인식해야 한다.

4. 긍정적 심리 기반의 테스트 문화

테스팅을 둘러싼 심리적 장벽을 극복하기 위해서는 다음과 같은 긍정적인 테스팅 문화가 필요하다

  • 결함은 비난의 대상이 아니라, 개선의 기회로 인식해야 한다.
    : 누구나 실수를 할 수 있으며, 중요한 것은 얼마나 빠르게 인식하고 수정하는지이다.
  • 테스트 결과를 감정이 아닌 사실로 다뤄야 한다.
    : 테스트 실패는 개발자 개인의 능력 문제가 아닌 시스템 관점에서의 품질 신호로 이해해야 한다.
  • 테스터는 협력자이며 품질의 공동 책임자이다.
    : 테스터는 개발을 방해하는 사람이 아니라, 고객의 기대를 현실로 만드는 품질의 수호자이다.
  • 회고(Retrospective)와 피드백 문화를 장려해야 한다.
    : 프로젝트 종료 시 결함 발생 원인, 커뮤니케이션 이슈, 심리적 불협화음 등을 정리하고 개선 방안을 논의하는 문화가 필요하다.

테스팅의 심리학은 단순히 사람 간의 감정 문제가 아니라, 테스트 효과성과 품질 확보 능력에 직접적인 영향을 주는 요소이다! 테스터와 개발자는 서로 다른 역할을 수행하지만,고품질의 소프트웨어를 만든다는 공통의 목표를 가지고 서로의 관점을 이해하며 협업 중심의 품질 문화를 만들어나가는 것이 무엇보다 중요하다!!

profile
돈 많은 백수가 되고 싶어요오

0개의 댓글