[java] TestNG와 Apache Kafka를 활용한 테스트

TestNG와 Apache Kafka를 함께 사용하여 효율적이고 신뢰성 있는 테스트를 수행할 수 있습니다. TestNG는 자바 기반의 테스트 프레임워크로, 테스트를 그룹화하고 여러가지 설정을 통해 테스트의 실행 순서를 제어할 수 있는 기능을 제공합니다. Apache Kafka는 대규모의 실시간 데이터 스트림 처리에 사용되는 분산 메시징 시스템으로, 이벤트 기반 아키텍처를 구현할 때 많이 활용됩니다.

TestNG 설치

TestNG를 설치하기 위해서는 먼저 Maven 또는 Gradle과 같은 빌드 도구를 사용해 프로젝트에 TestNG 종속성을 추가해야 합니다. Maven을 사용한다면 pom.xml 파일에 다음과 같이 TestNG 의존성을 추가할 수 있습니다:

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.3.0</version>
</dependency>

Gradle을 사용한다면 build.gradle 파일에 아래와 같이 의존성을 추가할 수 있습니다:

dependencies {
    testImplementation 'org.testng:testng:7.3.0'
}

의존성을 추가한 후, IDE에서 프로젝트를 새로고침하거나 빌드 도구를 사용해 종속성을 다운로드합니다. 이제 TestNG를 사용할 준비가 되었습니다.

Apache Kafka 설치 및 설정

Apache Kafka를 설치하기 위해서는 공식 웹사이트에서 Kafka 바이너리를 다운로드하고 압축을 해제해야 합니다. 압축을 해제한 후, config/server.properties 파일을 열어 Kafka 브로커의 설정을 구성할 수 있습니다. 예를 들어, 브로커의 포트 번호나 데이터 디렉토리 경로 등을 설정할 수 있습니다.

TestNG와 Apache Kafka 테스트 작성

이제 TestNG와 Apache Kafka를 함께 사용하여 테스트를 작성해보겠습니다. 예를 들어, 카프카에 메시지를 보내는 테스트와 해당 메시지를 받아 처리하는 테스트를 작성해보겠습니다.

import org.testng.Assert;
import org.testng.annotations.Test;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.util.Arrays;
import java.util.Properties;

public class KafkaTest {
    
    @Test
    public void testSendMessage() {
        // Kafka producer 설정
        Properties producerProps = new Properties();
        producerProps.setProperty("bootstrap.servers", "localhost:9092");
        producerProps.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        producerProps.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> producer = new KafkaProducer<>(producerProps);
        String topic = "test_topic";
        String message = "Hello Kafka!";
        
        // 메시지 전송
        ProducerRecord<String, String> record = new ProducerRecord<>(topic, message);
        producer.send(record);
        
        producer.close();
        
        // Kafka consumer 설정
        Properties consumerProps = new Properties();
        consumerProps.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        consumerProps.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "test_group");
        consumerProps.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        consumerProps.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        consumerProps.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProps);
        consumer.subscribe(Arrays.asList(topic));
        
        // 메시지 수신
        String receivedMessage = consumer.poll(1000).iterator().next().value();
        
        consumer.close();
        
        // 테스트 검증
        Assert.assertEquals(receivedMessage, message);
    }
}

위의 코드는 TestNG 어노테이션을 사용하여 Kafka producer를 설정하고 메시지를 보낸 뒤, Kafka consumer를 설정하여 메시지를 수신하는 테스트를 실행합니다. 테스트를 실행하면 Kafka에 메시지가 성공적으로 전송되고 정상적으로 수신되는지 검증합니다.

결론

TestNG와 Apache Kafka를 함께 사용하면 효율적이고 신뢰성 있는 테스트를 수행할 수 있습니다. TestNG를 사용하여 테스트 케이스를 그룹화하고 실행 순서를 제어할 수 있으며, Kafka를 활용하여 실시간 데이터 스트림 처리 기능을 테스트할 수 있습니다. 적절한 설정과 코드 작성을 통해 품질 높은 애플리케이션을 개발할 수 있습니다.

참고 자료