더 쉬운 테스트 코드 작성을 위한 Live Template을 공유해봅니다 😃
지루한 작업을 덜 지루하게
선배 기수 분들께서 작성해주신 귀한 테코블 포스팅을 볼 때마다 놀라는 것은
기술적 내용을 다루는 포스팅은 모두 테스트 코드로 귀결된다는 점입니다.
정말 개발자로서 본받아야 할 자세라고 생각합니다.
개발자로서 떳떳한 건 아니지만 솔직히 그렇습니다.
정말 테스트 코드 중요한데. 정말 귀찮습니다.
소프트웨어 장인이란 정말 그 귀찮은 것, 지루한 것을 이겨내고
묵묵히 소프트웨어 품질을 위해 나의 작품이라는 혼을 담아 코드를 작성하는 것도 포함되는 것 같습니다.
하지만 개발자라면 동시에 중복을 참을 수는 없죠!
귀찮은 일의 반복도 그렇습니다.
최대한 테스트 코드 작성이 어렵거나 귀찮지 않게 느껴지도록 만들어야 합니다.
이를 위해서 제가 사용하는 IDE의 자동완성 기능을 공유해봅니다.
Live Template
Preferences -> Editor -> Live Templates -> Java 메뉴로 진입합니다.
아마 다들 sout은 이미 잘 사용하고 계실 텐데요,
이처럼 축약어를 입력하면 약속된 템플릿을 입력되게 해주는 것이 Live Templates 설정입니다.
아래에 소개해드리는 내용들을 이 설정에 들어가서 사용하시면 됩니다.
그럼 이제부터 테스트 코드를 쉽게 작성하기 위한 템플릿들을 하나씩 살펴보시죠!
단위테스트를 위한 기본 Test 템플릿
test 를 입력하면 기본 테스트 코드 형식이 나타나고 커서가 given 바로 아래에 위치하게 설정했습니다.
설정 방법은 Live Templates 메뉴에서 우측의 +를 누른뒤, Abbreviation과 Description을 입력하신 후,
아래에 Template text를 입력하고, 그 아래 Change 를 눌러 어느 언어에서 사용할지 선택하면 됩니다.
추가로 우측의 Reformat according to Style과 Use static import if possible을 저는 체크하고 사용하는 편입니다.
제가 사용하는 포맷은 아래와 같습니다. $END$ 는 해당 템플릿이 입력된 후 커서의 위치를 지정하는 것입니다.
@DisplayName("sample test")
@Test
void testMethodNameHere() {
// given
$END$
// when
// then
assertThat(actual).isEqualTo(expected);
}
given-when-then, assertThat, assertAll
given when then - given
// given
// when
// then
assertThat - assert
assertThat(actual$END$).isEqualTo(expected);
assertAll - asserta
assertAll(
() -> assertThat(actual$END$).isEqualTo(expected),
() -> assertThat(actual).isEqualTo(expected)
);
Parameterized Test, MethodSource, DynamicTest
이 테스트들은 직접 작성하려면 귀찮기도 하고 문법을 외우기도 귀찮은 편입니다.
특히 MethodSource와 DynamicTest는 정말 외워지지도 않고 손도 잘 안 가지더라고요.
템플릿을 만들어두고 사용하다보니 이제 훨씬 손이 잘 가고 수월해졌습니다.
$END$ 와 유사한 문법 형태를 이용해서 메서드 이름 등을 템플릿 생성 즉시 수정할 수 있게
커서를 설정할 수도 있는데요, 처음엔 이 방법을 사용해보다가 시간이 갈수록 불편하게 느껴져서
템플릿 생성 시점에 어떠한 추가적인 작업을 하지 않아도 되게 모두 최소화하는 식으로 변경했습니다.
ParameterizedTest - ptest
@ParameterizedTest(name = " : {0}")
@CsvSource(value = {"", ""})
@DisplayName("sampleTest")
void parameterizedTest() {
// given
$END$
// when
// then
assertThat(actual).isEqualTo(expected);
}
MethodSource - methodsource
@ParameterizedTest(name = " : {0}")
@MethodSource("methodSource")
@DisplayName("sampleTest")
void sampleTest(String s, boolean expected) {
// given
$END$
// when
// then
assertThat(actual).isEqualTo(expected);
}
private static Stream<Arguments> methodSource() {
return Stream.of(
Arguments.of(null, true),
Arguments.of(null, true)
);
}
DynamicTest - dynamicTest
@DisplayName("큰테스트이름")
@TestFactory
Stream<DynamicTest> collectionsOfDynamicTest() {
return Stream.of(
dynamicTest("테스트케이스1", () -> {
// given
$END$
// when
// then
assertThat(actual).isEqualTo(expected);
}),
dynamicTest("테스트케이스2", () -> {
// given
// when
// then
assertThat(actual).isEqualTo(expected);
})
);
}
컨트롤러에 대한 슬라이스 테스트를 위해 mockMvc를 앞으로도 쓰게 될 것 같은데요,
이 부분에 대해선 아직 조금 더 패턴을 두고보다가 템플릿을 만들어봐야할 것 같습니다.
'IDE' 카테고리의 다른 글
Java 코드에서 정규식 검사하기, 쿼리 즉시 날려보기 (IntelliJ) (2) | 2022.06.10 |
---|---|
사용되지 않는 코드 탐색 및 제거하기 (IntelliJ,Inspect Code) (2) | 2022.03.18 |
이클립스 버전별 JDK 버전 최소요구치 및 JVM 설정 (0) | 2021.07.25 |
VS Code 마우스 휠로 폰트 사이즈 조절하기 (0) | 2021.05.19 |
아무 폴더에서 우클릭하여 인텔리제이 프로젝트로 열기 (2) | 2021.04.14 |