1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jiang516-liquibase

Клонировать/Скачать
DEVELOPING.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 08.05.2025 18:44 a3b4caa

Разработка Liquibase

Обзор

Liquibase написан на Java и использует Maven в качестве системы сборки.

Структура кода соответствует стандартной Maven-структуре каталогов, разделенной на модули, с liquibase-core как центральным модулем.

Тестирование

Хотя все еще существуют старые тестовые классы, написанные с использованием JUnit, тесты должны быть написаны (или, если возможно, перенесены) в Spock.

Интеграционное тестирование

ЗАМЕТКА: ЭТО ОПИСАНИЕ АЛЬФА-СИСТЕМЫ, КОТОРАЯ ВОЗМОЖНО БУДЕТ ИЗМЕНЕНА. ПРОВЕРЯЙТЕ ЕЁ ЧАСТНО

Поскольку Liquibase взаимодействует с множеством различных баз данных, важно автоматизировать тестирование этих взаимодействий.

Окружения для интеграционного тестирования

Чтобы написать тест против внешней базы данных, вам сначала нужно иметь базу данных для тестирования. Liquibase автоматизирует этот процесс, чтобы вы могли сосредоточиться на написании тестов, а также для обеспечения стандартизации и повторяемости тестов.

Ссылка на тестовую систему из ваших тестовВнутри ваших тестов вы создаете ссылку на систему, против которой вы будете тестировать, вызывая testSystem = Scope.getCurrentScope().getSingleton(TestSystemFactory.class).getTestSystem("h2"), где аргумент getTestSystem() является ключом для настроенной системы.

Основные тестовые системы настроены в liquibase.sdk.yaml. Когда эта строка в вашем тесте выполняется, TestSystemFactory использует запущенную систему, если она доступна, или запускает новую систему, если это необходимо. Любые новые запущенные системы будут доступны на протяжении всего времени выполнения всех тестов и будут закрыты в конце всего цикла.Базовый класс TestSystem предназначен для работы не только с базами данных, поэтому, если вы знаете, что подключаетесь к базе данных, вы захотите привести его к типу DatabaseTestSystem для вызова методов, таких как getConnection(), для подключения к нему. Например:

@Shared
private DatabaseTestSystem mysql = 
    (DatabaseTestSystem) Scope.getCurrentScope().getSingleton(TestSystemFactory.class).getTestSystem("mysql")

Когда TestSystems нужно запустить, Liquibase обычно полагается на Docker-экземпляры. Когда Docker-образы недоступны или не нужны, они также могут подключаться к внешней базе данных через настройку url. При использовании контейнеров Docker, если мы хотим добавить поддержку нового базового данных для тестирования, нам нужно создать новый тестовый класс, расширяющий DatabaseTestSystem и переопределить метод createContainerWrapper(), как показано ниже:

public class FirebirdTestSystem extends DatabaseTestSystem {

    public FirebirdTestSystem(Definition definition) {
        super(definition);
    }

    @Override
    protected DatabaseWrapper createContainerWrapper() throws Exception {
        return new DockerDatabaseWrapper(new FirebirdContainer(
                DockerImageName.parse(getImageName()).withTag(getVersion()))
                .withDatabaseName(getCatalog())
                .withUsername(getUsername())
                .withPassword(getPassword()),
                this
        );
    }
}

Кроме того, нам нужно добавить тестовую зависимость для базы данных, для которой добавляется поддержка, в файл pom.xml модуля liquibase-extension-testing:

<dependency>
    <groupId>org.firebirdsql</groupId>
    <artifactId>firebird-testcontainers-java</artifactId>
    <version>1.2.0</version>
</dependency>
```#### Управление системами для тестирования

Тестовый фреймворк спроектирован для автоматического запуска экземпляров баз данных любого типа. Однако, тесты баз данных могут быть медленными, поэтому Liquibase по умолчанию использует виртуальные базы данных (h2, hsqldb, sqlite). Любые тесты, требующие других платформ баз данных, будут автоматически помечены как "игнорируемые".

Атрибут `liquibase.sdk.testSystem.test` должен быть запятой-разделенным списком, указанным в файле `liquibase.sdk.local.yml` (см. ниже).

Настройка `liquibase.sdk.testSystem.test` также может указывать конкретные настройки для тестовых систем, которые вы хотите использовать для тестирования. 
Например, если у вас есть `liquibase.sdk.testSystem.test=h2?version=1.4.200,mysql`, когда ваши тесты вызывают `getTestSystem("h2")`, они получат систему h2 версии 1.4.200. Вы также можете указывать профили (см. ниже), как `liquibase.sdk.testSystem.test=mssql:case-sensitive,mysql`.#### Запуск тестовых систем независимо от тестов

Часто вам нужно иметь базу данных, которую можно запускать вручную с помощью Liquibase вне автоматизированных тестов.

Файлы `liquibase-extension-testing.jar` и соответствующий `liquibase-extension-testing-deps.jar` добавляют группу команд `liquibase sdk system` в CLI Liquibase, что позволяет вам запускать и останавливать те же контейнеры, которые используются в ваших тестах.

Добавив эти JAR-файлы в директорию `LIQUIBASE_HOME/lib`, вы можете запустить `liquibase sdk system up --name mysql`, чтобы запустить систему MySQL, где аргумент `name` — это имя тестовой системы, которую вы хотите запустить.

Для остановки экземпляров, запущенных таким образом, выполните команду `liquibase sdk system down --name mysql`.#### Локальная конфигурация

Файл `liquibase.sdk.yaml` содержит базовую конфигурацию, но бывают случаи, когда вы захотите изменить поведение по умолчанию. 
Создавая файл `liquibase.sdk.local.yml` в той же директории, что и файл `liquibase.sdk.yaml` (например, в директории `liquibase-extension-testing/src/main/resources`), вы можете добавить только те параметры, которые хотите переопределить.

ЗАМЕЧАНИЕ: Файл `liquibase.sdk.local.yml` является специфическим для вашего окружения разработки, и конфигурация `.gitignore` настроена таким образом, чтобы исключить этот файл из коммитов.

В примере ниже приведена базовая конфигурация, которая будет использоваться для различных профилей, если они не переопределяют какие-либо свойства:
```yaml
liquibase:
  sdk:
    testSystem:
      default:
          username: lbuser
          password: LiquibasePass1
          catalog: lbcat
          altCatalog: lbcat2
          altSchema: lbschem2
          altTablespace: liquibase2
          keepRunning: true         
      test: mysql,h2,mssql     
      acceptLicenses: mssql

будет запускать тесты против mysql, h2 и mssql. Также указывается, что вы принимаете лицензионное соглашение EULA, требуемое контейнером Docker для mssql.

Профили тестовой системы

В стандартном файле liquibase.sdk.yaml и файле liquibase.sdk.local.yaml можно определить "профили", которые переопределяют конкретные параметры базовой конфигурации. Например, конфигурация для h2 определяет профили "1.x" и "2.x":

  h2:
    url: jdbc:h2:mem:${catalog};DB_CLOSE_DELAY=-1
    profiles:
      "1.x":
        version: 1.4.200
      "2.x":
        version: 2.0.206
```Преимущество профилей заключается в возможности пользователей указывать точную версию h2, которая является релевантной для их тестирования.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/jiang516-liquibase.git
git@api.gitlife.ru:oschina-mirror/jiang516-liquibase.git
oschina-mirror
jiang516-liquibase
jiang516-liquibase
达梦