Используйте другой индекс упругости для теста в Spring Boot - PullRequest
1 голос
/ 22 марта 2019

У меня есть проект Spring Boot, который использует ElasticSearch для хранения и индексации продуктов.Модель продукта:

@Document(indexName = "products", type = "product")
public class Product {

@Id
public String id;
private String[] barcode;
private String name;
private String description;
private String image;
private String detail;
private double price;
private double gain;
private List<Category> categories;
private Currency currency;
private boolean eliminated;
private String taxDescription;
private double taxRate;
private int taxId;

}

Я выполняю интеграционные тесты для работы с продуктами, такими как поиск, обновление и т. Д., И мне нужно использовать один и тот же эластичный сервер.Я думаю о создании индекса только для целей тестирования, наполнения его некоторыми продуктами, а после тестирования просто удалите его.Является ли это возможным?Как я могу это сделать?

1 Ответ

2 голосов
/ 23 марта 2019

Я предполагаю, что вы используете известные репозитории данных Spring в своем производственном коде.Нечто подобное может находиться в вашем проекте:

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
    Product findByName(String name);
}

Таким образом, вы можете настроить небольшой интеграционный тест случай, подобный следующему:

@SpringBootTest
@RunWith(SpringRunner.class)
public class QueryIndexIT {
    @Autowired
    private ProductRepository repo;
    @Autowired
    private ElasticsearchTemplate template;

    @Test
    public void queryRepo() {
        assertThat(template.indexExists(Product.class)).isTrue();

        Product savedProduct = repo.save(new Product(null, "the name", "n/a"));
        Product foundProduct = repo.findByName("the name");

        assertThat(foundProduct).isEqualTo(savedProduct);
    }
}
}

Так что в основном вы 'Выполнив этот интеграционный тест с знакомым вам контекстом Spring, возможно, немного изменив его с помощью application-test.properties.

Чтобы быть независимым от любых реальных серверов ElasticSearch в вашей сети, выможет также отделить себя с помощью Maven Docker Plugin .Обратите особое внимание на раздел executions, указанный ниже в моем фрагменте pom.xml.Он запускает новый контейнер ElasticSearch перед выполнением любых интеграционных тестов и удаляет его, как только тесты завершаются.Таким образом, вы начинаете каждый цикл тестирования с чистой и стабильной настройки теста:

            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.28.0</version>
                <configuration>
                    <showLogs>true</showLogs>
                    <verbose>true</verbose>
                    <removeVolumes>true</removeVolumes>
                    <allContainers>true</allContainers>
                    <images>
                        <image>
                            <name>elasticsearch:6.6.2</name>
                            <alias>elasticsearch</alias>
                            <run>
                                <ports>
                                    <port>9200:9200</port>
                                    <port>9300:9300</port>
                                </ports>
                                <env>
                                    <ES_JAVA_OPTS>-Xms512m -Xmx512m</ES_JAVA_OPTS>
                                    <cluster.name>docker-cluster</cluster.name>
                                    <discovery.type>single-node</discovery.type>
                                </env>
                            </run>
                        </image>
                    </images>
                </configuration>
                <executions>
                    <execution>
                        <id>prepare-containers</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>stop</goal>
                            <goal>start</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>remove-containers</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Более подробную информацию о ссылочном образе ElasticSearch Docker можно найти в его описании на Docker Hub .

Итак, вы заметили, что нет необходимости создавать отдельный индекс только для целей тестирования.Храните тестовый и производственный код (и конфигурируйте, где это возможно) близко друг к другу, чтобы избежать неожиданностей во время рабочего процесса.

Если вы хотите устранить возможные проблемы с вашей настройкой, вы также можете сравнить свой подход с работающим примеромкоторый я подготовил для вас в моем Github хранилище .

Просто попробуйте это с mvn clean verify -Dit.test=QueryIndexIT.Веселитесь и возвращайтесь с вашими успехами или замечаниями!

...