IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ALM Discussion :

Le TDD est mort ? non, pas vraiment, peut-être que oui


Sujet :

ALM

  1. #61
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : août 2005
    Messages : 2 894
    Points : 7 197
    Points
    7 197
    Par défaut
    Citation Envoyé par Luckyluke34 Voir le message
    Oui, mais comment savoir quelle catégorie de tests lancer après une modif ? Comment être sûr que le découpage en catégories est fiable et qu'un test dans une catégorie a priori non liée à la modif en cours ne va pas échouer ? Jusqu'où va cette exécution sélective des tests ? Uniquement sur le poste de dev ? Si le serveur d'intégration continue exécute lui systématiquement toute la suite, ne risque-t-on pas d'avoir des builds très longs et des problèmes de concurrence de commits ?
    Pour commencer je dirai que la gestion des tests est une activité 50% pro-active et à 50% réactive. Il ne faut pas oublier que ce n'est qu'une assurance : prévenir le danger et aide à la réparation (diagnostic) en cas de dégâts.
    Une métrique suffisamment fiable est la couverture (ex : code, exigence). Cela donne déjà une bonne idée de la pertinence.
    Quelque soit le projet je pense qu'il doit être possible de définir au moins deux classes : les tests qui peuvent être exécuter sur le poste et la batterie de test relativement courte. Le "relativement" est important parce qu'il diffère en fonction des processus (habitudes) des équipes, quoiqu'il en soit il faut bien le définir entre membres et s'y tenir. On peut par exemple avoir des tests très rapides (<10s) que l'on peut passer quasiment à chaque bloc écrit et d'autres un peu plus long (1-3min) pour ceux qu'on exécute systématiquement avant de publier son code (commit ou push) sur une branche de dev. Dans la même idée on peut avoir des tests plus longs pour vérifier la stabilité de la branche de dev avant de pousser vers une branche d'intégration (ou autre).

    Concernant l'intégration continue, elle peut être dissocié du build. Les tests spécifiques de non-régression venant couvrir des cas similaires de tests plus généraux.

    J'ai l'impression que pour beaucoup il ne fait aucun doute qu'on doit avoir une méthode de développement, une politique de gestion de configuration mais pour les tests cela doit se faire tout seul. Alors oui ca peut fonctionner comme on peut faire ses développements à la RACHE, ou sinon il existe quelques bonnes pratiques/méthodes.

    Citation Envoyé par Luckyluke34 Voir le message
    Même problème, mais à bien moindre échelle. Une classe va typiquement avoir un ou deux collaborateurs donc la complexité sera limitée. "Mocker à tout va" est d'ailleurs sans doute révélateur d'un problème de design - notre objet en fait probablement trop, il a trop de dépendances.
    Quand je parle de "mocker à tout va", je voulais dire que tous les TUs mockent leurs dépendances. Les composants sont tellement isolés qu'on ne teste plus grand chose au final.

    Citation Envoyé par Luckyluke34 Voir le message
    Oui, ce sont les bugs à la périphérie ou à la lisière de l'application, à savoir défaillance hardware ou réseau, défaillance de système tiers ou problème de configuration. Il faut des tests d'intégration pour ces cas. En général, j'isole ces composants externes via un wrapper ou adapter et je teste le wrapper en intégration.
    T'as vraiment confiance à ce point en ton code pour dire qu'il n'y a pas de bugs dans ton application ?
    A chaque fois que tu mockes un système tu fais des hypothèses sur celui-ci. Si c'est la même personne qui code l'application et le TU, elle fera les mêmes hypothèses. Et la communication peut alors être faussé. Le système mocké peut tout aussi bien être un composant externe qu'une classe de ton système plus globale.
    Les TUs purs ne testeront jamais les communications réelles interne au système, toutes les dépendances ayant été mockées afin de garantir l'isolation du composant testé.


    Citation Envoyé par Luckyluke34 Voir le message
    Le problème étant que plus le TI porte sur un vaste système, plus ces assertions seront nombreuses.
    Non pas nécessairement plus d'assertions, mais oui plus d'hypothèses ("assumptions"). Il y a toujours un degré de confiance à avoir. C'est ce qu'apportent les tests plus bas niveau exécutés en amont.

    Citation Envoyé par Luckyluke34 Voir le message
    Faut-il les mettre toutes dans le même test au point de le rendre peu lisible ? Dans des tests séparés ?
    Applique la même logique que tu appliques à tes TUs. En générale, on fait une grosse initialisation (@BeforeClass), puis on exécute des petits préparatifs (@Before), on exécute le test et les vérifications (@Test), les petits nettoyages (@After) et ensuite on fait le gros ménage (@AfterClass).
    Rien ne t'empêche d'avoir une hierachie plus complexe avec un système de poupées russes qui te permettent de réutiliser des initialisations massives. Il ne faut pas non plus négliger tout ce qui est "dump". Cela permet d'avoir un "cache" de systèmes externes pré-configurés, le plus souvent on le réserve à la BDD mais il est possible de le faire pour tout autre type de système.

    Citation Envoyé par Luckyluke34 Voir le message
    Et surtout, si un sous-système s est testé par des assertions des TI d'un système S1, faut-il les retester dans les TI de S2 dans lequel s est aussi utilisé ? Si non, comment repérer ces chevauchements ?
    Concernant le chevauchement verticale : c'est le cas des TI au-dessus des TU ou les tests spécifiques de non-régression. Pourtant qu'un TI provoque le même scénario de test qu'un (ou plusieurs) TU(s) ne te choquent surement pas ?

    Concernant le chevauchement horizontale :
    1. La plupart des systèmes (classe, module, etc.) fonctionnent en mode "Maître/Esclaves" car on adopte le plus souvent un modèle en couche. Le TI sera uniquement effectué par le système "Maître", tandis que des TUs seront exécutés sur les "Esclaves" pour vérifier qu'ils fonctionnent correctement selon les spécifications du service. Ce n'est ni plus, ni moins qu'un chevauchement vertical. C'est le même problème avec les APIs que tu intègres dans ton code.
    2. Si des systèmes "dialoguent" grâce à un médiateur. C'est au médiateur que revient la charge du TI. Le médiateur étant un "Maître" et les systèmes des esclaves. On retourne encore une fois à un chevauchement verticale.
    3. Il existe des systèmes qui "dialoguent" selon un modèle d'auto-gestion. Dans ce cas il y a effectivement un risque de chevauchement. Néanmoins, je reste persuadé que pour un "Use Case" (ou une "User Story") donné(e), il y a toujours l'initiative d'un des deux systèmes. Si les deux peuvent être à l'initiative de l'échange, ce seront des scénarios légèrement différents qui méritent d'être testés par chacun.
      Il est également possible qu'en l'absence de médiateur, il y ait une meta-instance qui en joue le rôle. Par exemple sur un très gros projet, en plus de la spécification de tous les composants, il y avait une spécification "Business". C'était donc le rôle de ce meta-"composant" d'assurer que l'ensemble s'intégrait correctement.


    Pour la forme une série d'infographie intéressante sur la livraison continue mais qui aborde de nombreux sujets évoqués ici : http://java.dzone.com/articles/illus...nd-visualizing
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  2. #62
    Membre émérite
    Inscrit en
    janvier 2011
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : janvier 2011
    Messages : 805
    Points : 2 912
    Points
    2 912
    Par défaut
    Citation Envoyé par Nemek Voir le message
    T'as vraiment confiance à ce point en ton code pour dire qu'il n'y a pas de bugs dans ton application ?
    A chaque fois que tu mockes un système tu fais des hypothèses sur celui-ci. ...
    C'est là le coeur du problème. Tu as complètement raison, tous les développeurs supposent des choses en mockant. Plus précisément, ils supposent que la dépendance mockée est réellement capable d'accepter les valeurs qu'on lui passe en entrée dans le test, ou qu'elle va réellement se comporter de la manière dont on la bouchonne. Mais la plupart des développeurs ne testent jamais que ces suppositions sont vraies.

    Or, il est simple de rajouter des tests pour vérifier cela. C'est l'approche Contract Tests. Concrètement, pour chaque supposition faite dans les tests que la dépendance D a le comportement de retourner une valeur v, on crée un test en plus qui spécifie dans quel scénario cela est possible et qui asserte que D retourne bien v. Idem pour les valeurs d'entrée. Et la bonne nouvelle, c'est que les contract tests sont eux aussi des TU. On se contente d'appliquer les bons stimulus à l'objet sans avoir à recréer toute l'étendue de son écosystème.

    Une autre manière de s'assurer que ces suppositions tiennent la route est d'utiliser Design By Contract, avec des pré-conditions directement intégrées aux méthodes du code de production. Ainsi, toute supposition utilisant des valeurs d'entrée invalides est immédiatement rejetée par le système à l'exécution (voire à la compilation).

    Je ne conseillerais pas cette approche dans tous les cas, mais c'est une bonne manière de faire si on veut avoir une totale confiance dans les couches internes de son code et que la fiabilité du système est importante. En plus, cela évite d'avoir trop recours aux tests d'intégration.

    Citation Envoyé par Nemek Voir le message
    Pourtant qu'un TI provoque le même scénario de test qu'un (ou plusieurs) TU(s) ne te choquent surement pas ?
    Non car mes TI sont en général un ordre de grandeur moins nombreux que mes TU et les TU s'exécutent plus vite. Dans un scénario ou la majorité des tests sont des TI qui essaient de couvrir autant que ce qui aurait été couvert par des TU, un chevauchement me parait plus problématique.

    cf http://martinfowler.com/bliki/TestPyramid.html

Discussions similaires

  1. problème non identifié (boucle peut être ?)
    Par cldlk dans le forum Débuter
    Réponses: 7
    Dernier message: 22/10/2014, 07h55
  2. Le TDD est mort ? non, pas vraiment, peut-être que oui
    Par Arsene Newman dans le forum Méthodes Agiles
    Réponses: 30
    Dernier message: 12/06/2014, 11h31
  3. 2 ans XP, c'est le moment de changer (peut être)
    Par harry85 dans le forum Salaires
    Réponses: 6
    Dernier message: 02/06/2010, 15h01
  4. Comment pas donnée peut être égale 0
    Par edonis dans le forum IHM
    Réponses: 1
    Dernier message: 01/02/2008, 22h26
  5. Réponses: 15
    Dernier message: 19/09/2007, 19h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo