테스트 코드/JUnit: 21개의 글
이번 포스팅에서 다루어볼 예제는 JUnit 3단계 준비,실행,단언 단계중 "단언"의 몇 가지 예제를 다루어볼 것이다. JUnit에 내장된 단언 이외에 햄크레스트(Hamcrest) 라이브러리를 활용한 단언 몇가지도 다루어볼 것이다. JUnit Assert JUnit에서 assert는 테스트에 넣을 수 있는 정적 메서드 호출이다. 각 Assert 구문은 어떤 조건이 참인지 검증하는 방법이다. 단언한 조건이 참이 아니면 테스트는 그 자리에서 멈추고 실패한다. JUnit은 크게 두 가지 Assert 스타일을 제공한다. 전통적인 스타일의 Assert는 JUnit의 원래 버전에 포함되어 있으며, 새롭고 좀 더 표현력이 좋은 햄크레스트라고 알려진 Assert 구문도 있다. 두 가지 Assert 스타일은 각자 다른 환..
단위 테스트를 작성하는데 있어서 FIRST 속성을 지킨다면 더 좋은 단위테스트를 작성할 수 있다. 그렇다면 FIRST 속성이란 무엇일까? Fast : 빠른 Isolated : 고립된 Repeatable : 반복 가능한 Self-validating : 스스로 검증 가능한 Timely : 적시의 일반적인 단위 테스트를 작성하던 TDD 개발 방법론을 이용하던 FIRST 원리를 고수하면 더 나은 테스트 코드를 작성하는 데 도움이 된다. 1)Fast : 빠르게 테스트 코드를 느린 로직에 의존하지 않고 테스트를 빠르게 유지한다. 조금더 클린한 객체지향 설계에 맞춰 애플리케이션이 설계된다면 조금더 나은 테스트 코드를 작성하기 좋아진다. public class StatCompiler { static Question q..
이번 포스팅에서 다루어볼 내용은 테스트 코드를 잘 조직하고 구조화 할 수 있는 JUnit 기능을 살펴볼 것이다. 포스팅에서 다룰 내용은 아래와 같다. 준비-실행-단언을 사용하여 테스트를 가시적이고 일관성 있게 만드는 방법 메서드를 테스트하는 것이 아니라 동작을 테스트하여 테스트 코드의 유지 보수성을 높이는 방법 테스트 이름의 중요성 @Before와 @After 애너테이션을 활용하여 공통 초기화 및 정리 코드를 설정하는 방법 거슬리는 테스트를 안전하게 무시하는 방법 AAA로 테스트 일관성 유지 준비(Arrange) : 테스트 코드를 실행하기 전에 시스템이 적절한 상태에 있는지 확인한다. 객체들을 생성하거나 이것과 의사소통하거나 다른 API를 호출하는 것 등이다. 드물지만 시스템이 우리가 필요한 상태로 있다..
Test Code Test Method 명명 방식 1. Test 대상 method와 이름을 1:1로 매치 - getName()-> test_getName() 2. 1:1로 매치 후 메소드명에 예상 동작 표현 - getName() -> test_getName_isSuccess() 3. 테스트 시나리오에 맞게 정하기 접근 방식 1. 시나리오식 접근 방법 1)Happy Day 시나리오 - 정상적인 흐름일 때, 동작해야 하는 결과값 선정 2)Blue Day 시나리오 - 예외나 에러 상황에 대한 결과값 선정 2. 삼각측량법 - 곱하기 메소드의 경우 (a*b)와 같은지, a를 b번 더한 것과 같은지 확인하는 방법 3. Edge Case - 경계 조건의 값들로 테스트하는 방법 Mock Mock 객체 - 모듈의 겉모양..
11. ArgumentCaptor 보통 verify시 아규먼트 값을 직접 지정하지만 ArgumentCaptor를 사용하면 capture를 통해 유연하게 아규먼트 값을 넘길 수 있습니다. @Test void capture() throws Exception{ // stubbing final List mockedList = mock(List.class); when(mockedList.get(1)).thenReturn("A"); when(mockedList.get(2)).thenReturn("B"); when(mockedList.get(3)).thenReturn("C"); // 1. ArgumentCaptor integerArgumentCaptor = ArgumentCaptor.forClass(Integer.c..
Mockito란? Mockito는 Mock Object를 creation, verification, stubbing 해주는 JAVA에서 사용되는 라이브러리입니다. Mock Object 객체 지향 프로그래밍으로 개발한 프로그램을 테스트할 때 테스트를 수행할 모듈과 연결되는 외부의 다른 모듈을 흉내 내는 가짜 모듈을 생성하여 테스트의 효용성을 높이는 데 사용하는 객체입니다. 의존성 추가 plugins { id 'java' } repositories { mavenCentral() } dependencies { testImplementation('org.junit.jupiter:junit-jupiter:5.6.0') testImplementation('org.assertj:assertj-core:3.11.1')..
@BeforeClass, @AfterClass ,@Before,@After 순서 알아보기 Junit에 @BeforeClass, @AfterClass ,@Before,@After 어노테이션이 있습니다. 이전 이후..? 뭐지 어떻게 호출되는건지 알아보도록 하겠습니다. Example class BeforeAfterTest { @Before @Throws(Exception::class) fun setUp() { println("@Before") } @After @Throws(Exception::class) fun tearDown() { println("@After") } @Test @Throws(Exception::class) fun testCase1() { println("testCase1") } @Test ..
Maven Dependencies org.junit.jupiter junit-jupiter-params 5.4.2 test testCompile("org.junit.jupiter:junit-jupiter-params:5.4.2") Parameterized Tests@ParameterizedTest이 annotation을 추가하는 것을 제외하고는 다른 테스트와 동일하다.e.g. @ParameterizedTest @ValueSource(ints = {1, 3, 5, -3, 15, Integer.MAX_VALUE}) // six numbers void isOdd_ShouldReturnTrueForOddNumbers(int number) { assertTrue(Numbers.isOdd(number)); } 6번..
혹시 테스트 코드를 작성할 때 아래와 같은 중복되는 코드를 작성하고 계신가요?@Test @DisplayName("User 생성 name 2자 미만 예외처리") void createUserException01() { IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> new User(VALID_EMAIL, "q", password)); assertThat(e.getMessage()).isEqualTo(NAME_NOT_MATCH_MESSAGE); } @Test @DisplayName("User 생성 name 10자 초과 예외처리") void createUserException02() { IllegalArgumentEx..
Repository Test스프링 테스트하기 위해 @RunWith로 SpringJUnit4ClassRunner를 사용해 spring-test를 확장한다.@SpringApplicationConfiguration은 스프링을 사용하기 위해 설정한 설정 클래스를 지정하는 것인데, github에 소스를 보면 알겠지만 spring-boot를 사용했기 때문에 class(javaConfig)를 설정한 것이다. xml로 설정해도 마찬가지로 @SpringApplicationConfiguration을 사용한다.?1234567891011121314151617181920@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = {SpringJ..