Рубрики
Без рубрики

Кварк использует Тестовый контейнер, поэтому Пикачу из среды тестирования

Я считаю себя человеком, который думает, на общее благо и в помощь другим. Например, если я encontrass… Помеченный бразильскими разработчиками, java, quarkus, quarkusio.

Я считаю себя человеком, который думает, на общее благо и в помощь другим. Например, если я найду гений, который давал мне право на одно желание, я бы выбрал что все покемоны существовали в реальном мире. Porém, seele me desse direito a um segundo desejo, eu escolheria que todos os desenvolvedores soubessem usar os тестовые контейнеры .

В Testcontainers-это библиотека Java, которая позволяет подняться экземпляров docker во время цикла тестирования. С этими экземплярами, возможно, доступ к базе данных, системы обмена сообщениями, cache, etc…

Но важно иметь внимание, ты что-то очень важное: НЕОБХОДИМО ИМЕТЬ DOCKER УСТАНОВЛЕН НА МАШИНЕ, КОТОРАЯ БУДЕТ ЗАПУСКАТЬ ТЕСТЫ.

Тест сегодня будет немного сложнее. Мы будем использовать то, что мы уже узнали о базе данных и сообщений . Давайте создадим класс, который создает Покемонов, и хранит он на ремне pokebólas базы данных. После этого, срабатывает событие, кафка, где тренер соперника будет сражаться и мы recuperaremos наш покемонов для битвы.

Во-первых, мы будем настраивать наш среды необходимые зависимости. Поэтому необходимо добавить следующий параметр в нашем пом.xml. Esas расширяет конфигурацию для подключения к mensagens Kafka, для подключения к банкам dados (через Panache) и тестовым контейнерам.

    
      io.quarkus
      quarkus-smallrye-reactive-messaging-kafka
    
    
      io.quarkus
      quarkus-jdbc-postgresql
    
    
      io.quarkus
      quarkus-hibernate-orm-panache
    
    
      org.testcontainers
      testcontainers
      1.15.1
      test
    
    
      org.testcontainers
      kafka
      1.15.1
      test
    

Во-вторых, мы создаем наш класс Покемонов. Она довольно проста, есть название и номер его. Это делается с помощью класса ниже:

package org.acme;

import javax.persistence.Entity;

import io.quarkus.hibernate.orm.panache.PanacheEntity;

@Entity
public class Pokemon extends PanacheEntity{
  private int codigo;
  private String nome;

  public Pokemon() {
  }

  public Pokemon(int codigo, String nome) {
    this.codigo = codigo;
    this.nome = nome;
  }

  public int getCodigo() {
    return codigo;
  }

  public String getNome() {
    return nome;
  }

}

Теперь мы будем делать наш генератор сражений. При получении сообщения, что тренер, соперник хочет вступить в бой (получить имя тренера), он записывает в журнал имя тренера, схватит первый покемон, доступным в базе данных и записывает их в журнал имя этого покемона. Код битве.

package org.acme;

import javax.enterprise.context.ApplicationScoped;
import javax.transaction.Transactional;

import org.eclipse.microprofile.reactive.messaging.Incoming;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.smallrye.reactive.messaging.annotations.Blocking;

@ApplicationScoped
public class GeradorDeBatalha {
  private static final int PRIMEIRO_ELEMENTO = 0;
  Logger logger = LoggerFactory.getLogger(getClass());

  @Incoming("novo-combate")
  @Blocking
  @Transactional
  public void iniciarCombate(String nomeDoTreinador) {
    logger.info("O treinador [{}] quer iniciar um combate", nomeDoTreinador);
    Pokemon pokemon = (Pokemon) Pokemon.listAll().get(PRIMEIRO_ELEMENTO);
    logger.info("[{}], eu escolho você!", pokemon.getNome());
  }
}

Давайте сделаем наш тест. В целях обучения, мы не делаем никаких утверждений о нем, только глядя на то, логотипом. Как они разных потоков, которые будут обрабатывать (один поток будет выдавать сообщение боя, а другой будет потреблять), нам нужно дать время, в нашем потоке тестирования что еще за свою работу.

Код для тестирования это здесь:

package org.acme;

import javax.inject.Inject;
import javax.transaction.Transactional;

import org.eclipse.microprofile.reactive.messaging.Channel;
import org.eclipse.microprofile.reactive.messaging.Emitter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;

@QuarkusTest
@QuarkusTestResource(Dependencias.class)
public class BatalhaTest {
  @Channel("iniciar-combate")
  @Inject
  Emitter emissor;

  @BeforeEach
  @Transactional
  public void cadastrarPokemon() {
    Pokemon pokemon = new Pokemon(25, "Pikachu");
    pokemon.persist();
  }

  @Test
  public void combateSimples() throws Exception {
    emissor.send("Gary Carvalho");
    Thread.sleep(1_000);
  }
}

Это сделано, мы идем настройки приложения.properties с базой данных, и потребитель, и излучатель сообщения бой (этот излучатель используется только для тестирования).

