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 ausführbare JAR-Datei:
mvn package
Die Artefakte werden im Verzeichnis target/ generiert:
target/
├── fess-15.3.x.jar
└── fess-15.3.x/
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ührt alle Tests einschließlich Integrationstests aus:
mvn verify
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);
Verwendung von Mocks
Verwenden Sie Mockito zum Erstellen von Mocks:
import static org.mockito.Mockito.*;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MockitoExtension.class)
public class SearchServiceTest {
@Mock
private SearchEngineClient searchEngineClient;
@Test
public void testSearch() {
// Mock-Konfiguration
when(searchEngineClient.search(anyString()))
.thenReturn(new SearchResponse());
// Test ausführen
SearchService service = new SearchService();
service.setSearchEngineClient(searchEngineClient);
SearchResponse response = service.search("test");
// Überprüfung
assertNotNull(response);
verify(searchEngineClient, times(1)).search("test");
}
}
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-Qualitätsprüfung
Checkstyle
Überprüft den Codierungsstil:
mvn checkstyle:check
Die Konfigurationsdatei befindet sich unter checkstyle.xml.
SpotBugs
Erkennt potenzielle Bugs:
mvn spotbugs:check
PMD
Erkennt Code-Qualitätsprobleme:
mvn pmd:check
Alle Prüfungen ausführen
mvn clean verify checkstyle:check spotbugs:check pmd:check
Erstellen von Verteilungspaketen
Erstellen von Release-Paketen
Erstellt Pakete für die Verteilung:
mvn clean package
Generierte Artefakte:
target/releases/
├── fess-15.3.x.tar.gz # Für Linux/macOS
├── fess-15.3.x.zip # Für Windows
├── fess-15.3.x.rpm # RPM-Paket
└── fess-15.3.x.deb # DEB-Paket
Erstellen von Docker-Images
Erstellt ein Docker-Image:
mvn package docker:build
Generiertes Image:
docker images | grep fess
Profile
Sie können Maven-Profile verwenden, um verschiedene Einstellungen pro Umgebung anzuwenden.
Entwicklungsprofil
Baut mit Entwicklungseinstellungen:
mvn package -Pdev
Produktionsprofil
Baut mit Produktionseinstellungen:
mvn package -Pprod
Schneller Build
Überspringt Tests und Prüfungen für schnelles Bauen:
mvn package -Pfast
Warnung
Schnelle Builds sind nur zur Überprüfung während der Entwicklung gedacht. Führen Sie vor dem Erstellen eines PR unbedingt einen vollständigen Build aus.
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
Integrationstests
Code-Stil-Prüfung
Code-Qualitätsprüfung
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 verify checkstyle:check
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 -XX:MaxPermSize=512m"
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-Qualitätsprüfung
Überprüfen Sie die Code-Qualität vor dem Erstellen eines PR:
mvn checkstyle:check spotbugs:check
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
Nächste Schritte
Nachdem Sie verstanden haben, wie gebaut und getestet wird, lesen Sie folgende Dokumentation:
Entwicklungsworkflow - Entwicklungsworkflow
Leitfaden für Beiträge - Richtlinien für Beiträge
Architektur und Codestruktur - Verständnis der Codebasis