카테고리 없음

Spring Boot TestWatcher를 이용한 Test Fail Listener 만들기 with Slack URI

돌맹이00 2024. 2. 29. 16:48

서론

테스트 코드 작성은 안정성 있는 소프트웨어를 개발하는 데 매우 중요한 부분이다. 그러나 테스트가 실패할 경우 이를 적시에 파악하고 대응하는 것이 중요하다. 이를 위해 Spring Boot에서는 TestWatcher를 제공하고 있다. 이번 포스팅에서는 TestWatcher를 사용하여 테스트가 실패했을 때 Slack으로 알림을 보내는 방법을 소개 하겠다.


본론

TestWatcher를 상속하여, 테스트가 실패했을 때 Slack으로 알림을 보내는 클래스를 작성

class TestAlramListener : TestWatcher {

    override fun testFailed(context: ExtensionContext?, cause: Throwable?) {
        // 여기에 테스트 실패 시 실행할 동작을 작성합니다.
        val message = "${context?.testMethod?.get()?.name} : Failed"
        sendSlackNotification(message)
    }

    internal fun sendSlackNotification(message: String) {
        val slackWebhookUrl = "https://hooks.slack.com/services/test123456789"
        val restTemplate = RestTemplate()
        val headers = HttpHeaders().apply {
            contentType = MediaType.APPLICATION_JSON
        }
        val payload = mapOf(
            "text" to message,
        )
        val requestEntity = RequestEntity.post(URI.create(slackWebhookUrl))
            .headers(headers)
            .body(payload)

        try {
            val responseEntity: ResponseEntity<String> = restTemplate.exchange(requestEntity, String::class.java)
            if (responseEntity.statusCode.is2xxSuccessful) {
                println("Message sent successfully.")
            } else {
                println("Failed to send message")
            }
        } catch (e: Exception) {
            println("Error sending message: ${e.message}")
        }
    }
}

테스트 적용

@ExtendWith(TestAlramListener::class)
@SpringBootTest
class MyApplicationTests {

    @Test
    fun `testFailure`() {
        // 테스트를 실패하도록 구현합니다.
        assertEquals(1, 2)
    }

    @Test
    fun `testSuccess`() {
        // 성공하는 테스트를 작성합니다.
        assertEquals(1, 1)
    }
}

위와 같이 TestAlramListener를 @ExtendWith를 통해 테스트 클래스에 적용하면 해당 테스트 클래스에 있는 테스트 메서드가 실패할 때마다 Slack으로 알림을 받을 수 있다.


결론

이번 포스팅에서는 Spring Boot TestWatcher를 사용하여 테스트가 실패했을 때 Slack으로 알림을 보내는 방법을 소개하였다. 개발자는 테스트 코드의 실패를 신속하게 파악하여 적절한 대응을 할 수 있게 된다. 또한, 효과적인 테스트 알림은 소프트웨어의 안정성과 신뢰성을 향상시키는 데 중요한 역할을 한다. 물론 CI에서 test가 돌긴 하지만, 나의 경우에는 end to end test를 위해 사용하고 있다.