quarkus.datasource.db-kind = postgresql
quarkus.datasource.username = ash
quarkus.datasource.password = pallet
quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/pokemon

quarkus.hibernate-orm.database.generation = update


mp.messaging.incoming.novo-combate.connector=smallrye-kafka
mp.messaging.incoming.novo-combate.topic=novo-combate
mp.messaging.incoming.novo-combate.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer

%test.mp.messaging.outgoing.iniciar-combate.connector=smallrye-kafka
%test.mp.messaging.outgoing.iniciar-combate.topic=novo-combate
%test.mp.messaging.outgoing.iniciar-combate.value.serializer=org.apache.kafka.common.serialization.StringSerializer

Если у вас остались какие-либо вопросы о деятельности часть конфигурации, есть два сообщения topzeiras здесь и здесь .

Все в порядке, не так ли? Теперь только отправить maven-тестирования, и мы можем быть счастливыми. Правильно? Неправильно!

Как не существует ни сервер базы данных работает, и даже не кафка, приложение не взойдет право.

Пункт, требующий применения в соответствии с требованиями, является необходимым условием для обеспечения безопасности и безопасности ОС испытания контейнеров entram.

Мы уже установили они, сейчас просто воспитывает контейнеры для испытаний. Это может быть сделано с помощью класса ниже.

package org.acme;

import java.util.HashMap;
import java.util.Map;

import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.KafkaContainer;
import org.testcontainers.utility.DockerImageName;

import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;

public class Dependencias implements QuarkusTestResourceLifecycleManager {
  private final KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka")); //0

  private static final DockerImageName POSTGRES_IMAGE = DockerImageName.parse("postgres:12-alpine"); // 1
  private GenericContainer postgresContainer = new GenericContainer<>(POSTGRES_IMAGE); //2

  public Map start() {
    postgresContainer.withEnv("POSTGRES_USER", "usuario")// 3
        .withEnv("POSTGRES_PASSWORD", "senha")
        .withExposedPorts(5432)// 4
        .withEnv("POSTGRES_DB", "bancoDeDados"); // 5
    postgresContainer.start();//6

    kafka.start();//7

    Map properties = new HashMap<>();
    properties.put("quarkus.datasource.username", "usuario"); //8
    properties.put("quarkus.datasource.password", "senha");
    properties.put("quarkus.datasource.jdbc.url",//
        "jdbc:postgresql://"+ postgresContainer.getHost() +":" + postgresContainer.getFirstMappedPort() + "/bancoDeDados");//9
    properties.put("kafka.bootstrap.servers", kafka.getBootstrapServers());//10

    return properties;
  }

  public void stop() {
  }
}

Это класс, который создает контейнеры. Давайте понять, что она делает?

  • 0 – Container кафка, который уже имеет все предварительно настроен (есть контейнер для этих очень полезно)
  • 1 – Изображение docker для использования контейнер универсальный
  • 2 – Контейнер универсальный, в котором мы будем настроить значения, чтобы сделать наши испытание
  • 3 – Настройка пользователя
  • 4 – Настройки пароля
  • 5 – Конфигурация базы (обратите внимание, что это хорошая практика использовать различные значения, которые нет application.properties )
  • 6 – Обнажая внутренний порт 5432 (testContainers может сопоставить эту внутренней двери для любой другой внешний порт)
  • 7 – Запуск контейнера postgres
  • 8 – Starting container кафка
  • 9 – Обновлении конфигурации, которые будут использоваться во время тестирования
  • 10 – В отсутствии контейнер конкретных, настройки выглядят вот так, и это может вызывать ошибки
  • 11 – Использование собственности с контейнер конкретных
  • 12 – Возвращая свойства

И нам просто нужно еще один шаг, который будет сообщить, чтобы наш класс тестирования, который для того, чтобы он использовать нашу функцию тестирования. Isso é feito colocando a anotação de classe @QuarkusTestResource(Dependencias.class ) .

Да теперь это только радар нашего приложения в качестве mvn test и бегать pro объятия.

2021-02-08 12:08:14,720 INFO  [org.acm.GeradorDeBatalha_Subclass] (vert.x-worker-thread-1) O treinador [Gary Carvalho] quer iniciar um combate
2021-02-08 12:08:14,811 INFO  [org.acm.GeradorDeBatalha_Subclass] (vert.x-worker-thread-1) [Pikachu], eu escolho você!

Fis um razum super resumido sobre ос проверяет контейнеры и кварки. Имеет очень что-то сказать, и я надеюсь сделать больше сообщений об этом. Еще одна интересная вещь в том, что я заметил, что большая часть моих текстов на тестирование, и я рад этому. Больше тестов, это мир более счастливым.

Да, и код, сегодня можно найти нет github .

Оригинал: “https://dev.to/lucasscharf/quarkus-e-testcontainers-o-pikachu-dos-ambientes-de-testes-omb”