Bauen und Testen

Diese Seite erklärt, wie Fess gebaut wird, wie getestet wird und wie Verteilungspakete erstellt werden.

Übersicht über das Build-System

Fess verwendet Maven als Build-Tool. Maven automatisiert die Verwaltung von Abhängigkeiten, Kompilierung, Tests und Paketierung.

pom.xml

Dies ist die Maven-Konfigurationsdatei. Sie befindet sich im Stammverzeichnis des Projekts.

Hauptkonfiguration:

  • Projektinformationen (groupId, artifactId, version)

  • Abhängigkeitsbibliotheken

  • Build-Plugins

  • Profile

Grundlegende Build-Befehle

Clean Build

Löscht Build-Artefakte und baut dann neu:

mvn clean compile

Erstellen von Paketen

Erstellt eine WAR-Datei und ein Distributions-Zip-Paket:

mvn package

Die Artefakte werden im Verzeichnis target/ generiert:

target/
├── fess.war
└── releases/
    └── fess-{version}.zip

Vollständiger Build

Führt Clean, Kompilierung, Tests und Paketierung vollständig aus:

mvn clean package

Herunterladen von Abhängigkeiten

Lädt Abhängigkeitsbibliotheken herunter:

mvn dependency:resolve

Herunterladen der OpenSearch-Plugins

Lädt OpenSearch und erforderliche Plugins herunter:

mvn antrun:run

Bemerkung

Führen Sie diesen Befehl beim Einrichten der Entwicklungsumgebung oder beim Aktualisieren von Plugins aus.

Tests

Fess implementiert Tests mit JUnit.

Ausführen von Unit-Tests

Alle Unit-Tests ausführen

mvn test

Bestimmte Testklasse ausführen

mvn test -Dtest=SearchServiceTest

Bestimmte Testmethode ausführen

mvn test -Dtest=SearchServiceTest#testSearch

Mehrere Testklassen ausführen

mvn test -Dtest=SearchServiceTest,CrawlerTest

Tests überspringen

Wenn Sie beim Bauen Tests überspringen möchten:

mvn package -DskipTests

Warnung

Überspringen Sie während der Entwicklung keine Tests, sondern führen Sie sie immer aus. Stellen Sie vor dem Erstellen eines PR sicher, dass alle Tests bestehen.

Ausführen von Integrationstests

Für Integrationstests wird das Profil integrationTests verwendet. Ein laufender Fess-Server und OpenSearch sind erforderlich:

mvn test -P integrationTests \
    -Dtest.fess.url="http://localhost:8080" \
    -Dtest.search_engine.url="http://localhost:9201"

Bemerkung

Integrationstestklassen verwenden das Namensmuster *Tests.java (Unit-Tests verwenden *Test.java).

Schreiben von Tests

Erstellen von Unit-Tests

Platzierung von Testklassen

Platzieren Sie Testklassen unter src/test/java/. Die Paketstruktur sollte mit dem Hauptcode übereinstimmen.

src/
├── main/java/org/codelibs/fess/app/service/SearchService.java
└── test/java/org/codelibs/fess/app/service/SearchServiceTest.java

Grundstruktur einer Testklasse

package org.codelibs.fess.app.service;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class SearchServiceTest {

    @Test
    public void testSearch() {
        // Given: Testvoraussetzungen
        SearchService service = new SearchService();
        String query = "test";

        // When: Ausführung des Testobjekts
        SearchResponse response = service.search(query);

        // Then: Überprüfung der Ergebnisse
        assertNotNull(response);
        assertTrue(response.getResultCount() > 0);
    }
}

Test-Lebenszyklus

import org.junit.jupiter.api.*;

public class MyServiceTest {

    @BeforeAll
    static void setUpClass() {
        // Einmal vor allen Tests ausführen
    }

    @BeforeEach
    void setUp() {
        // Vor jedem Test ausführen
    }

    @Test
    void testSomething() {
        // Test
    }

    @AfterEach
    void tearDown() {
        // Nach jedem Test ausführen
    }

    @AfterAll
    static void tearDownClass() {
        // Einmal nach allen Tests ausführen
    }
}

Assertions

Verwenden Sie JUnit 5-Assertions:

import static org.junit.jupiter.api.Assertions.*;

// Gleichheit
assertEquals(expected, actual);
assertNotEquals(unexpected, actual);

// Null-Prüfung
assertNull(obj);
assertNotNull(obj);

// Boolean-Werte
assertTrue(condition);
assertFalse(condition);

// Ausnahmen
assertThrows(IllegalArgumentException.class, () -> {
    service.doSomething();
});

