2023.02.21

김근호·2023년 2월 20일
1

Spring

목록 보기
7/9

버그

  • “소프트웨어가 예상하지 못한 결과를 내는 것”
  • '소스 코드'나 '설계과정에서의 오류' 때문에 발생

Test 방법

1. 블랙박스 테스팅

  • 블랙박스 테스팅이란 소프트웨어 내부 구조나 동작원리를 모르는 블랙박스와 같은 상태에서, 즉 웹 서비스의 사용자 입장에서 동작을 검사하는 방법입니다!
  1. 장점
    • 누구나 테스트가 가능합니다 - 개발자부터 디자이너, 베타 테스터 혹은 사장님까지!
  2. 단점
    • 기능이 증가될 수록 테스트의 범위가 증가합니다.
      • 시간이 갈수록 테스트하는 사람이 계속 늘어나야함
    • 테스트 하는 사람에 따라 테스트 퀄러티가 다를 수 있습니다. → QA 직군이 있는 이유

2. 개발자 테스트

  • 개발자가 직접 "본인이 작성한 코드"를 검증하기 위해 "테스트 코드"를 작성합니다.
  1. 장점
    • 빠르고 정확한 테스트가 가능합니다. (예상 동작 VS 실제 동작)
    • 테스트 자동화가 가능합니다.
      • 배포 절차 시 테스트 코드가 수행되어 동작 검증
    • 리팩토링이나 기능 추가를 할 때 더욱 편리합니다.
  2. 단점
    • 개발 시간이 오래 걸림
    • 테스트 코드를 유지보수하는 비용

단위 테스트

  • 프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해준다.

  1. Development: 개발
  2. Unit Tests (단위 테스트): 개발자 테스트
  3. QA Testing:
    • 블랙박스 테스팅
    • 주로 QA 팀이 Production 환경과 유사한 환경(Stage)에서 테스팅
  4. Production: 실 서비스 운영 환경

TDD

Test-Driven Development의 약자로
테스트 코드를 먼저 작성하고 실제 동작하는 코드를 개발하는 순서로 개발하는 개발 방법론입니다
찬반의 의견이 아직도 많긴 하지만, 좋은점만 취할 수 있다면, 테스트코드를 먼저 작성하는 개발은 적어도 위와 같은 싸이클에서는 매우 효율적일 수 있습니다

  • 설계 → 개발 → 테스트 에서
  • 설계 → 테스트 → 개발 순서로!

Given - When - Then Pattern

테스트 코드를 작성하는 가장 대표적인 방법론입니다.
사실 이부분도 논란의 여지가 있습니다만, 그래도 개인적으로 가장쉽게 시작할만한 방법이라 추천드리기 쉬운 것 같습니다.
Given - 준비
When - 실행
Then - 검증

이렇게 단계별로 테스트코드를 나누어서, 매우 직관적으로 작성 할 수 있습니다.

테스트 파일 생성

  1. 테스트를 하고 싶은 파일내에서 우클릭
  2. "Generate..." 클릭
  3. Test..." 클릭
  4. 기본세팅 그대로 OK 눌러서 생성

어노테이션 및 assert함수들

@Test : 하나의 Test케이스를 나타내는 어노테이션
assertNull 함수 : 주어진 인자가 null이어야 테스트를 통과시켜주는 함수
assertEquals 함수 : 주어진 인자 두개가 같아야 테스트를 통과시켜주는 함수
assertThrows 함수 : 주어진 인자와 같은 예외가 발생했는지 확인해서 같아야 통과시켜주는 함수

Mock

  • Test시 실제 객체를 만들기엔 비용과 시간이 많이 들거나 의존성이 길게 걸쳐져 있어 제대로 구현하기 어려울 경우, 가짜 객체를 만들어 사용하는데 이것을 Mock이라 합니다.

Mock객체가 필요한 경우

  • 테스트 작성을 위한 환경 구축이 어려운 경우
  • 환경 구축을 위한 작업 시간이 많이 필요할 때 Mock객체를 사용합니다.
    (ex.데이터베이스, 웹서버, FTP서버 등)
  • 아직 개발되지 않은 모듈을 사용하는 테스트가 필요할 때 사용합니다.
  • 테스트가 특정 경우나 순간에 의존적인 경우
  • 테스트 시간이 오래 걸리는 경우

Mockito mock

  • mock을 쉽게 만들고 mock의 행동을 정하는 stubbing, 정상적으로 작동하는지에 대한 verify 등 다양한 기능을 제공해주는 프레임워크입니다.
  • 사용법
  1. gradle dependencies에 추가
testImplementation 'org.mockito:mockito-core:4.8.0'
testImplementation 'org.mockito:mockito-junit-jupiter:4.8.0'
  1. 아래 코드를 보시면
  • @Mock 어노테이션으로 모킹할 객체를 표기해줍니다.
  • @InjectMock 어노테이션으로 모킹한 객체를 주입해주는 코드입니다. 이제 서비스에 있는 리포지토리는 가짜 객체가 들어가게 됩니다.
  • when() 메서드를 통해 모킹한 객체들이 특정 조건으로 특정 메서드를 호출하면 일괄적으로 다음과 같이 동작하도록 지정해줍니다.
  • 결과적으로 respository에서 난 오류가 아니라는것을 장담할 수 있습니다.


profile
앞만 보고 나아가자!

0개의 댓글