- “소프트웨어가 예상하지 못한 결과를 내는 것”
- '소스 코드'나 '설계과정에서의 오류' 때문에 발생
- 블랙박스 테스팅이란 소프트웨어 내부 구조나 동작원리를 모르는 블랙박스와 같은 상태에서, 즉 웹 서비스의 사용자 입장에서 동작을 검사하는 방법입니다!
- 장점
- 누구나 테스트가 가능합니다 - 개발자부터 디자이너, 베타 테스터 혹은 사장님까지!
- 단점
- 기능이 증가될 수록 테스트의 범위가 증가합니다.
- 시간이 갈수록 테스트하는 사람이 계속 늘어나야함
- 테스트 하는 사람에 따라 테스트 퀄러티가 다를 수 있습니다. → QA 직군이 있는 이유
- 개발자가 직접 "본인이 작성한 코드"를 검증하기 위해 "테스트 코드"를 작성합니다.
- 장점
- 빠르고 정확한 테스트가 가능합니다. (예상 동작 VS 실제 동작)
- 테스트 자동화가 가능합니다.
- 배포 절차 시 테스트 코드가 수행되어 동작 검증
- 리팩토링이나 기능 추가를 할 때 더욱 편리합니다.
- 단점
- 개발 시간이 오래 걸림
- 테스트 코드를 유지보수하는 비용
- 프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해준다.
- Development: 개발
- Unit Tests (단위 테스트): 개발자 테스트
- QA Testing:
- 블랙박스 테스팅
- 주로 QA 팀이 Production 환경과 유사한 환경(Stage)에서 테스팅
- Production: 실 서비스 운영 환경
Test-Driven Development의 약자로
테스트 코드를 먼저 작성하고 실제 동작하는 코드를 개발하는 순서로 개발하는 개발 방법론입니다
찬반의 의견이 아직도 많긴 하지만, 좋은점만 취할 수 있다면, 테스트코드를 먼저 작성하는 개발은 적어도 위와 같은 싸이클에서는 매우 효율적일 수 있습니다
- 설계 → 개발 → 테스트 에서
- 설계 → 테스트 → 개발 순서로!
Given - When - Then Pattern
테스트 코드를 작성하는 가장 대표적인 방법론입니다.
사실 이부분도 논란의 여지가 있습니다만, 그래도 개인적으로 가장쉽게 시작할만한 방법이라 추천드리기 쉬운 것 같습니다.
Given - 준비
When - 실행
Then - 검증
이렇게 단계별로 테스트코드를 나누어서, 매우 직관적으로 작성 할 수 있습니다.
- 테스트를 하고 싶은 파일내에서 우클릭
- "Generate..." 클릭
- Test..." 클릭
- 기본세팅 그대로 OK 눌러서 생성
@Test : 하나의 Test케이스를 나타내는 어노테이션
assertNull 함수 : 주어진 인자가 null이어야 테스트를 통과시켜주는 함수
assertEquals 함수 : 주어진 인자 두개가 같아야 테스트를 통과시켜주는 함수
assertThrows 함수 : 주어진 인자와 같은 예외가 발생했는지 확인해서 같아야 통과시켜주는 함수
- Test시 실제 객체를 만들기엔 비용과 시간이 많이 들거나 의존성이 길게 걸쳐져 있어 제대로 구현하기 어려울 경우, 가짜 객체를 만들어 사용하는데 이것을 Mock이라 합니다.
- 테스트 작성을 위한 환경 구축이 어려운 경우
- 환경 구축을 위한 작업 시간이 많이 필요할 때 Mock객체를 사용합니다.
(ex.데이터베이스, 웹서버, FTP서버 등)- 아직 개발되지 않은 모듈을 사용하는 테스트가 필요할 때 사용합니다.
- 테스트가 특정 경우나 순간에 의존적인 경우
- 테스트 시간이 오래 걸리는 경우
- mock을 쉽게 만들고 mock의 행동을 정하는 stubbing, 정상적으로 작동하는지에 대한 verify 등 다양한 기능을 제공해주는 프레임워크입니다.
- 사용법
- gradle dependencies에 추가
testImplementation 'org.mockito:mockito-core:4.8.0' testImplementation 'org.mockito:mockito-junit-jupiter:4.8.0'
- 아래 코드를 보시면
- @Mock 어노테이션으로 모킹할 객체를 표기해줍니다.
- @InjectMock 어노테이션으로 모킹한 객체를 주입해주는 코드입니다. 이제 서비스에 있는 리포지토리는 가짜 객체가 들어가게 됩니다.
- when() 메서드를 통해 모킹한 객체들이 특정 조건으로 특정 메서드를 호출하면 일괄적으로 다음과 같이 동작하도록 지정해줍니다.
- 결과적으로 respository에서 난 오류가 아니라는것을 장담할 수 있습니다.