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