CodingDojo
Test Driven Development git clone https://github.com/worldline/bfi-ecs-coding-dojo

William CHU-FUK-SHIAN

Julien LEVESY

Franck Verrot

Olivier PEREZ

Franck Verrot

Live coding

Atelier

Franck Verrot

Introduction au TDD

Franck Verrot

Propositions... vraies ou fausses?

  1. La pratique du TDD permet de trouver tous les bugs.
  2. Le TDD ça coûte cher
  3. Plus de rigueur = moins de bugs
  4. C'est par la pratique que l'on apprend.

Test-Driven Development

Qu'est-ce que le TDD

  1. Une boucle d'apprentissage très courte
  2. Des indicateurs sur la qualité d'implémentation
  3. Une méthode de conception

Test-Driven Development

Méthodologies utilisés

  1. Un cycle de vie "Red - Green - Refactor"
  2. Des pratiques et habitudes

Test-Driven Development

Red - Green - Refactor = Test-first + Refactor = TDD

  1. Nouveau test d'une fonctionnalité
  2. Implémentation de la fonctionnalité
  3. Factorisation du code produit

Des pratiques et habitudes

Des principes

  1. Single Responsibility : que fait la classe/méthode X?
  2. Open/Closed : composition < héritage
  3. Liskov Substitution : définitions de contrats
  4. Interface Segregation : interfaces plus petites
  5. Dependency Inversion : découplage plus fort

Des pratiques et habitudes

Des principes

  1. Single Responsibility : que fait la classe/méthode X?

Des pratiques et habitudes

Des principes

  1. Single Responsibility : que fait la classe/méthode X?
  2. Open/Closed : composition < héritage

Des pratiques et habitudes

Des principes

  1. Single Responsibility : que fait la classe/méthode X?
  2. Open/Closed : composition < héritage
  3. Liskov Substitution : définitions de contrats

Des pratiques et habitudes

Des principes

  1. Single Responsibility : que fait la classe/méthode X?
  2. Open/Closed : composition < héritage
  3. Liskov Substitution : définitions de contrats
  4. Interface Segregation : interfaces plus petites

Des pratiques et habitudes

Des principes

  1. Single Responsibility : que fait la classe/méthode X?
  2. Open/Closed : composition < héritage
  3. Liskov Substitution : définitions de contrats
  4. Interface Segregation : interfaces plus petites
  5. Dependency Inversion : découplage plus fort

Les gains du TDD

  1. Testabilité
  2. Maintenabilité
  3. Réusabilité
  4. D'autres mots en é

Live coding

Live coding

Live coding

MCD - Car+Engine
git checkout -f tdd-01-step0-java
git checkout -f tdd-01-step0-oc

Live coding

feature 1 - Démarrage d'un moteur
Lorsqu'un moteur démarre il fait vrooom.

feature 2 - Démarrage d'une voiture
Quand la voiture démarre, ça démarre le moteur et vrooom.

Live coding

Live coding

Atelier - La clé

Faites signe aux organisateurs.

Atelier - La clé

MCD - Key
git checkout -f tdd-01-step1-java
git checkout -f tdd-01-step1-oc

Atelier - La clé

feature 1 - La clé sert à démarrer la voiture
Une voiture démarre grâce à une clé.

feature 2 - La clé sert à démarrer la voiture
Une voiture ne démarre pas sans clé.

feature 3 - La clé sert à démarrer la voiture
Une mauvaise clé ne démarrera pas la voiture.

Atelier - L'alarme

Faites signe aux organisateurs.

Atelier - L'alarme

MCD - Alarm
git checkout -f tdd-01-step2-java

Atelier - L'alarme

feature 1 - L'alarme fait du bruit
Une alarme fait pouet.

feature 2 - L'alarme est déclenchée par la voiture
L'alarme sonne quand on démarre la voiture sans clé.

feature 3 - L'alarme est en option
Une voiture ne nécessite pas une alarme.

Atelier - L'alarme


feature 4 - L'alarme high-tech
Ce type d'alarme prévient par mail.

Atelier - L'alarme

feature 5 - L'alarme exceptionnelle
Ce type d'alarme déclenche une exception.

Atelier - Les outils

Faites signe aux organisateurs.
git checkout -f tdd-01-step3-java

Atelier - Les outils

Test unitaire - Objective-C - XCTest
// File : EngineUnitTest.m
#import <XCTest/XCTest.h>

@interface EngineTest : XCTest
@end

@implementation EngineTest

- (void) setUp { [super setUp]; }
- (void) tearDown { [super tearDown]; }
- (void) shouldStartEngine { /* ... */ }

@end

Atelier - Les outils

Test unitaire - Java - JUnit
// File : EngineUnitTest.java
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class EngineTest {

@Before
public void setUp { /*...*/ }
@After
public void tearDown { /*...*/ }
@Test
public void shouldStartEngine { /* ... */ }

}

Atelier - Les outils

Test unitaire - Objective-C - OCMockito
// mock creation
NSMutableArray *mockArray = mock([NSMutableArray class]);

// using mock object
[mockArray addObject:@"one"];
[mockArray removeAllObjects];

// verification
[verify(mockArray) addObject:@"one"];
[verify(mockArray) removeAllObjects];

Atelier - Les outils

Test unitaire - Java - Mockito
// mock creation
ArrayList mockedList = mock(ArrayList.class);

// using mock object
mockedList.add("one");
mockedList.clear();

// verification
verify(mockedList).add("one");
verify(mockedList).clear();

You won!

Rappel avant de partir

Roti

Facilité

Questions ?