Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Testing sur Legacy Code

Testing sur Legacy Code

Jean-Laurent de Morlhon

November 20, 2013
Tweet

More Decks by Jean-Laurent de Morlhon

Other Decks in Programming

Transcript

  1. WHO'S WHO ? Nom & rôle dans votre entreprise ?

    Expérience professionnelle ? Votre niveau en testing sur du code legacy ?
  2. 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
  3. TAXONOMIE DES TESTS Tests unitaires Tests d'intégrations e2e Tests de

    performance Tests de charge Tests exploratoires Tests d'ergonomie Automatisées manuels
  4. 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)
  5. 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(); }
  6. 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()
  7. 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.
  8. TDD Ecrire un test unitaire qui échoue Faire passer le

    test simplement Refactor Switch de clavier
  9. TECHNIQUE OUTSIDE-IN Ecrire un test d'acceptance qui échoue Ecrire un

    test unitaire qui échoue Faire passer le test simplement Refactor
  10. 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
  11. LEGACY CODE ? Un système en production Manque de maintenance

    Manque de tests Customization Locking Pas de source
  12. PYRAMIDE DES TESTS 0-5% 5-15% 80-90% + - Temps Complexité

    Fragilité e2e Tests d'intégrations Tests unitaires
  13. 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
  14. INVERSER LA PYRAMIDE 4 règles du design simple Attitude Boy

    Scout Rule Appropriation collective du code Politique de tests Design émergent
  15. 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
  16. 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
  17. 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