Я считаю себя человеком, который думает, на общее благо и в помощь другим. Например, если я найду гений, который давал мне право на одно желание, я бы выбрал что все покемоны существовали в реальном мире. 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”