junit meets docker - java-forum-stuttgart.de · testcontainers is a java library that supports...

20
JUnit meets Docker [email protected], SW-Arch...

Upload: phamnhi

Post on 07-Aug-2019

274 views

Category:

Documents


0 download

TRANSCRIPT

JUnit meets Docker [email protected], SW-Arch...

1

KURZE WEGE,SCHNELLE

ENTSCHEIDUNGEN

1

Die Dr. Güldener Firmengruppe bietet Abrechnungsdienstleistungen und Services für Ärzte, Zahnärzte, Heil- und

Hilfsmittelerbringer sowie Apotheker

9 StandorteHauptsitz Stuttgart

Mehrere Mrd. €Abrechnungsvolumen

Über 1.000 Mitarbeiter deutschlandweit

• Mehr als 40 Jahre Erfahrung

• Marktführer in der zahnärztlichen

Privatliquidation

• Innovative Leistungen und Services

unterstützen Zahnarztpraxen, MKG-

Chirurgen und Patienten

• Abrechnungs- und Erstattungsunterstützung

• Übernahme des gesamten Mahnwesens

inklusive Forderungs- / Honorarausfallschutz

• Teilzahlungsmöglichkeiten für Patienten

• Mehr als 40 Jahre Erfahrung

• Abrechnungs- und Finanzdienstleister im

deutschen Heil- und Hilfsmittelmarkt

• Abrechnung von Kassen- und

Privatrezepten für Physiotherapeuten,

Ergotherapeuten, Logopäden, Podologen,

Sanitätshäuser

• Abrechnung von Kassen- und

Privatrezepten für Unternehmen aus den

Bereichen Homecare und Medizintechnik

• Mehr als 65 Jahre Erfahrung

• Seit Jahrzehnten Partner für Apotheken

und Ärzte bei der Abrechnung von

Rezepten bzw. der Privatliquidation

• Rezeptvorprüfung bei Apotheken

„Scan & Check“

• Prüfung der Rechnungsangaben

anhand der GOÄ

• Gewährleistung von Datensicherheit

und Liquidität

Über 45.000Kunden

60 Entwickler

8 Admins

2 DevOps

Die Test-Pyramide

Unit-Tests

Integrations-

Tests

UI-

Tests

Unit-Tests

class VWTest extends PHPUnit_Framework_TestCase { private $emissions = 12000; private $legalLimit = 300; public function testEnvironmentalImpactCompliance() { $this->assertLessThan($this->legalLimit, $this->emissions); } }

https://github.com/hmlb/phpunit-vw

https://www.pexels.com/de-de/foto/auto-automobil-fahrzeug-hd-wallpaper-163809/

...mach‘ ich mir

die Welt, wie sie

mir gefällt (Pipi Langstrumpf)

www.testcontainers.org

Testcontainers is a Java

library that supports JUnit

tests, providing lightweight,

throwaway instances of

common databases, Selenium

web browsers, or anything

else that can run in a Docker

container.

Voraussetzungen

Demo

<dependency>

<groupId>org.testcontainers</groupId>

<artifactId>testcontainers</artifactId>

<version>1.11.3</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.testcontainers</groupId>

<artifactId>postgresql</artifactId>

<version>1.11.3</version>

<scope>test</scope>

</dependency>

# Travis

language: java

jdk:

- oraclejdk8

sudo: required

services:

- docker

Demo

@ClassRule

public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer()

.withUsername("Oli B.").withPassword("******");

@BeforeClass

public static void setUpLogConfig() {

LOG.info("Setting up logConfig...");

//URI jdbcURI = URI.create("jdbc:hsqldb:mem:logdb");

//logConfig = new LogConfig(jdbcURI, "sa", "");

URI jdbcURI = URI.create(postgreSQLContainer.getJdbcUrl());

logConfig = new LogConfig(jdbcURI, postgreSQLContainer.getUsername(),

postgreSQLContainer.getPassword());

LOG.info("Setting up logConfig {} successful finished.", logConfig);

}

// s.a. https://github.com/oboehm/gdv.xport/blob/master/lib/src/test/java/gdv/xport/config/LogConfigIT.java

@ClassRule

public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer();

