테스트 (10) 썸네일형 리스트형 [JUnit] 파일 & 리소스 (/src/test/resources) 가져오기 * JUnit5 사용 1. 시나리오 * 테스트 중 파일을 읽거나 테스트 중인 정보를 파일에 써야 할 때가 있음 * 디렉토리의 파일을 읽는 방법이 필요함 2. File I/O 사용 * 가장 간단한 방법은 java.io.File 클래스의 인스턴스의 getAbsolutePath() 메소드를 호출하여 선택한 디렉터리를 읽는 방법 @Test fun useFileIo() { val path: String = "src/test/resources" val file: File = File(path) val absolutePath = file.absolutePath println(absolutePath) assertTrue(absolutePath.endsWith(path)) } * 출력 결과는 아레와 같다. /Users/.. [JUnit] Dynamic Tests * JUnit5 사용 1. Dynamic Test란? * @Test 주석이 달린 표준 테스트는 컴파일 시간에 정의되는 static 한 테스트이다. * Dynamic Test는 런타임 중에 생성되는 테스트 * @TestFactory 주석이 달린 팩토리 메소드에 의해 생성 * 팩토리 메소드는 DynamicTest 인스턴스의 Stream, Collection, Iterator를 반환해야 함 * @BeforeEach / @AfterEach 와 같은 생명주기 관련 어노테이션을 지원하지 않음 2. Dynamic Test 예제 * @TestFactory method는 dynamic test라는 것을 명시해준다. * dynamic test는 컬렉션을 반환함 * 이름, 실행 두 부분으로 나뉨 @TestFactory fu.. [JUnit] JUnit에서 현재 실행 중인 테스트 이름 가지고 오기 * JUnit5 사용 * TestInfo 객체를 테스트에 주입 가능 1. 개별 테스트 @Test fun givenNumbers_whenOddCheck_thenVerify1(testInfo: TestInfo) { println("displayName = " + testInfo.displayName) val number = 5 assertTrue(TestClass().oddCheck(number)) } * 테스트 이름을 표시하기 위해 인터페이스 TestInfo의 displayName 프로퍼티를 사용 displayName = givenNumbers_whenOddCheck_thenVerify1(TestInfo) 2. Parameterized 테스트 var testInfo: TestInfo? = null @Be.. RestClientTest를 알아보자~ RestClientTest 어노테이션은 외부 API를 사용할 때 대상 API를 MOCKING 할 수 있는 유용한 테스트이다. 요청을 받는 쪽이 아닌 요청을 하는 쪽 입장에서의 테스트이다. @RestClientTest를 사용하면 MockRestServiceServer라는 임시 서버를 Bean으로 생성해준다. @SpringBootTest와 달리 지정한 최소한의 Context만 사용해서 테스트를 진행한다. 아래는 기존 Service 코드이다. @Service public class RestClientTestService { private final RestTemplate restTemplate; private final String openApiUrl = "https://httpbin.org/get"; pub.. Controller Test를 해보자~! 1. Controller Test(Web Layer) 1.1 컨텍스트 로드테스트 컨텍스트가 정상적으로 올라오는지 확인하기 위해 추가 @SpringBootTest class TestingWebApplicationTest { @Autowired private HomeController controller; @Test public void contextLoads() { assertThat(controller).isNotNull(); } } 1.2. Controller Test 1.2.1. HttpRequest Test 프로덕션과 마찬가지로 http 요청을 통해 응답을 확인할 수 있음 실제 서버를 구동시키는 것과 유사하게 테스트 동작 @SpringBootTest(webEnvironment = WebEnviron.. [레거시 코드 활용 전략] CH7 코드 하나 바꾸는 데 왜 이리 오래 걸리지? 2020/02/03 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH1 소프트웨어 변경 2020/02/04 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH2 피드백 활용 2020/02/06 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH3 감지와 분리 2020/02/07 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH4 봉합 모델 CH5 는 단순한 테스트 도구와 관련된 이야기라 다루지 않습니다~ 2020/02/10 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH6 고칠 것은 많고 시간은 없고 - 1 2020/02/15 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH6 고칠 것은 많고 시간은 없고 - 2 ch 7 - 코드 .. [레거시 코드 활용 전략] CH4 봉합 모델 2020/02/03 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH1 소프트웨어 변경 2020/02/04 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH2 피드백 활용 2020/02/06 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH3 감지와 분리 ch 4 - 봉합 모델 봉합 단위 테스트를 위해 개별 클래스를 추출하려고 하면 수많은 의존 관계를 제거할 필요가 있다. '좋은' 설계를 기반하고 있다 하더라도 많은 작업이 수반된다. 많은 작업 중 하나인 '봉합'이라는 개념을 알아보자. 우선 봉합은 코드를 직접 편집하지 않고도 프로그램의 동작을 변경할 수 있는 위치를 말한다. 아래 예제를 보자 public class MailSender { public void sen.. [레거시 코드 활용 전략] CH2 피드백 활용 이전글 : 2020/02/03 - [IT/책읽는 개발자] - [레거시 코드 활용 전략] CH1 소프트웨어 변경 ch 2 - 피드백 활용 시스템을 변경하는 방법에는 크게 두가지가 있다. 수정 후 기도하기 보호 후 수정하기 일반적인 개발 방법에서는 1번이 많이 사용된다. 1번 같은 경우 코드 변경 대상 코드를 이해하고, 계획을 세운 후 변경 작업에 들어간다. 변경을 완료하고 나서는 제대로 동작하고, 의도하지 않는 영향이 있는지 조사한다. 결과적으로 작업 결과를 확인하고 검토하는 시간이 추가로 들어가게 된다. 얼핏 보기에는 이는 매우 '신중'하고 '전문'적인 방식처럼 보인다. 그러나 아무리 신중해도 이것이 안전성에 비례한다는 보장은 없다. '보호 후 수정하기' 방법은 조금 다른 방식으로 코드를 변경한다. 변경.. [레거시 코드 활용 전략] CH1 소프트웨어 변경 레거시 코드 활용 전략 (재출간판) 국내도서 저자 : 마이클 C. 페더스(Michael C. Feathers) / 심윤보,이정문역 출판 : 에이콘출판사 2018.09.28 상세보기 ch 1 - 소프트웨어 변경 소프트웨어를 변경하는 이유 새로운 기능 추가 버그 수정 설계 개선 자원 이용의 최적화 1.기능 추가와 버그 수정 지금 하는 것이 버그 수정? or 기능 추가? 고객 관점 : 내가 원하는 건 A 기능이 아니라 B기능 이야 → 버그 수정 개발자 관점 : B라는 새로운 기능 기술 및 개발 관점에서 버그 수정 / 기능 추가 보다 더 중요한 것은 ? → 동작 변경 새로운 동작을 추가하는 것과 기존 동작을 변경하는 것에는 큰 차이가 있음 기존 코드 변경 → 동작 변경 새로운 코드 추가 → 동작 추가 그러나 대.. @Autowired 필드주입 Spring 없이 mock 생성하여 테스트하기 테스트중 아래와 같은 Service 가 있을수 있다. @Service public class AService{ @Autowired BRepository bRepository; @Autowired CRepository cRepository; . . . @Autowired ZRepository zRepository; } 이 경우에 보통 Spring 을 구동하여 mock bean을 등록하여 테스트를 진행한다. 하지만 시간도 오래 걸리고 그렇기 때문에 리플렉션을 통해 mock bean을 생성하여 사용할 수 있다. import static org.mockito.Mockito.*; @Test public void ATest(){ AService aService = new AService(); BRepository .. 이전 1 다음