책너두 (코딩 인터뷰 완전분석) 30일차 (~231p)

11. 테스팅

  • 테스팅과 관련된 질문들은 보통 다음 네 가지 범주 중 하나에 속함.
    1. 실생활에서 접하는 객체를 테스트하라
    2. 소프트웨어 하나를 테스트하라.
    3. 주어진 함수에 대한 테스트 코드를 작성하라.
    4. 발생한 이슈에 대한 해결책을 찾아내라.
  • 입력 형식이 깔끔하다거나, 사용자가 예측 가능한 행동만 할 것이라고 가정하면 안됨.
    • 아주 이상한 방식으로 시스템이 사용될 수 있으니 그에 대비해야 함.

면접관이 평가하는 것

  • 큰 그림을 이해하고 있는가
    • 테스트케이스 간의 우선순위를 적절히 매길 수 있는가?
  • 퍼즐 조각을 제대로 맞추는 방법을 아는가
    • 소프트웨어가 어떻게 동작하는지 아는가
    • 각 소프트웨어가 보다 더 큰 생태계의 일부로 어떻게 귀속되는지 이해하는가
  • 조직화
    • 문제에 구조적으로 접근하고 있는가
      • 시스템을 구조적으로 잘 나누면 테스트 케이스를 보다 풍부하게 찾아 나갈 수 있다.
  • 실용성
    • 실제로 적용 가능한 합리적인 테스트 계획을 세울 수 있는가

실제 세계에서 객체 테스트하기

1단계 : 사용자는 누구인가? 클립의 사용 목적은 무엇인가?

  • 문제를 풀기 전에 해당 제품을 어떤 사용자가 어떤 목적으로 사용하게 될지 면접관과 의논해 봐야 함.

2단계 : 어떤 유스케이스(use case)가 있나?

  • 유스케이스 목록을 만들어 두면 도움이 될 것임.

3단계 : 한계 조건은?

  • ex) 클립의 경우, 영구적 손상 없이 30~50장 정도는 약간 손상이 있다
  • 환경적 요인들에도 적용될 수 있음.

4단계 : 스트레스 조건과 장애 조건은?

  • 장애가 발생하는 조건을 분석해야 함.
    • 면접관과 이야기해 봐야 하는 것은 제품에 발생한 문제를 받아들일 수 있는 때는 언제인지, 어떤 종류이ㅡ 문제를 심각하게 간주해야 하는지이다.

5단계 : 테스트는 어떻게 수행할 것인가?

  • 테스트와 관련된 세부사항을 이야기 하는 것임.
  • 어떤 것을 사용한다고 했을 때, ‘정상적인 사용’이 어떤 의미인지 정의해야 함.
  • 수작업 테스트 외에, 자동화된 테스트를 도입하는 것도 고려해야 함.

소프트웨어 테스팅

  • 하나의 소프트웨어를 테스트하는 것은 실제 세계의 객체를 테스트하는 것과 아주 유사함.
  • 소프트웨어의 경우, 성능 테스트의 세부사항을 더 많이 강조함.
  • 소프트웨어 테스팅의 두 가지 핵심적 측면은 다음과 같음.
    1. 수작업 테스트 vs. 자동화된 테스트
    2. 블랙박스 테스트 vs. 화이트박스 테스트

1단계 : 블랙박스 테스트를 하고 있는가 아니면 화이트박스 테스트를 하고 있는가?

  • 필자는 가능한 이런 질문은 일찍 던지는 쪽을 선호함.
    • 블랙박스 테스트를 해야 하는지, 화이트박스 테스트를 해야하는지, 아니면 둘 다 해야 하는지 확인하라.

2단계 : 누가 사용할 것인가? 왜 사용하는가?

  • 소프트웨어는 보통 여러 명의 사용자를 대상으로 함.
    • 그 기능 또한 이 점을 염두에 두고 설계됨.

3단계 : 어떤 유스케이스들이 있나?

  • 유스케이스를 ‘마술적으로’ 생각해 내야 하는 것이 아니라 면접관과 상의하여 도출해 내야 함.

4단계 : 한계 조건은?

  • 유스케이스가 모호하게 정의되어 있다면, 그게 무엇을 의미하는지 정확히 알아낼 필요가 있음.

5단계 : 스트레스 조건과 장애 조건은?

  • 소프트웨어에 장애가 발생할 때, 그 장애가 어떤 모습인지 알아야 함.

6단계 : 테스트 케이스는? 테스트 실행은 어떻게?

  • 수작업 테스트와 자동화 테스트가 구별되는 지점임.

함수 테스트

  • 가장 쉬운 종류의 테스트임.
  • 입력과 출력을 확인하는 테스트만 하면 되기에, 모호한 부분이 적음.
    • 그렇지만 대화의 중요성을 간과해서는 안됨.

1단계 : 테스트 케이스 정의

  • 아래의 테스트 케이스를 생각해 봐야 함.
    • 정상적인 케이스
    • 극단적인 케이스
    • 널(null) 입력, 잘못된(illegal) 입력
    • 특수한 입력

2단계 : 예상되는 결과를 정의하라

  • 예상되는 결과는 대체로 올바른 출력 결과를 말함.

3단계 : 테스트 코드를 작성하라.

  • 테스트 케이스를 만들고 결과를 정의했다면 테스트 케이스를 코드 형태로 구현하는 것은 간단함.

문제 해결에 관한 문제

  • 이미 있는 장애를 어떻게 디버깅하고 해결할 것인가에 대한 문제도 출제됨.
  • 개발자가 해야할 일은 진짜 문제가 무엇인지 알아내어 해결할 수 있도록 돕는 것임.

1단계 : 시나리오를 이해하라.

  • 상황을 가능한 정확하게 이해할 수 있도록 많은 질문을 던져라.
    • 사용자가 얼마나 오랫동안 이 문제를 겪었는가?
    • 브라우저 버전은? 운영체제 버전은?
    • 문제가 항상 똑같이 발생하는지, 발생 빈도는 얼마나 되는지, 언제 그런 일이 발생하는지
    • 오류가 발생할 때, 오류 보고서가 표시되는가?

2단계 : 문제를 쪼개라

  • 시나리오를 구체적으로 이해했으면, 문제를 테스트 가능한 단위로 분할할 수 있음.
    • 흐름으로 상황이 전개되는 것을 볼 수 있음.

3단계 : 구체적이고 관리 가능한 테스트들을 생성하라.

댓글

Designed by JB FACTORY