/**

* Einige Properties stehen fuer Spring erst nach Initialisierung des

* Containers bereit. Das betrifft insbesondere die JDBC-URL. Ueber

* eine eigene Initializer-Klasse koennen diese fuer Spring gesetzt

* werden, nachdem der Container hochgefahren ist.

*/

public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

@Override

public void initialize(ConfigurableApplicationContext configurableApplicationContext) {

TestPropertySourceUtils.addInlinedPropertiesToEnvironment(configurableApplicationContext,

"spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(),

"spring.datasource.username=" + postgreSQLContainer.getUsername(),

"spring.datasource.password=" + postgreSQLContainer.getPassword(),

"spring.datasource.driverClassName=" + postgreSQLContainer.getDriverClassName()

);

}

}

Fertige Container

Eigenbau

@Rule public GenericContainer redis = new GenericContainer("redis:3.0.6")

.withExposedPorts(6379);

private Cache cache;

@Before

public void setUp() throws Exception {

Jedis jedis = new Jedis(redis.getContainerIpAddress(), redis.getMappedPort(6379));

cache = new RedisBackedCache(jedis, "test");

}

https://www.flickr.com/photos/50732955@N00/13783842354/

Troubleshooting (Win8)

• Umgebungsvariablen überprüfen (Win8):

DOCKER_HOST=tcp://192.168.99.100:2376

DOCKER_CERT_PATH=%HOMEDRIVE%%HOMEPATH%\.docker\machine\certs

DOCKER_TLS_VERIFY=0

• ~/.testcontainers.properties anlegen mit

checks.disable=true

Erfahrungswerte

• klappt ganz gut, trotz Exception 09:05:47,416 ERROR main ientProviderStrategy ping failed with configuration Environment variables, system properties and defaults. Resolved: dockerHost=tcp://192.168.99.100:2376 apiVersion='{UNKNOWN_VERSION}' registryUrl='https://index.docker.io/v1/' registryUsername='oboehm' registryPassword='null' registryEmail='null' dockerConfig='DefaultDockerClientConfig[dockerHost=tcp://192.168.99.100:2376,registryUsername=oboehm,registryPassword=<null>,registryEmail=<null>,registryUrl=https://index.docker.io/v1/,... due to org.rnorth.ducttape.TimeoutException: org.rnorth.ducttape.TimeoutException: java.util.concurrent.TimeoutException org.rnorth.ducttape.TimeoutException: org.rnorth.ducttape.TimeoutException: java.util.concurrent.TimeoutException at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:53) at org.testcontainers.dockerclient.DockerClientProviderStrategy.ping(DockerClientProviderStrategy.java:189) at org.testcontainers.dockerclient.EnvironmentAndSystemPropertyClientProviderStrategy.test(EnvironmentAndSystemPropertyClientProviderStrategy.java:42) at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$2(DockerClientProviderStrategy.java:112) at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:267)

• Startzeit Container: ca. 20 Sek. (Win8; Mac: ca. 5 Sek.)

• Overhead: Faktor 2 - 3

Die Frage ist nicht: Können wir es uns leisten, zu testen?

Die Frage ist nicht: Können wir es uns leisten, zu testen?

Die Frage ist: Können wir es uns leisten, nicht zu testen?

Auf dem PC ist ein Problem aufgetreten. Er muss neu

gestartet werden. Es werden einige Fehlinformationen

gesammelt, und dann wird ein Neustart ausgeführt.

(0% abgeschlossen)

Dieser Absturz wurde ihnen präsentiert von: Optica Abrechnungszentrum

Auf dem PC ist ein Problem aufgetreten. Er muss neu

gestartet werden. Es werden einige Fehlinformationen

gesammelt, und dann wird ein Neustart ausgeführt.

(8% abgeschlossen)

Dieser Absturz wurde ihnen präsentiert von: Optica Abrechnungszentrum

Auf dem PC ist ein Problem aufgetreten. Er muss neu

gestartet werden. Es werden einige Fehlinformationen

gesammelt, und dann wird ein Neustart ausgeführt.

(0% abgeschlossen)

Dieser Absturz wurde ihnen präsentiert von: Optica Abrechnungszentrum

Mit testcontainers wird es

schwieriger, Ausreden*

dafür zu finden!

* gute Ausreden bitte an:

@JitStorm

[email protected]