테스트 코드에 대해서 아는대로 설명하고, 활용경험에 대해
테스트 코드는 소프트웨어의 기능을 검사하고, 결함을 찾아내고 수정하는데 사용됩니다. 테스트 코드는 개발자가 원하는 방식으로 소프트 웨어가 작동하는지 확인합니다.
저는 스프링 부트로 처음 테스트 코드를 처음 작성 했습니다. 제가 사용하던 노트북은 연산 속도가 굉장히 느려 스프링 부트를 모두 실행하는데 있어 평균적으로 12초 정도가 걸렸습니다. 또 테스트를 하기위해 포스트맨을 이용해 요청과 응답을 받았습니다. 이때 모두 생각을 하면 기능을 수정하고 테스트 하는데에만 15초정도를 썼습니다. 하지만 테스트 코드를 작성했을 때, 스프링 부트를 띄우지 않고, 단위테스트를 진행하니 기능이 변경되고, 테스트 하는데 2초가 걸리지 않았습니다. 테스트 코드를 활용해 테스트 시간을 줄일 수 있었습니다.
또 한번은 기존에 있던 메서드를 이용해 새로운 메서드를 구현했습니다. 이 과정에서 기존에 있던 메서드를 조금 수정했습니다. 제 판단에는 그 수정이 기존의 로직을 변경하지 않을 거라 예상했지만, 빌드 전에 전체 테스트 코드를 작동했고, 그 과정에서 기존의 로직에 결함이 있는 것을 발견했습니다. 테스트 코드로 결함을 발견했기 때문에 빠르게 어디서 문제가 생겼는지 알 수 있었고, 수정하는데 시간이 오래 걸리지 않았습니다.
ArrayList는 데이터가 연속된 메모리에 저장됩니다. 연속된 메모리에 저장되어 값을 읽어올 때 처음 0번째 인덱스에서 시작합니다. 그리고 원하는 인덱스만큼 메모리를 곱해서 가져옵니다. 따라서 연산 속도가 굉장히 빠릅니다. 하지만 삭제/삽입 시 시간이 굉장히 오래 걸립니다. 삭제시 삭제된 데이터의 뒤에 있는 모든 데이터를 복사해서 다시 삽입을 해줘야 합니다. 삽입도 마찬가지로 작동해 연산이 굉장히 많이 일어납니다. 따라서 값을 불러올 때, 삭제/삽입이 잘 일어나지 않는 데이터를 관리할 때 사용됩니다.
LinkedList는 데이터를 메모리 노드에 저장합니다. 데이터는 다음 인덱스의 노드 메모리를 알고 있습니다. 따라서 데이터를 불러올 때 처음부터 순차적으로 돌아야 하기 때문에 데이터를 불러오는 시간이 오래 걸립니다. 하지만 데이터 삭제/삽입 시 연결된 노드 메모리만 변경해주면 되기 때문에 연산이 거의 일어나지 않습니다. 따라서 삭제/삽입이 빈번한 데이터를 다룰 때 사용됩니다.
오늘은 테스트 코드를 짜는 날!
Topster Service의 test코드를 짜는 날이다. 처음 TopsterService의 Topster save메서드인 createTopster를 작성하는데 이미 어렵다. 왜냐하면 Topster는 연관관계를 정말 많이 맺고 있다. 그래서 다른 도메인의 service를 많이 가지고 있다. 어찌저찌 경남님 도움을 받아 createTopster를 테스트 한느데 성공했지만 두번째 getTopster에서 막혔다.
void test1(){
//given
Topster topster = Topster.builder().title("탑스터 제목").
user(userA).
content("없어").
build();
ReflectionTestUtils.setField(topster, "id", 1L);
Optional<Topster> optionalTopster = Optional.of(topster);
given(topsterRepository.findById(1L)).willReturn(Optional.of(topster));
given(topsterService.getTopster(1L)).willReturn(topster);
//when
TopsterGetRes topsterGetRes = topsterService.getTopsterService(any());
//then
assertThat(topsterGetRes.getTitle()).isEqualTo(topster.getTitle());
}
이렇게 작성이 됐는
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Topster cannot be returned by findById()
findById() should return Optional
***
If you're unsure why you're getting above error read on.
Due to the nature of the syntax above problem might occur because:
1. This exception *might* occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.
2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies -
- with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.
이런 오류가 났다. findById메서드는 Optional을 반환한다고 하는데, 나는 지금 Optional로 반환한다고 given하지 않았는지... 진짜 모르겠다 ㅠㅠ