tools & libs/단위테스트(junit, spock)
-
가짜 객체를 이용한 테스팅 프로젝트를 진행하다 보면 진짜 객체를 사용하지 못하거나 사용하지 말아야 할 경우가 왕왕 발생한다. Service가 Repository를 호출하는 구조의 애플리케이션에서 Service를 테스트한다고 생각해보자. 만약 Service는 만들어졌는데 Repository는 아직 개발 중인 상황이라면 Repository가 개발이 완료될 때까지 Service에 대한 테스트를 미뤄야 할까? 또는 Service에서 Repository를 호출하는 과정에서 오류가 발생했다면 누구의 문제일까? 이처럼 Service의 동작이 Repository에 영향을 받는 게 맞을까? 이런 경우 Repository는 차라리 없다고 생각하고 가짜를 사용하는것이 유리하다. JUnit은 이런 상황에서 Mockito fr..
[junit] jupiter 4. 가짜 객체를 활용한 테스트가짜 객체를 이용한 테스팅 프로젝트를 진행하다 보면 진짜 객체를 사용하지 못하거나 사용하지 말아야 할 경우가 왕왕 발생한다. Service가 Repository를 호출하는 구조의 애플리케이션에서 Service를 테스트한다고 생각해보자. 만약 Service는 만들어졌는데 Repository는 아직 개발 중인 상황이라면 Repository가 개발이 완료될 때까지 Service에 대한 테스트를 미뤄야 할까? 또는 Service에서 Repository를 호출하는 과정에서 오류가 발생했다면 누구의 문제일까? 이처럼 Service의 동작이 Repository에 영향을 받는 게 맞을까? 이런 경우 Repository는 차라리 없다고 생각하고 가짜를 사용하는것이 유리하다. JUnit은 이런 상황에서 Mockito fr..
2023.11.23 -
이제 단정문까지 학습했으므로 쓸만한 테스트를 만들어보자. 이번 포스트에서는 given-when-then 패턴을 이용한 간단한 단위 테스트를 실행해 본다. given-when-then 패턴 흔히 사용되는 단위테스트 패턴으로 행동 주도 개발(Behavior Driven Development: BDD)이 있는데 여기서는 테스트 코드 작성 단계를 given - when - then 패턴으로 작성하기를 권장한다. given: 테스트를 위해 필요한 상황 준비(이런 상황, 객체, 데이터가 주어졌을 때) when: 테스트하는 메서드 실행(어떤 메서드를 실행했다면) then: 테스트 결과 검증(어떠한 결과가 나와야 한다.) JUnit은 애초에 BDD를 위해 만들어진 녀석은 아니기 때문에 이 패턴이 강제되는 내용은 아니다..
[junit] jupiter 3. 단위테스트 작성 기법이제 단정문까지 학습했으므로 쓸만한 테스트를 만들어보자. 이번 포스트에서는 given-when-then 패턴을 이용한 간단한 단위 테스트를 실행해 본다. given-when-then 패턴 흔히 사용되는 단위테스트 패턴으로 행동 주도 개발(Behavior Driven Development: BDD)이 있는데 여기서는 테스트 코드 작성 단계를 given - when - then 패턴으로 작성하기를 권장한다. given: 테스트를 위해 필요한 상황 준비(이런 상황, 객체, 데이터가 주어졌을 때) when: 테스트하는 메서드 실행(어떤 메서드를 실행했다면) then: 테스트 결과 검증(어떠한 결과가 나와야 한다.) JUnit은 애초에 BDD를 위해 만들어진 녀석은 아니기 때문에 이 패턴이 강제되는 내용은 아니다..
2023.11.23 -
단위테스트의 목적이 "동작 결과가 내가 예상하는 값과 동일한가?"를 테스트하는 것이기 때문에 assertion 즉 단정문을 통한 결과 검증은 필수적인 항목이다. junit 5에서는 org.junit.jupiter.api.Assertions 클래스에 다양한 assertion 메서드들을 static 하게 준비해 두었다. 다음 클래스의 메서드가 잘 동작하는지 테스트해보자. class Calculator { public int add(int a, int b) { return a + b; } public int divide(int a, int b) { return a / b; } } 일반적인 assertion standard assertion 대부분의 assertion 메서드들은 긍정과 부정이 쌍으로 존재한다. ..
[junit] jupiter 2. assertion단위테스트의 목적이 "동작 결과가 내가 예상하는 값과 동일한가?"를 테스트하는 것이기 때문에 assertion 즉 단정문을 통한 결과 검증은 필수적인 항목이다. junit 5에서는 org.junit.jupiter.api.Assertions 클래스에 다양한 assertion 메서드들을 static 하게 준비해 두었다. 다음 클래스의 메서드가 잘 동작하는지 테스트해보자. class Calculator { public int add(int a, int b) { return a + b; } public int divide(int a, int b) { return a / b; } } 일반적인 assertion standard assertion 대부분의 assertion 메서드들은 긍정과 부정이 쌍으로 존재한다. ..
2023.11.23 -
이번 포스트에서는 단위테스트 자동화를 위한 junit에 대해서 살펴보자. JUnit 5 User Guide JUnit 5 User Guide Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus junit.org 테스트 자동화와 JUnit 테스트와 자동화 필요성 테스트의 중요성은 프로그래밍 분야에서 언제나..
[junit] jupiter 1. 기본 설정 및 활용이번 포스트에서는 단위테스트 자동화를 위한 junit에 대해서 살펴보자. JUnit 5 User Guide JUnit 5 User Guide Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus junit.org 테스트 자동화와 JUnit 테스트와 자동화 필요성 테스트의 중요성은 프로그래밍 분야에서 언제나..
2023.11.23 -
이번 포스트에서는 mockito-inline을 이용해서 LocalDateTime.now() 같은 static method를 mocking 해보자. mockito-inline을 이용한 static method mocking mockito-inline 정확하지는 않지만 몇 년 전에 시간 기반의 테스트를 해야했는데 아주 고생한 기억이 있다. 기본적으로 시간을 테스트하려면 LocalDateTime.now() 같은 메서드를 mock 해야 하는데 mockito는 static 메서드를 지원하지 않았다. 그러다 간만에 찾아보니 mockito-inline이라는 라이브러리에서 static method에 대한 mocking이 지원되는 것을 발견했다. 유레카!! org.mockito mockito-inline 5.2.0 te..
[junit] static method mocking이번 포스트에서는 mockito-inline을 이용해서 LocalDateTime.now() 같은 static method를 mocking 해보자. mockito-inline을 이용한 static method mocking mockito-inline 정확하지는 않지만 몇 년 전에 시간 기반의 테스트를 해야했는데 아주 고생한 기억이 있다. 기본적으로 시간을 테스트하려면 LocalDateTime.now() 같은 메서드를 mock 해야 하는데 mockito는 static 메서드를 지원하지 않았다. 그러다 간만에 찾아보니 mockito-inline이라는 라이브러리에서 static method에 대한 mocking이 지원되는 것을 발견했다. 유레카!! org.mockito mockito-inline 5.2.0 te..
2023.10.19 -
Mock Mock이란? Mock은 Stub과 마찬가지로 테스트 과정에서 사용되는 가상의 객체이다. Mock은 메서드에서 수신하는 호출을 등록해서 실제 호출이 잘 되었는지 확인하는 용도로 사용된다. 위와 같은 상황에서 service의 save가 호출되면 repo의 save가 호출되고 repo는 insert query를 수행해서 DB에 반영한다. public class ScoreServiceImpl { . . . public void save(String name, int score) { repo.save(name, score); printScore(name); } public void printScore(String name) { System.out.println(name + "의 점수는 " + repo...
[spock]가짜 객체를 이용한 테스팅 - 2Mock Mock이란? Mock은 Stub과 마찬가지로 테스트 과정에서 사용되는 가상의 객체이다. Mock은 메서드에서 수신하는 호출을 등록해서 실제 호출이 잘 되었는지 확인하는 용도로 사용된다. 위와 같은 상황에서 service의 save가 호출되면 repo의 save가 호출되고 repo는 insert query를 수행해서 DB에 반영한다. public class ScoreServiceImpl { . . . public void save(String name, int score) { repo.save(name, score); printScore(name); } public void printScore(String name) { System.out.println(name + "의 점수는 " + repo...
2021.02.16 -
가짜 객체를 이용한 테스팅 프로젝트를 진행하다 보면 여러 가지 이유로 진짜 객체를 사용하지 못할 경우가 왕왕 발생한다. 예를 들어 웹페이지가 잘 동작하는지 알려면 HttpServletRequest를 날려야 하는데 서버까지 연동돼야 해서 쉽지 않다. DB 자료를 저장해야 하는데 테스트를 위해 DB까지 동작시키는게 곤란하거나 아직 has a 관계의 객체가 만들어지지 않은 상태에서 테스트 해야하는 등 상황은 매우 다양하다. 이런 상황에서의 테스트를 위해 Stub, Mock, Spy 와 같은 가짜 객체들이 사용된다. 테스트 상황 우리는 학생의 점수를 등록하고 조회하는 시스템을 구축중이다. 이 시스템은 ScoreServiceImpl이 Has a 관계로 ScoreRepository를 사용한다. 문제는 ScoreRe..
[spock]가짜 객체를 이용한 테스팅 - 1가짜 객체를 이용한 테스팅 프로젝트를 진행하다 보면 여러 가지 이유로 진짜 객체를 사용하지 못할 경우가 왕왕 발생한다. 예를 들어 웹페이지가 잘 동작하는지 알려면 HttpServletRequest를 날려야 하는데 서버까지 연동돼야 해서 쉽지 않다. DB 자료를 저장해야 하는데 테스트를 위해 DB까지 동작시키는게 곤란하거나 아직 has a 관계의 객체가 만들어지지 않은 상태에서 테스트 해야하는 등 상황은 매우 다양하다. 이런 상황에서의 테스트를 위해 Stub, Mock, Spy 와 같은 가짜 객체들이 사용된다. 테스트 상황 우리는 학생의 점수를 등록하고 조회하는 시스템을 구축중이다. 이 시스템은 ScoreServiceImpl이 Has a 관계로 ScoreRepository를 사용한다. 문제는 ScoreRe..
2021.02.15 -
spock의 블록 Spock은 블록을 통해서 할 일들을 정리한다. 기본 블록은 아래와 같다. given / setup 테스트에 필요한 객체나 환경을 준비하는 블록으로 반드시 다른 블록들 보다 먼저 있어야 한다. 키워드 자체는 생략가능하다. when 테스트 하고 싶은 상황을 만드는 영역으로 코드를 실행하는 영역이다. then 테스트 결과를 검증하는 블록으로 여기에 작성된 코드 한줄 한줄이 모두 assert에 해당하는 문장이다. expect when과 then이 합쳐진 형태로 작은 테스트 작성 시 유용하다. cleanup 필요 시 setup의 자원을 정리한다. where 일부 데이터만 바꿔가면서 여러 번 테스틀 할 수 있게 도와주는 영역이다. given / when / then given / when / t..
[spock]기본 사용법spock의 블록 Spock은 블록을 통해서 할 일들을 정리한다. 기본 블록은 아래와 같다. given / setup 테스트에 필요한 객체나 환경을 준비하는 블록으로 반드시 다른 블록들 보다 먼저 있어야 한다. 키워드 자체는 생략가능하다. when 테스트 하고 싶은 상황을 만드는 영역으로 코드를 실행하는 영역이다. then 테스트 결과를 검증하는 블록으로 여기에 작성된 코드 한줄 한줄이 모두 assert에 해당하는 문장이다. expect when과 then이 합쳐진 형태로 작은 테스트 작성 시 유용하다. cleanup 필요 시 setup의 자원을 정리한다. where 일부 데이터만 바꿔가면서 여러 번 테스틀 할 수 있게 도와주는 영역이다. given / when / then given / when / t..
2021.02.10