개발공부/테스트 주도 개발(9)
-
회사 테스트 코드 도입기
회사에 테스트 코드가 있지만, 프로젝트를 진행하면서 작성하지 않고 있어 새로운 프로젝트를 들어가며 이번엔 테스트 코드를 작성하기로 팀원과 결정했습니다. 도입에 앞서 고민했던 점들과 어떻게 도입했는지를 한번 정리해봤습니다. 테스트 코드를 적용해야 하는 이유 코드에 신뢰성이 생긴다. 리팩토링이 쉬워진다. 테스트 코드를 적용하기 위한 준비 테스트 단위 테스트를 어떤 범위까지 진행할지 선택. 예를 들어 단위 테스트, 통합 테스트, end-to-end(e2e) 테스트 테스트 방법론 의존성이 걸린 클래스일 때 mock을 적극적으로 사용할지, 실제 인스턴스를 활용할지 선택한 방법 mock은 비즈니스 로직 검증이 어려워, 회귀 방지가 낮다고 생각했습니다. 따라서 mock보다 실질적인 인스턴스 테스트를 진행하기로 했습니..
2023.04.27 -
[junit] junit 테스트 때 주의사항(나만 그런가요?)
junit 테스트 때 주의사항(나만 그런가요?) 회사에서 websocket 방식으로 redis에 데이터를 업데이트 해주는 서버와 본 서비스 서버 두 가지를 맡아 개발하다보니 트랜잭션을 지원하지 않는 redis repository와 RDBMS MariaDB 간의 테스트 방식에 따른 혼란(aka 삽질)이 발생했습니다. (경험치 +30, 시간 -30) 나쁘지 않은 것일수도... 사담은 이만하고 RDBMS + @DataJpaTest + Springboot + build 환경별 profile이 다른 프로젝트에서 junit 단위 테스트할 때 주의사항에 대해 알아보겠습니다. 1) @ActiveProfile production, stage, local 등 build 환경설정이 다를 경우 application.yaml ..
2021.09.03 -
[넥스트스텝] 반복문 내 객체생성은 성능을 저하시킬까?
반복문 내 객체생성은 성능을 저하시킬까? 리뷰어 분이 반복문 내에서 객체가 초기화 되는 부분을 리펙토링 해보라고 피드백 주셨습니다. 다른 부분을 리펙토링 할때도 객체 초기화는 반복문 내에서 하면 안된다는 제약이 생겨 불편해지기 시작했습니다. 예를 들어 Car Names를 List로 받아서 Car 객체를 createCar을 이용해 초기화 해줘야 할 때 반복문 안에 객체 초기화도 같이 들어가야 합니다. public static Cars createCars(String[] carNames, List cars) { for (String carName : carNames) { cars.add(Car.createCar(carName, new ArrayList())); return new Cars(cars); } 그..
2021.09.02 -
[넥스트스텝] TDD 리팩토링 연습과정
TDD 리팩토링 연습과정 오늘의 핵심: 다른건 몰라도 볼링 1단계는 꼭 해보기 레거시 코드는 대부분 레이어드 아키텍처 입니다. OOP 다음으로 DDD를 경험해봤으면 좋겠다는 자바지기의 말씀. 그리고 요즘 MSA가 대세인데, 도메인 주도 개발을 모르고서 MSA를 도입한다는 건 순서가 맞지 않다고 하셨습니다. 그만큼 도메인에서 비즈니스 로직을 처리하는 개발 방식이 테스트 지향, 객체 지향적이기 때문에 서비스 아키텍처 이전에 알아야할 방식이라고 강조하신 것 같습니다. 비즈니스 로직은 도메인 레이어에 구현해야 합니다. 왜냐면 도메인 주도 개발은 객체 지향적이기 때문입니다. 반대로 서비스 레이어는 절차 지향적일 가능성이 높습니다. getter도 써야하기 때문입니다. 볼링 1단계 미션은 아래와 같습니다. 소프트 d..
2021.09.02 -
(6) 1부 화폐예제 - 11,12장 드디어, 더하기
Github 코드보기 11장 모든 악의 근원 하위 클래스 기능을 모두 상위 클래스로 이관해줍니다. 과정에서 코드 의미를 변경하지 않고 하위 클래스에 대한 참조를 상위 클래스에 대한 참조로 변경할 수 있습니다. Money.franc() 변경 12장 드디어, 더하기 서로 다른 통화를 더하는 기능 테스트를 위해 Money 객체와 외부 프로토콜은 같으면서 내부 구조는 두 Money의 합을 나타내는 새로운 객체(imposter)를 만들고자 합니다. Expression은 연산의 결과, Bank는 환율을 적용해 단일통화로 축약하는 객체입니다. 인터페이스가 더 가볍기 때문에 Expression은 인터페이스로 생성해줬습니다. 1 2 3 4 5 6 7 8 @Test public void testSimpleAddition(..
2021.04.09 -
(4) 1부 화폐예제 - 7,8장 객체 만들기
Github 코드보기 7장 사과와 오렌지(같지 않은 둘) 동치성 테스트는 클래스 객체 비교를 통해 같지 않은 지까지 확인해야 합니다. - getclass() 를 사용했습니다. 1 2 3 4 5 public boolean equals(Object object) { Money money = (Money) object; return amount == money.amount && getClass().equals(money.getClass()); } Colored by Color Scripter cs equals() 동치성 비교가 객체 인스턴스 파라미터에 다른 값을 넣어도 같다고 떴습니다. - Dollar, Franc 클래스 필드를 없애고 Money것을 사용하게 했습니다. - Dollar, Franc 클래스 생성..
2021.03.30