Au secours, mes tests d'intégration sont instables


Junit5-docker

Vincent Demeester @vdemeest
Xavier Detant @xdetant

Le projet : Quizz

Que designe-t-on par le nom Makemake ?

  1. Planète du système solaire
  2. Repas africain
  3. Un tube des années 70
  4. La réponse D

Le projet : Quizz

Que designe-t-on par le nom Makemake ?

  1. Planète du système solaire
  2. Repas africain
  3. Un tube des années 70
  4. La réponse D

Notre architecture

Deux semaines plus tard...

Vivons ces tests, en vrai :
Tests in action

Walkthrough

@BeforeEach
public void createDatabase() {
    MongoClient mongoClient = new MongoClient("my-awesome-cloud");
    database = mongoClient.getDatabase("awesome-quiz");
    repository = new AnswerRepository(database);
}

Walkthrough

@BeforeEach
public void createDatabase() {
    MongoClient mongoClient = new MongoClient("my-awesome-cloud");
    database = mongoClient.getDatabase("awesome-quiz");
    repository = new AnswerRepository(database);
}

@Test
void shouldGetAnswerFromMongo() {
    repository.add("emmétropique", "sans défaut");


}

Walkthrough

@BeforeEach
public void createDatabase() {
    MongoClient mongoClient = new MongoClient("my-awesome-cloud");
    database = mongoClient.getDatabase("awesome-quiz");
    repository = new AnswerRepository(database);
}

@Test
void shouldGetAnswerFromMongo() {
    repository.add("emmétropique", "sans défaut");
    String actualAnswer = repository.getAnswerFor("emmétropique");

}

Walkthrough

@BeforeEach
public void createDatabase() {
    MongoClient mongoClient = new MongoClient("my-awesome-cloud");
    database = mongoClient.getDatabase("awesome-quiz");
    repository = new AnswerRepository(database);
}

@Test
void shouldGetAnswerFromMongo() {
    repository.add("emmétropique", "sans défaut");
    String actualAnswer = repository.getAnswerFor("emmétropique");
    assertThat(actualAnswer).containsIgnoringCase("sans défaut");
}

Walkthrough

@BeforeEach
public void createDatabase() {
    MongoClient mongoClient = new MongoClient("my-awesome-cloud");
    database = mongoClient.getDatabase("awesome-quiz");
    repository = new AnswerRepository(database);
}

@Test
void shouldGetAnswerFromMongo() {
    repository.add("emmétropique", "sans défaut");
    String actualAnswer = repository.getAnswerFor("emmétropique");
    assertThat(actualAnswer).containsIgnoringCase("sans défaut");
}

@AfterEach
public void dropDatabase() {
    database.drop();
}

Régle(s)

Si vous n'avez pas la réponse, vous levez la main

Accès concurrent serveur

Régle(s)

Si vous n'avez pas la réponse, vous levez la main

Test mal écrit

Régle(s)

Si vous n'avez pas la réponse, vous levez la main

Interruption de service

Hétérogénéité dev/prod

Latence réseau

Charge du setup ops

Charge du setup dev

Facilité d'usage

Problèmes rencontrés (solutions)

  • Accès concurrent serveur
  • Test mal écrit
  • Interruption de service
  • Hétérogénéité dev/prod
  • Latence réseau
  • Charge du setup ops
  • Charge du setup dev
  • Facilité d'usage
Duplication de l'infrastructure
Fouetter le developpeur
Fouetter l'ops
Investir dans l'infrastructure
Investir dans le réseau
Ajouter plus d'ops
Ajouter plus de dev
Équipe de ninjas

Et si…

Et si…

  • Accès concurrent serveur
  • Test mal écrit
  • Interruption de service
  • Hétérogénéité dev/prod
  • Latence réseau
  • Charge du setup ops
  • Charge du setup dev
  • Facilité d'usage
  • Local

Et si…

  • Accès concurrent serveur
  • Test mal écrit
  • Interruption de service
  • Hétérogénéité dev/prod
  • Latence réseau
  • Charge du setup ops
  • Charge du setup dev
  • Facilité d'usage
  • Local
  • Container

Et si…

  • Accès concurrent serveur
  • Test mal écrit
  • Interruption de service
  • Hétérogénéité dev/prod
  • Latence réseau
  • Charge du setup ops
  • Charge du setup dev
  • Facilité d'usage
  • Local
  • Container
  • Clean up automatique

Et si…

  • Accès concurrent serveur
  • Test mal écrit
  • Interruption de service
  • Hétérogénéité dev/prod
  • Latence réseau
  • Charge du setup ops
  • Charge du setup dev
  • Facilité d'usage
  • Local
  • Container
  • Clean up automatique
  • @Docker(image="mongo")

Quelques semaines plus tard :
Junit5-docker

github.com/FaustXVI/junit5-docker

Qui sommes-nous ?



Merci !