Slide 1

Slide 1 text

TESTING SUR CODE LEGACY Jean-Laurent de Morlhon

Slide 2

Slide 2 text

WHO'S WHO ? Nom & rôle dans votre entreprise ? Expérience professionnelle ? Votre niveau en testing sur du code legacy ?

Slide 3

Slide 3 text

AGENDA Présentation Craftsmanship Testing & Legacy Gilded Rose Legacy Code Refactoring WrapUp 4 % 4 % 12 % 24 % 48 % 8 % Présentation Craftsmanship Testing & Legacy Gilded Rose Mayhem Wrap Up

Slide 4

Slide 4 text

CRAFTSMANSHIP

Slide 5

Slide 5 text

Process Coding CRAFTSMANSHIP

Slide 6

Slide 6 text

Attitude

Slide 7

Slide 7 text

MENTORING & TRAINING

Slide 8

Slide 8 text

TESTING & LEGACY

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

TAXONOMIE DES TESTS Tests unitaires Tests d'intégrations e2e Tests de performance Tests de charge Tests exploratoires Tests d'ergonomie Automatisées manuels

Slide 11

Slide 11 text

TEST UNITAIRE @Test public void should_find_winning_bids_when_there_is_option_bids() { Bid bid = new Bid(); bid.setStatus(OPTION); ExpiredBids expiredBids = new ExpiredBids(); expiredBids.add(bid); assertThat(expiredBids.isAnyWinning()).isTrue(); } Test très technique Teste une classe en isolation des autres Ultra rapide (< 10ms)

Slide 12

Slide 12 text

TEST D'INTÉGRATION Test souvent technique Teste le comportement de plusieurs composants ensemble Rapide à lent ( 500ms ~ 1s) @Test public void i_can_retrieve_auctions_bided_by_an_investor() { Investor investor = investors.add(buildInvestor()); Auction auction = auctions.add(buildAuction()); auctions.addBidToAuction(auction.getId(), buildBid()); assertThat(auctions.fromInvestors(investor.get_id())).isNotEmpty(); }

Slide 13

Slide 13 text

TEST END 2 END Test souvent fonctionnel Teste toute l'application, souvent via l'interface Lent (+1s) it 'should find my company account from siren', (done) -> browser = new Browser() browser.visit home, -> browser.clickLink 'Inscrivez-vous', -> browser.choose 'une entreprise' browser.pressButton 'Envoyer', -> browser.fill 'sirenCode', '394149496' browser.clickLink 'Rechercher', -> expect(browser.evaluate('$(\'input[name="e"]\').val()')).to.equal 'SERPODILE' done()

Slide 14

Slide 14 text

TECHNIQUES

Slide 15

Slide 15 text

TEST "AFTER" J'écris du code J'écris un test qui couvre le code que je viens d'écrire du mieux que je peux. Facile à faire Génère des tests d'intégrations Tests souvent compliqués.

Slide 16

Slide 16 text

TDD Ecrire un test unitaire qui échoue Faire passer le test simplement Refactor Switch de clavier

Slide 17

Slide 17 text

TECHNIQUE OUTSIDE-IN Ecrire un test d'acceptance qui échoue Ecrire un test unitaire qui échoue Faire passer le test simplement Refactor

Slide 18

Slide 18 text

BDD - TDD WITH STYLE Scenario: substract two numbers Given I have entered 10 in the calculator And I have entered 7 in the calculator When I press substract Then the result should be 3 on the screen

Slide 19

Slide 19 text

LEGACY CODE ? Un système en production Manque de maintenance Manque de tests Customization Locking Pas de source

Slide 20

Slide 20 text

PYRAMIDE DES TESTS Tests unitaires Tests d'intégrations e2e 1-5% 5-15% 80-90% + - Temps Complexité Fragilité

Slide 21

Slide 21 text

PYRAMIDE DES TESTS 0-5% 5-15% 80-90% + - Temps Complexité Fragilité e2e Tests d'intégrations Tests unitaires

Slide 22

Slide 22 text

INVERSER LA PYRAMIDE e2e Tests d'intégrations Tests unitaires Tests unitaires Tests d'intégrations e2e Système legacy Système sous contrôle

Slide 23

Slide 23 text

INVERSER LA PYRAMIDE 4 règles du design simple Attitude Boy Scout Rule Appropriation collective du code Politique de tests Design émergent

Slide 24

Slide 24 text

4 RÈGLES DU DESIGN SIMPLE 1. Tous les tests passent 2. Révèle ton intention 3. Evite la duplication 4. Petites classes & petites méthodes

Slide 25

Slide 25 text

FENETRE CASSEE

Slide 26

Slide 26 text

PAIR PROGRAMMING

Slide 27

Slide 27 text

DESIGN EMERGENT

Slide 28

Slide 28 text

RÈGLE DU BOY SCOUT

Slide 29

Slide 29 text

TOUT EST LIÉ

Slide 30

Slide 30 text

CODE

Slide 31

Slide 31 text

GILDED ROSE https://github.com/xebia-france/gildedrose-kata Exercice de refactoring sur legacy Par binôme Tentez une technique Vous êtes la pour expérimenter, apprendre Pas pour "gagner" l'exercice. Niveau: moyen 1h30

Slide 32

Slide 32 text

MAYHEM https://github.com/jeanlaurent/devoxx-legacy-code-labs MAY-HEM: A state of violent disorder or riotous confusion; havoc 3h Exercice de refactoring sur legacy Par binôme Niveau: difficile

Slide 33

Slide 33 text

UN PEU DE LECTURE

Slide 34

Slide 34 text

CONTACT [email protected] @morlhon http://code-story.net http://morlhon.net/blog