테스팅 기법

신용의·2022년 8월 8일
0

개발노트

목록 보기
2/3

Q. 현재 백엔드에서 가장 일반적으로 사용되는 테스팅 기법은 어떤게 있으며, 가장 효과적인 테스팅 방법은 무엇인가요?

1. 테스팅 기법

테스팅의 기법을 알기 전에 테스팅이 무엇이고 테스팅을 왜 하는지를 아는 것이 선행 되어야 한다.

전형적인 웹앱의 형태는 세 가지 계층으로 구성되어 있다.

  1. 프런트엔드 UI (presentation layer)
  2. Business Layer (API)
  3. Database Layer

👉 이 중 2번과 3번인 비즈니스 계층과 데이터 베이스 계층이 백엔드 영역에 있고, 이 두가지 영역에 대한 테스팅을 진행하는 것이 백엔드의 테스팅이라고 할 수 있다.

👌즉, 작성한 코드들이 멀쩡하게 잘 작동을 하는지 혹은 데이터 관리가 의도대로 잘 이루어지는지를 확인하는 과정이다.

➕ 프런트엔드 같은 경우 화면이 제대로 나오는지, user가 특정 작업을 수행할때 기대하는 동작을 하는지 등을 테스트 하는 것


백엔드 테스팅을 하는 이유?

테스팅을 진행하면 투입 시간과 비용이 증가함에도 불구하고 테스팅을 하는 이유는 무엇일까?

  1. 사전에 버그나 에러를 감지하는 것이 가장 효율적 (추후에 발견되는 것보다)
  2. Deadlock (교착상태) 혹은 데이터의 손실을 예방
  3. 시스템의 안정성 확보
  4. 데이터 관리의 품질을 높여 성능을 개선

이번 5주차에서 테스트 자동화에 대해서 다루고 있음

테스트 기법:

  1. 단위 테스트 (Unit Test)
  2. 통합 테스트 (Integration Test)
  3. E2E 테스트 (End to End Test)

💡단위 테스트가 가장 일반적으로 사용되고 있으며 복잡도가 가장 낮다.
E2E 테스트는 반대로 가장 복잡하고 빈도가 가장 적다.

단위 테스트 (Unit Test):

가장 작은 규모의 기능을 테스트합니다.

독립적인 하나의 클래스 (Class)나 함수 (function)을 테스팅하는 것이다. 독립적이기 때문에 테스팅시 예상치 못한 부작용들로부터 비교적 자유롭다.

테스트 대상:
const greeting = (firstName, lastName) => {
 return `Hello Mr./Mrs. ${firstName} ${lastName}`
}

테스트 방법:

test('should output firstName and lastName', () => {
 const text = greeting('Moataz', 'Mahmoud')
 expect(text).toBe('Hello Mr./Mrs. Moataz Mahmoud')
})

테스트 예시:
const greeting = (firstName, lastName) => {
 return `Hello Mr./Mrs. ${firstName} ${firstName}`
}

> 선언한 greeting 함수가 올바르게 작동을 하는지 확인
테스트 예시 같은 경우 뒤에 ${firstName}이 붙기 때문에 예상 결과와 달라지는 것을 확인

통합 테스트 (Integration Test)

여러가지 기능을 합쳤을때 생기는 문제를 방지하기 위한 테스트입니다.

단위 테스트에 비해 복잡성이 올라간 이유는, 단위 테스트는 독립적인 코드를 테스팅하는 것에 반해 통합 테스트는 코드 블럭의 상호 의존성이 존재하는 상태에서 원하는 결과를 도출하는지를 확인하기 때문. 각 코드들이 개별적으로 잘 작동하는 것이 꼭, 같이 사용되었을 때 잘 작동하는 것은 아님

쉽게 말해: 모듈 간의 상호작용이 정상적으로 수행되는가를 확인

테스트 대상:
exports.checkBeforeGreeting = (firstName, lastName) => {
  if (validateInput(firstName, false) || validateInput(lastName, false)) {
    return false
  }
  return greetThem(firstName, lastName)
}

테스트 코드: 
test('should generate a valid text output', () => {
  const text = checkBeforeGreeting('Moataz', 'Mahmoud')
  expect(text).toBe('Hello Mr./Mrs. Moataz Mahmoud')
})

테스트 예시:
if (validateInput(firstName, false) && validateInput(lastName, false))

> 독립적으로 문제가 없더라도 if문에서 || 대신 &&를 기입하는 실수를 통해 작동하지 않는 것을 확인

E2E 테스트 (End to End Test):

끝에서 끝(종단 간)을 의미하는 End to end 테스트입니다.
쉽게 말하면 백엔드부터 시작해서 최종적으로 웹 페이지가 원하는대로 동작하며 원하는 데이터를 잘 보여주는지 확인합니다.

위의 두 테스트인 단위 테스트와 통합 테스트는 백엔드의 API들만 확인하는 작업이기 때문에 자바스크립트 런타임만 있으면 가능하지만, E2E 테스트는 백부터 프런트를 확인하기 때문에 실제로 실행할 브라우저와 연결해야한다.

profile
Hasta la vista

0개의 댓글