본문 바로가기
TIL : Today I learned (or Week)

TIL 230803 : Test하며 자잘한 깨달음 몇 개

by 우인입니다 2023. 8. 3.

Assert (test코드상 말고 쓰는 경우는 무엇?)

 

save메소드 보다가 Assert를 발견했다.

테스트 코드상에서 쓰는 건 알았지만 이렇게 보니 어떻게 쓰는지 낯설었다.

 

자바에서 쓰여있는 설명으로는 코드를 런타임단계에서 미리 발견해주는데 쓰는 느낌이다.

위와 같은 경우에도 entity가 null일 경우에 메시지를 띄우게 되어있나보다.

notNull이라는 것은 null이 오지 않는것이 일반적으로 기대된 입력값이라는 의도인듯 하다.

 

해당 정적 메소드를 들어가보니 Illegal예외를 발생시켜주는 간단한 메소드였다.

 

 

+ 테스트 코드에서 쓰던 assert~는 유닛테스트 프레임워크 JUnit의 기능이다. 그저 단어가 비슷할 뿐

기능도 유사하긴 하다.

 


테스트 어노테이션들 깔끔하게 정리하기.tip

 

// @RepositoryTest.java

@DataJpaTest(excludeAutoConfiguration = {DataSourceAutoConfiguration.class, TestEntityManagerAutoConfiguration.class, DataSourceConfiguration.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import({ContainerDataSourceConfiguration.class, JpaConfiguration.class, QueryDslConfiguration.class})
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RepositoryTest {
}

 

위처럼 어노테이션 인터페이스를 따로 만들어 두면 편하게 한번에 적용시킬 수 있다.

 

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

 : Test용 DB를 만들지 않게 해주는 기능

 

@DataJpaTest(excludeAutoConfiguration = ... )

 : DB설정해주는 configuration들을 막아준다. 아래 @Import에서 가져온 설정을 따르기 위함.

 

@Import({ ... } )

 : 직접 가져오고 싶은 Configuration 클래스들 명시.

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)

 : 어노테이션으로 사용하기 위한 기본적인 어노테이션

 

 

그러고 RepositoryTest가 필요한 곳에 저렇게 어노테이션을 달아주면 편리하게 쓸 수 있는 (현업에서도 쓸 수 있는) 팁이다.

 

 

 


FixturyMonkey

네이버에서 만든 테스트 생성객체를 자동으로 생성해주는 라이브러리이다.

아직은 필드가 몇 개 없어서 굳이라는 생각이 들 수도 있지만 현업에서는 수십개의 필드를 일일이 다 지정해주며 테스트코드를 작성할 수 있는데, 이 때 유용하다고 한다. 한번쯤 도전해 볼 법하다.

# build.gradle
testImplementation 'com.navercorp.fixturemonkey:fixture-monkey:0.4.9'
testImplementation 'com.navercorp.fixturemonkey:fixture-monkey-javax-validation:0.4.9'
// UserFixture.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserFixture {
	private Long userId;
	@NotNull
	private UserType type;
	@NotNull
	private UserStatus status;

	public User toEntity() {
		return User.builder()
			.userId(userId)
			.type(type)
			.status(status)
			.build();
	}
}
var fixturemonkey = FixtureMonkey
		.labMonkeyBuilder()
		.objectIntrospector(BeanArbitraryIntrospector.INSTANCE)
		.plugin(new JavaxValidationPlugin())
		.build();

var user = fixturemonkey.giveMeBuilder(UserFixture.class)
			.set("userId", FixtureMonkeyUtils.getUserId())
			.build()
			.sample()
			.toEntity();

 

 


너무 세세한 메소드나 구현된 클래스 하나하나 짚느라 진도가 조금 안 나갔다.
페이스 조절을 위해, 멀리 가기 위해 가끔은 덮어두고 나아가는 방향도 가져봐야겠다.
내일은 오늘 깊게 체크해둔 것들을 토대로 테스트 코드에 대해서 연습해보는 것을 목표로 한다.