// Collections
assertIterableEquals(expectedList, actualList);

Test-Coverage

Messen Sie die Test-Coverage mit JaCoCo:

mvn clean test jacoco:report

Der Bericht wird unter target/site/jacoco/index.html generiert.

Code-Formatierung

Fess verwendet die folgenden Tools, um die Codequalität aufrechtzuerhalten.

Code-Formatter

Einheitlichen Codierungsstil sicherstellen:

mvn formatter:format

Lizenz-Header

Lizenz-Header zu Quelldateien hinzufügen:

mvn license:format

Prüfungen vor dem Commit

Führen Sie beide vor dem Commit aus:

mvn formatter:format
mvn license:format

Erstellen von Verteilungspaketen

Erstellen von Zip-Paketen

Erstellt ein Zip-Paket zur Verteilung:

mvn clean package

Generierte Artefakte:

target/releases/
└── fess-{version}.zip

Erstellen von RPM-Paketen

mvn rpm:rpm

Erstellen von DEB-Paketen

mvn jdeb:jdeb

Profile

Maven-Profile ermöglichen das Umschalten zwischen Test-Typen.

build (Standard)

Das Standardprofil. Führt Unit-Tests (*Test.java) aus:

mvn package

integrationTests

Profil zum Ausführen von Integrationstests (*Tests.java):

mvn test -P integrationTests \
    -Dtest.fess.url="http://localhost:8080" \
    -Dtest.search_engine.url="http://localhost:9201"

CI/CD

Fess verwendet GitHub Actions für CI/CD.

GitHub Actions

Konfigurationsdateien befinden sich im Verzeichnis .github/workflows/.

Automatisch ausgeführte Prüfungen:

  • Build

  • Unit-Tests

  • Paketerstellung

Lokale CI-Prüfungen

Vor dem Erstellen eines PR können Sie lokal die gleichen Prüfungen wie in der CI ausführen:

mvn clean package

Fehlerbehebung

Build-Fehler

Fehler: Download von Abhängigkeiten fehlgeschlagen

# Maven-Lokal-Repository löschen
rm -rf ~/.m2/repository
mvn clean compile

Fehler: Speicher nicht ausreichend

# Maven-Speicher erhöhen
export MAVEN_OPTS="-Xmx2g"
mvn clean package

Fehler: Java-Version ist veraltet

Verwenden Sie Java 21 oder höher:

java -version

Test-Fehler

Test läuft in Timeout

Verlängern Sie die Test-Timeout-Zeit:

mvn test -Dmaven.test.timeout=600

OpenSearch startet nicht

Überprüfen Sie den Port und ändern Sie ihn, wenn er verwendet wird:

lsof -i :9201

Abhängigkeitsprobleme

Abhängigkeitskonflikte

Überprüfen Sie den Abhängigkeitsbaum:

mvn dependency:tree

Schließen Sie bestimmte Abhängigkeiten aus:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>example-lib</artifactId>
    <version>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>conflicting-lib</groupId>
            <artifactId>conflicting-lib</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Best Practices für Builds

Regelmäßige Clean Builds

Führen Sie regelmäßig Clean Builds aus, um Probleme mit dem Build-Cache zu vermeiden:

mvn clean package

Ausführen von Tests

Führen Sie vor dem Commit immer Tests aus:

mvn test

Code-Formatierung ausführen

Führen Sie die Code-Formatierung vor dem Erstellen eines PR aus:

mvn formatter:format
mvn license:format

Aktualisieren von Abhängigkeiten

Aktualisieren Sie Abhängigkeiten regelmäßig:

mvn versions:display-dependency-updates

Nutzung des Build-Cache

Nutzen Sie den Maven-Cache, um die Build-Zeit zu verkürzen:

# Überspringen, wenn bereits kompiliert
mvn compile

Maven-Befehlsreferenz

Häufig verwendete Befehle

# Clean
mvn clean

# Kompilieren
mvn compile

# Testen
mvn test

# Paketieren
mvn package

# Installieren (im lokalen Repository registrieren)
mvn install

# Überprüfen (einschließlich Integrationstests)
mvn verify

# Abhängigkeiten auflösen
mvn dependency:resolve

# Abhängigkeitsbaum anzeigen
mvn dependency:tree

# Projektinformationen anzeigen
mvn help:effective-pom

# Code-Formatierung
mvn formatter:format

# Lizenz-Header hinzufügen
mvn license:format

Nächste Schritte

Nachdem Sie verstanden haben, wie gebaut und getestet wird, lesen Sie folgende Dokumentation:

Referenzmaterialien