Mögen die Tests mir
dir sein
Mögen die Tests mir
dir sein
(a.k.a. dämlicher Titel^2)
@codepitbull
2 Jahre in 45 Minuten
Release all 2 Wochen
Release all 2 Wochen
CD-Fähigkeit für Testing / Bug-
Fixes
Release all 2 Wochen
CD-Fähigkeit für Testing / Bug-
Fixes
OnPrem-Releasing
2018
2018
2018
2018
2018
2018
2018
2018
2018
FUNFUNFUN!!11!
DEV

- Unit-Tests

- Integration Tests
QA

- Regressionstests
- Beratung der Teams
DEV

- Unit-Tests

- Integration Tests
QA

- Regressionstests
- Beratung der Teams
SRE

- Infra-Automatisierung

- Health Checks + SLOs
DEV

- Unit-Tests

- Integration Tests
QA

- Regressionstests
- Beratung der Teams
SRE

- Infra-Automatisierung

- Health Checks + SLOs
DEV

- Unit-Tests

- Integration Tests
Tests sind …
Tests sind …
Dokumentation
Tests sind …
Dokumentation
Sicherheitsnetz
Tests sind …
Dokumentation
Sicherheitsnetz
Niemals fertig
Was sind Integrationstests?
Was sind Integrationstests?
Tests mit Infrastruktur
https://www.baeldung.com/maven-integration-test
Dev-Jenkins
Dev-Jenkins
IT-Jenkins
Dev-Jenkins
IT-Jenkins
Hugh-commercial-DB-Jenkins
Integrationstests sind …
Integrationstests sind …
Schwer zu bauen
Integrationstests sind …
Schwer zu bauen
Schwer zu pflegen
Integrationstests sind …
Schwer zu bauen
Schwer zu pflegen
Teuer in der Ausführung
Integrationstests sind …
Schwer zu bauen
Schwer zu pflegen
Teuer in der Ausführung
Eigentlich nicht notwendig …
public class CockroachContainer extends GenericContainer<CockroachContainer> {
private static final String IMAGE_NAME = "cockroachdb/cockroach:v19.1.0";
private static final int PORT = 26257;
private final String databaseName;
public CockroachContainer(String databaseName) {
super(new ImageFromDockerfile()
.withDockerfileFromBuilder(builder -> builder.from(IMAGE_NAME)
.cmd("start", "--insecure")
.build()));
withExposedPorts(PORT);
this.databaseName = databaseName;
}
public String getUsername() {
return "maxroach";
}
public String getPassword() {
return "";
}
public String getJdbcUrl() {
return "jdbc:postgresql://" + this.getContainerIpAddress() + ":" + this.getMappedPort(PORT) + "/" + this.databaseName;
}
@Override
public void start() {
super.start();
try {
ExecResult sql = execInContainer("/cockroach/cockroach", "sql", "--insecure", "--execute=CREATE DATABASE "
+ databaseName + ";CREATE USER IF NOT EXISTS maxroach;GRANT ALL ON DATABASE „
+ databaseName + " TO maxroach;CREATE TABLE " + databaseName + ".schema_migrations (version INT NOT NULL,dirty BOOL NOT NULL);");
System.out.println(sql.getStderr());
System.out.println(sql.getStdout());
initialize();
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}
public void executeSql(String sql) throws IOException, InterruptedException {
ExecResult execResult = execInContainer("/cockroach/cockroach", "sql", "--insecure", "--database", databaseName, "--execute=" + sql);
System.out.println(execResult.getStdout());
System.out.println(execResult.getStderr());
if (execResult.getStderr().contains("Failed running")) {
fail("Failed to run SQL '" + sql + "':n" + execResult.getStderr());
}
}
private void initialize() {
try{
InitScriptLocation initScripts = new InitScriptLocation("../instanactl/migrations/cockroachdb/" + databaseName + "/init", true);
for (InitScriptLocation.Script script : initScripts.listFiles()) {
System.out.println("Executing init script: " + script.getFileName());
executeSql(script.readContent());
}
InitScriptLocation migrationScripts = new InitScriptLocation("../instanactl/migrations/cockroachdb/" + databaseName + "/migrations", true);
for (InitScriptLocation.Script script : migrationScripts.listFiles()) {
System.out.println("Executing migration: " + script.getFileName());
executeSql(script.readContent());
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}
@Container
static CockroachContainer cockroachContainer = new CockroachContainer("butlerdb");
Sollte ein parametrisierter Test sein …
@RegisterExtension
JunitGuiceAdapter junitGuiceAdapter = JunitGuiceAdapter.builder()
.withZookeeper()
.withClickhouse()
.withModule(new ClickHouseModuleExt())
.withModule(new AppDataReaderModule())
.withModule(new AppDataReaderTestModule())
.build();
Muahahah!
2020
2020
2020
2020
56 Minuten 

16 CPU / 64 GB RAM
QA

- Regressionstests
- Beratung der Teams
SRE

- Infra-Automatisierung

- Health Checks + SLOs
DEV

- Unit-Tests

- Integration Tests
Split by @Tag
Mögen die Tests mit dir sein
Mögen die Tests mit dir sein

Mögen die Tests mit dir sein