티스토리 뷰

728x90

 

 

 

 

보통 프로젝트를 진행할 때 콘솔에 값을 출력할 일은 거의 없지만,

우테코 프리코스를 진행하면서 콘솔창에 출력된 값을 테스트할 일이 생겼다.

우테코에서 미리 구현한 NsTest를 활용해 테스트했지만, 어떻게 돌아가는지 궁금해서 코드를 뜯어봤다.

사실 System.out, OutputStream 등등은 다 java.io 라이브러리이기 때문에, 문법만 코틀린이고 관련 내용은 자바다..

 

 

 

먼저 printWinners()라는 함수는 게임 우승자를 출력하는 함수라고 가정하자.

이 함수를 테스트하기 위해 필요한 given-when-then은 다음과 같다.

 

given: pobi, woni가 담겨있는 winners 리스트

when: printWinners() 호출

then: "최종 우승자 : pobi, woni" 라는 문자열이 콘솔에 출력

 

    @Test
    fun `최종 우승자를 출력한다`() {
        // given
        val case = listOf(Car.of("pobi"), Car.of("woni")

        // when
        printWinners(case)

        // then
        assertThat(콘솔의 출력값).isEqualTo("최종 우승자 : pobi, woni")
    }

이걸 테스트 코드로 나타내면 위와 같다.

콘솔의 출력값을 확인하기 위한 코드를 구현해보자.

 

 

 

val outputStream = ByteArrayOutputStream()
System.setOut(PrintStream(outputStream))

콘솔창에 출력된 값을 확인하기 위해서는 ByteArrayOutputStream을 사용한다.

테스트할 출력 함수를 실행하기 전에, System.out의 기본값을 내가 사용하고 싶은 stream으로 변경해준다.

 

그 후 print()로 어떤 값을 출력하면, 그 출력값이 내가 지정해준 ByteArrayOutputStream에 저장된다.

 

 

 

fun output() = outputStream.toString().trim()

ByteArrayOutputStream에 저장된 값을 확인하기 위한 함수를 생성했다.

toString()으로 출력값을 String으로 변경하고, trim()으로 불필요한 공백/들여쓰기를 제거한다.

 

 

 

System.setOut(System.out)
print(output())

출력값을 확인했다면 변경한 System.out의 값을 다시 원래대로 되돌린다.

print(output())을 통해 ByteArrayOutputStream에 저장된 출력값을 다시 기본값에 출력한다.

 

 

만약 하나의 테스트 클래스 안에 출력 함수를 여러개 테스트해야 한다면,

ByteArrayOutputStream의 값에 출력값이 누적되어 테스트하기 어려울 수 있다.

이를 방지하기 위해 새로운 테스트 함수를 시작하거나 끝날 때마다 위와 같은 작업을 반복한다.

@BeforeEach, @AfterEach를 사용한다!

 

 

 

전체 코드

class NsTest {
    private lateinit var outputStream: OutputStream

    @BeforeEach
    fun init() {
        outputStream = ByteArrayOutputStream()
        System.setOut(PrintStream(outputStream))
    }

    @AfterEach
    fun printOutput() {
        System.setOut(System.out)
        println(output())
    }

    fun output(): String {
        return outputStream.toString().trim()
    }

    @Test
    fun `최종 우승자를 출력한다`() {
        // given
        val case = listOf(Car.of("pobi"))

        // when
        printWinners(case)

        // then
        assertThat(output()).isEqualTo("최종 우승자 : pobi")
    }
}

 

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함