Вводный пример JavaScript для неинициированных Testcontainers с использованием библиотеки kafkajs

Возможно, вы чувствуете тему. В случае Kafka есть модуль для Node.js Testcontainers, но я столкнулся с несколькими острыми краями при настройке тестов на моем Macbook M1*, поэтому я подумал, что d поделиться своими результатами с остальной частью класса.

* Согласно нескольким сообщениям, которые я прочитал, мой M1 виноват в том, что стандартные контейнеры изображений Kafka часто не запускаются правильно. Мой собственный опыт подтверждает это.

Установка зависимостей

npm install testcontainers @testcontainers/kafka

Вам понадобится @testcontainers/kafka, если вы используете версию 10+ testcontainers, но в более старых версиях класс KafkaContainer был доступен непосредственно из пакета testcontainers.

Запуск и запуск тестовых контейнеров

Обратите внимание, что порт, отображаемый здесь, является портом TLS по умолчанию 9093. Кроме того, мне нужно было указать образ confluentinc/cp-kafka:latest Docker, так как образ по умолчанию часто не загружался.

const { KafkaContainer } = require('@testcontainers/kafka');
const DEFAULT_KAFKA_PORT = 9093;

const testKafkaContainer = async () => {
  let kafkaContainer;
  try {
    console.log(`Starting Kafka container...`);
    kafkaContainer = await new KafkaContainer('confluentinc/cp-kafka:latest')
        .withExposedPorts(DEFAULT_KAFKA_PORT)
        .start();
    const port = kafkaContainer.getMappedPort(DEFAULT_KAFKA_PORT);
    const host = kafkaContainer.getHost();
    console.log(`Running Kafka on ${host}:${port}...`);
  } finally {
    if (kafkaContainer) {
      console.log(`Stopping Kafka container...`);
      await kafkaContainer.stop();
    }
  }
};
testKafkaContainer();

Тестирование ваших тестовых контейнеров

Для создания/потребления* сообщений на рассматриваемом сервере Kafka с помощью kafkajs:

const { KafkaContainer } = require('@testcontainers/kafka');
const { Kafka } = require('kafkajs');

const DEFAULT_KAFKA_PORT = 9093;

const testKafkaContainer = async () => {
  let kafkaContainer;
  try {…