Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent TencéAgile Montréal
Automatiser les tests d’acceptation : comment s’y prendre?
Si vous rencontrez des défis dans l’automatisation de vos tests d’acceptation ou si vous vous posez des questions sur la meilleure marche à suivre, cette séance est pour vous.
Découvrez comment mettre en place une batterie de tests d’acceptation utile et maintenable en ayant du plaisir à le faire. Attention, code en vue!
À propos de Vincent Tencé
Vincent a la passion du développement logiciel. Il œuvre à construire un monde meilleur dans lequel les logiciels enrichissent et simplifient nos vies. Au cours de sa carrière, il a participé à de nombreux projets de développement logiciel dans une grande variété d’industries, que ce soit en tant que coéquipier, Scrum Master, Product Owner ou coach. Il est un fervent promoteur de l’Agilité depuis ses premières expériences avec Extreme Programming en 2000 et Scrum en 2002. À Pyxis, il occupe son temps à changer le monde soit une ligne de code à la fois soit en enseignant Scrum quelque part sur la planète.
Vincent s’intéresse tout particulièrement au développement piloté par les tests (test-driven development), aux sciences cognitives et aux systèmes décentralisés. Il est un ingénieur diplômé de l’École Nationale de l’Aéronautique et de l’Espace (Toulouse, France). Il est également titulaire d’un MBA du Collège des Ingénieurs (Paris, France).
Automatiser les tests d'acceptation : comment s'y prendre ?Vincent Tencé
Session présentée à Agile Tour Montréal 2016
Si vous rencontrez des défis dans l’automatisation de vos tests d’acceptation ou si vous vous posez des questions sur la meilleure marche à suivre, cette séance est pour vous.
Découvrez comment mettre en place une batterie de tests d’acceptation utile et pérenne en ayant du plaisir à le faire. Attention, code en vue !
Une révision des principaux concepts du langage JavaScript : variables, fonctions, types, fermetures (closures), objets et prototypes, format JSON. De nombreux exemples téléchargeables sur GitHub.
Nouveautés JavaScript dans le monde Microsoftdavrous
Présentation delivrée le 19 mars 2015 lors du JavaScript Open Day: http://www.meetup.com/Javascript-Open-Day/events/220087351/
Au programme: les nouveautés du moteur du projet Spartan comme Web Audio ou ECMAScript 6
Le développement d'applications lourdes à base de JavaScript est désormais possible. Cependant, cela requiert de bien connaître le langage en lui-même ainsi que les meilleurs patterns et pratiques établit ces 10 dernières années à travers des frameworks comme YUI ou jQuery par exemple. Vous verrez donc ici comment bien structurer votre code, comment utiliser des approches permettant de palier à certaines limitations de JS et comment également industrialiser le code grâce à la mise en place de tests unitaires.
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent TencéAgile Montréal
Automatiser les tests d’acceptation : comment s’y prendre?
Si vous rencontrez des défis dans l’automatisation de vos tests d’acceptation ou si vous vous posez des questions sur la meilleure marche à suivre, cette séance est pour vous.
Découvrez comment mettre en place une batterie de tests d’acceptation utile et maintenable en ayant du plaisir à le faire. Attention, code en vue!
À propos de Vincent Tencé
Vincent a la passion du développement logiciel. Il œuvre à construire un monde meilleur dans lequel les logiciels enrichissent et simplifient nos vies. Au cours de sa carrière, il a participé à de nombreux projets de développement logiciel dans une grande variété d’industries, que ce soit en tant que coéquipier, Scrum Master, Product Owner ou coach. Il est un fervent promoteur de l’Agilité depuis ses premières expériences avec Extreme Programming en 2000 et Scrum en 2002. À Pyxis, il occupe son temps à changer le monde soit une ligne de code à la fois soit en enseignant Scrum quelque part sur la planète.
Vincent s’intéresse tout particulièrement au développement piloté par les tests (test-driven development), aux sciences cognitives et aux systèmes décentralisés. Il est un ingénieur diplômé de l’École Nationale de l’Aéronautique et de l’Espace (Toulouse, France). Il est également titulaire d’un MBA du Collège des Ingénieurs (Paris, France).
Automatiser les tests d'acceptation : comment s'y prendre ?Vincent Tencé
Session présentée à Agile Tour Montréal 2016
Si vous rencontrez des défis dans l’automatisation de vos tests d’acceptation ou si vous vous posez des questions sur la meilleure marche à suivre, cette séance est pour vous.
Découvrez comment mettre en place une batterie de tests d’acceptation utile et pérenne en ayant du plaisir à le faire. Attention, code en vue !
Une révision des principaux concepts du langage JavaScript : variables, fonctions, types, fermetures (closures), objets et prototypes, format JSON. De nombreux exemples téléchargeables sur GitHub.
Nouveautés JavaScript dans le monde Microsoftdavrous
Présentation delivrée le 19 mars 2015 lors du JavaScript Open Day: http://www.meetup.com/Javascript-Open-Day/events/220087351/
Au programme: les nouveautés du moteur du projet Spartan comme Web Audio ou ECMAScript 6
Le développement d'applications lourdes à base de JavaScript est désormais possible. Cependant, cela requiert de bien connaître le langage en lui-même ainsi que les meilleurs patterns et pratiques établit ces 10 dernières années à travers des frameworks comme YUI ou jQuery par exemple. Vous verrez donc ici comment bien structurer votre code, comment utiliser des approches permettant de palier à certaines limitations de JS et comment également industrialiser le code grâce à la mise en place de tests unitaires.
Rappels d'ordre général sur les tests automatisés (unitaires, fonctionnels, de comportement), suivis d'une introduction à l'écriture de tests unitaires avec PHPUnit. Orienté PHP.
JavaScript est désormais omniprésent et rend possible l'écriture d'applications complexes et riches. Mais il est souvent mal connu des développeurs orientés objets classiques comme ceux pratiquant le C#, le Java ou le PHP. Cette session passera donc en revue les bases du langage JavaScript, ses spécificités comme les portées, les closures, le this différent de ce que vous pouvez connaître. Bref, vous verrez qu'il y a des pièges à éviter et qu'il ne faut pas négliger JavaScript. Il est très puissant mais potentiellement différent de ce vous connaissez déjà. Venez apprendre à le respecter avant de le maitriser!
Persona est un système d'identité fédéré qui met l'emphase sur la protection de la vie privée et la convivialité tout en facilitant le travail des développeurs Web. Cette présentation a pour but d'introduire ce système et les éléments de cryptographies sur lesquels il repose ainsi que de donner un exemple concret de son utilisation dans une application Web.
Quelle place pour le framework Rails dans le développement d'application web5pidou
Cette présentation a été réalisée dans le cadre des Rencontres Mondiales décentralisées du Logiciel Libre (RMLLd) qui se sont déroulées du 1er au 3 Juillet 2011 à Saint-Joseph (Ile de la Réunion).
Decouvrez les particularités de JavaScript qui vous aideront à débogguer sans craindre ce langage aujourd'hui indispensable.
- la portée des variables et comment ne pas polluer l'espace global
- comprendre le mot clé this
- les particularités des fonctions
- introduction aux namespaces
Loin de la théorie vous aurez des explications pratiques et des démos de code ainsi que les bonnes pratiques.
Tester unitairement une application javaAntoine Rey
Présente les différents types de tests automatisés, les objectifs des tests unitaires, les stratégies de mise en œuvre, les bonnes pratiques, les difficultés, ce qu'est un mock, différents outils (Unitils, Mockito, DbUnit, Spring Test) et des exemples de tests (DAO et contrôleurs Spring MVC), sans oublier le test de code legacy.
Fort de ses 1.7 millions de téléchargements l'an passé, Groovy continue son bonhomme de chemin en tête parmi les langages de programmation alternatifs pour la JVM.
Groovy 2.0, sorti l'an passé, introduisait dans son offre de la modularité, le support de JDK 7 au niveau syntaxique avec "Project Coin" autant qu'au niveau JVM avec l'utilisation d'"invoke dynamic", et proposait des fonctionnalités de typage et de compilation statique.
Groovy 2.1, quant à lui, s'appuie sur ces bases pour compléter le support d'"invoke dynamic" pour plus de performances. Il propose des améliorations permettant de documenter, d'aider les IDEs, et de vérifier statiquement les Domain-Specific Languages construits avec Groovy. Vous pourrez créer des méta-annotations regroupant d'autres annotations, pour éviter l'annotation "hell". Et enfin, vous irez encore plus loin dans la customisation du compilateur !
Accrochez votre ceinture, paré au décollage !
Bien que Docker soit facile d'utilisation, construire une image reste un exercice compliqué.
Optimisation, layers, et sécurité nécessitent de s'abstraire des Dockerfile basiques qu'on peut trouver sur internet.
Dans ce BBL, nous verrons comment bien packager une application Spring Boot dans une image Docker/OCI.
Nous allons parcourir les bonnes pratiques préconisées par Spring, les pièges à éviter, comment bien écrire un Dockerfile pour optimiser la construction et l'image finale pour une exécution dans Kubernetes et nous verrons aussi des moyens alternatifs de construction d'images Spring Boot et l'outillage d'analyse à ajouter à votre toolbox.
Cette présentation a pour but de faire office de boite à outils du developpeur elgg. Pour le moment ce n'est qu'un brouillon n'hèsitez pas à laisser des commentaires si vous pensez qu'il manque quelque chose.
Rappels d'ordre général sur les tests automatisés (unitaires, fonctionnels, de comportement), suivis d'une introduction à l'écriture de tests unitaires avec PHPUnit. Orienté PHP.
JavaScript est désormais omniprésent et rend possible l'écriture d'applications complexes et riches. Mais il est souvent mal connu des développeurs orientés objets classiques comme ceux pratiquant le C#, le Java ou le PHP. Cette session passera donc en revue les bases du langage JavaScript, ses spécificités comme les portées, les closures, le this différent de ce que vous pouvez connaître. Bref, vous verrez qu'il y a des pièges à éviter et qu'il ne faut pas négliger JavaScript. Il est très puissant mais potentiellement différent de ce vous connaissez déjà. Venez apprendre à le respecter avant de le maitriser!
Persona est un système d'identité fédéré qui met l'emphase sur la protection de la vie privée et la convivialité tout en facilitant le travail des développeurs Web. Cette présentation a pour but d'introduire ce système et les éléments de cryptographies sur lesquels il repose ainsi que de donner un exemple concret de son utilisation dans une application Web.
Quelle place pour le framework Rails dans le développement d'application web5pidou
Cette présentation a été réalisée dans le cadre des Rencontres Mondiales décentralisées du Logiciel Libre (RMLLd) qui se sont déroulées du 1er au 3 Juillet 2011 à Saint-Joseph (Ile de la Réunion).
Decouvrez les particularités de JavaScript qui vous aideront à débogguer sans craindre ce langage aujourd'hui indispensable.
- la portée des variables et comment ne pas polluer l'espace global
- comprendre le mot clé this
- les particularités des fonctions
- introduction aux namespaces
Loin de la théorie vous aurez des explications pratiques et des démos de code ainsi que les bonnes pratiques.
Tester unitairement une application javaAntoine Rey
Présente les différents types de tests automatisés, les objectifs des tests unitaires, les stratégies de mise en œuvre, les bonnes pratiques, les difficultés, ce qu'est un mock, différents outils (Unitils, Mockito, DbUnit, Spring Test) et des exemples de tests (DAO et contrôleurs Spring MVC), sans oublier le test de code legacy.
Fort de ses 1.7 millions de téléchargements l'an passé, Groovy continue son bonhomme de chemin en tête parmi les langages de programmation alternatifs pour la JVM.
Groovy 2.0, sorti l'an passé, introduisait dans son offre de la modularité, le support de JDK 7 au niveau syntaxique avec "Project Coin" autant qu'au niveau JVM avec l'utilisation d'"invoke dynamic", et proposait des fonctionnalités de typage et de compilation statique.
Groovy 2.1, quant à lui, s'appuie sur ces bases pour compléter le support d'"invoke dynamic" pour plus de performances. Il propose des améliorations permettant de documenter, d'aider les IDEs, et de vérifier statiquement les Domain-Specific Languages construits avec Groovy. Vous pourrez créer des méta-annotations regroupant d'autres annotations, pour éviter l'annotation "hell". Et enfin, vous irez encore plus loin dans la customisation du compilateur !
Accrochez votre ceinture, paré au décollage !
Bien que Docker soit facile d'utilisation, construire une image reste un exercice compliqué.
Optimisation, layers, et sécurité nécessitent de s'abstraire des Dockerfile basiques qu'on peut trouver sur internet.
Dans ce BBL, nous verrons comment bien packager une application Spring Boot dans une image Docker/OCI.
Nous allons parcourir les bonnes pratiques préconisées par Spring, les pièges à éviter, comment bien écrire un Dockerfile pour optimiser la construction et l'image finale pour une exécution dans Kubernetes et nous verrons aussi des moyens alternatifs de construction d'images Spring Boot et l'outillage d'analyse à ajouter à votre toolbox.
Cette présentation a pour but de faire office de boite à outils du developpeur elgg. Pour le moment ce n'est qu'un brouillon n'hèsitez pas à laisser des commentaires si vous pensez qu'il manque quelque chose.
Similaire à Living Documentation (TDD, BDD).pptx (20)
1. The document discusses the challenges of building software in a chaotic world, noting that building software is not a linear process and involves much uncertainty.
2. It emphasizes the importance of taking an iterative approach to reduce risks, having a strong user-centered vision rather than being user-led, and focusing on building the right product for the right customer.
3. The author advocates for viewing building software as a human activity involving technical and social complexity, and notes that processes, coordination across and within teams, and roles like product management are important for navigating this complex work.
The document discusses mutation testing and provides tips for implementing it. It explains different types of mutations like statement, value, and decision mutations. It also discusses how to calculate mutation score and challenges like cost. Examples are provided using tools like Pitest and Stryker. Advice is given around using mocks, refactoring complex code, and targeting tests to improve mutation testing.
This document discusses functional programming concepts. It explains that functional programming treats functions as first-class citizens and avoids side effects. Pure functions are easier to reason about because their outputs only depend on their inputs. The document also discusses avoiding null values and exceptions by using options and monads. Functional programming encourages immutability, referential transparency, and honesty in function signatures to make code more readable and easier to test.
This document provides an overview of domain-driven design (DDD) based on a feedback session in Amsterdam. It discusses:
1. What DDD is and is not - it is not a method, framework, or tool but has concepts like ubiquitous language, domain model, bounded contexts, and event sourcing.
2. Key DDD principles like having domain experts define the problem and solution, using a ubiquitous language, and designing bounded contexts to separate concerns while maintaining relationships.
3. Techniques for exploring a domain like event storming, user personas, acceptance tests, and distilling the core vs. support domains.
4. Architectural approaches like hexagonal/ports and adapters and
Que se passe t il avec l'Agilité en 2020. Crise de confiance? Manque d'évolutions? La crise du Covid19 a t elle permis de développer l'agilité dans les entreprises. Allons voir...
https://www.youtube.com/watch?v=URO7195UIdM&feature=youtu.be
Sous le feu des critiques: Trop moderne! Pas assez subversive aux yeux de certains! Pas créative! Un effet de mode passager pour les "djeunz"! Ou pire une musique de drogués!! Permettez moi au cours de cette session de vous éclairer sur cette culture et également sur les coulisses de la création des musiques assistées par ordinateur (MAO), et de voir ensemble les relations intéressantes que l'on peut tisser avec nos pratiques du développement logiciel (Software Craftsmanship).
On a pu lire quelques analogies entre pratique des musiques jazz, somme toute une musique très classique, et la pratique du développement logiciel tel que nous la concevons tous ici ("agile" diront certain). Pourtant il y a bien des façons de faire de la musique et en tant que spécialistes de la programmation j'ai été étonné de constater que peu d'entre nous s’intéressent à la musique dite "électronique". Pourtant, dans ces musiques aussi, nous nous servons d'outils logiciels au service de notre inspiration et notre créativité. On retrouve l'approche incrémentale, la technique imposée par les machines, des patterns évidemment, mais aussi de la pratique répétée, de l'amélioration continue et la coopération quand nous formons des groupes collaboratifs.
Au cours de cette session, après les généralités d'usage, je vous montrerai un DAW (digital audio workstation) logiciel, très couramment employé, et pas que pour la musique électronique, j'ai nommé "Live 9" d'Ableton avec sa surface de contrôle dédiée: Push (une sorte de clavier multi-fonctions pour la musique). Live est également extensible grâce à Max MSP, une API de programmation qui permet de scripter/patcher ce logiciel sous bien des formes.
J'espère vous montrer que création et programmation ne sont pas si éloignés que cela... et vous ferai partager mon expérience au sein de la Do It Yourself Music Academy
Collaboration avec le client plutôt que négociation de contrat » est certes l'un des 4 piliers du manifeste agile. Mais quel client, quel fournisseur seraient capables de démarrer un projet sans contrat? Cette présentation n'a pas pour objectif de vous donner la solution clés en main mais d'ouvrir le débat après avoir dépeint les solutions disponibles et donné des pistes de réflexion
4. It is more important to
communicate to humans with
your code
than to communicate with a
machine.
Bob C. Martin
5. Quels écueils ?
➔ Avoir de la documentation non alignée et pas à jour
◆ dès qu’une ligne de code change, le comportement
change et la documentation est obsolète
◆ dès qu’une ligne de spécification change, aussi
◆ on sent le besoin d’un lien entre les deux !!!
➔ Documentation qui n’a pas public
➔ Documentation illisible pour son public
➔ De la documentation inutile
◆ données que l’on a déjà ou qui se trouvent ailleurs
(redondance)
◆ Informations inutiles (OSF)
7. Est ce bien le code qu’il faut documenter?
Le code, s’il est bien écrit peut être très expressif:
➔ les noms sont importants:
◆ variables
◆ fonctions
◆ classes
➔ Sujets, verbes et compléments forment des phrases
➔ Les fonctions font !
➔ Les fonctions sont fonctionnelles
➔ A l’intérieur du code, qui lit? qui va comprendre? qu’est
ce qu’il y a comprendre?
➔ Essayez: fluent programming
➔ Essayez: functionnal programming
➔ Pensez à HATHEOAS
8. DRY !!!
➔ Uniquement des informations pertinentes
➔ Aucune redondance
➔ De l’information utile
➔ Qui donne du sens
➔ Qui soit compréhensible
Le code c’est “COMMENT”
Ce serait bien de documenter le POURQUOI ? !!!
Relisez 3 fois le code pour savoir ce qu’il contient déjà...
et ré-écrivez le!
9. Redondant ?
//ceci est une calculateur qui calcule
public class Calculateur
{
//renvoit le résultat de a additioné à b
public double Additionne (double a, double b )
{
}
10. Redondant ?
//ceci est une calculateur qui calcule
public class Calculateur
{
//renvoit le résultat de a additioné à b
public double Additionne (double a, double b )
{
return a - b;
}
// mais c’est pas grave ;)
11. Compliqué ? Laid ?
static void Main()
{
try
{
// Iterate through all plug-ins.
foreach (var filePath in Directory.GetFiles(Constants.PluginPath, Constants.PluginSearchPattern))
{
// Create the plug-in AppDomain setup.
var pluginAppDomainSetup = new AppDomainSetup();
pluginAppDomainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
// Create the plug-in AppDomain with the setup.
var plugInAppDomain = AppDomain.CreateDomain(filePath, null, pluginAppDomainSetup);
// Pass the plug-in file path to the AppDomain
var pluginContext = new PluginContext { FilePath = filePath };
plugInAppDomain.SetData(Constants.PluginContextKey, pluginContext);
// Execute the loader in the plug-in AppDomain's context.
// This will also execute the plug-in.
plugInAppDomain.DoCallBack(PluginCallback);
// Retrieve the flag if the plug-in has executed and can be deleted.
pluginContext = plugInAppDomain.GetData(Constants.PluginContextKey) as PluginContext;
// Unload the plug-in AppDomain.
AppDomain.Unload(plugInAppDomain);
// Delete the plug-in if applicable.
if (pluginContext != null && pluginContext.CanDeletePlugin)
{
File.Delete(filePath);
}
}
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
12. public class JeFaisDesTrucsSuper {
public int JeLeFaisAvecUnUtilisateur() {
//je regarde si je connais l'utilisateur
if (e.AddedItems.Count > 0)
{ details.InitializeWith(e.AddedItems[0] as Model.Definition.AppointmentOrTask);
MainGrid.ColumnDefinitions.Add(DetailsAreVisible); }
else MainGrid.ColumnDefinitions.Add(DetailsAreInvisible);
//je vais lui demander son année de naissance
if (Sort == null) return false;
Sort.IsAcsending = Sort.IsAcsending.HasValue && !Sort.IsAcsending.Value;
var items = List.ItemsSource.Cast<object>();
List.ItemsSource = Sort.IsAcsending.Value
? items.OrderBy(o => SortBy.GetValue(o, null))
: items.OrderByDescending(o => SortBy.GetValue(o, null));
//je vais mémoriser son choix
//je vais générer une chiffre au hasard
//je vais demander l'age du captain
//je vais additionner tout cela
//et dire à l'utilisateur que j'ai trouvé son chiffre porte bonheur
13. //je vais le mémoriser aussi
using (var dbCommand = Sqlbase.CreateCommand (connection,
defautCommandTimeOutForSelectStatement, selectCommand, CommandType.Text, spParams))
{
Log.Write (LogLevel.Verbose, "Sql.Select: {0} with params: {1}", selectCommand.Replace
("rn", " "), DisplayParamsDetails (spParams));
IDbTransaction transaction = null;
if (isolation != IsolationLevel.Unspecified) {
transaction = connection.BeginTransaction (isolation);
dbCommand.Transaction = transaction;
}
}
//et je renvoie, on ne sait jamais
return x;
}
}
//fin de ma fonction
15. public class JeFaisDesTrucsSuperMaisEnMieux
{
public int JeLeFaisAvecUnUtilisateur(IParleALUtilisateur ui,
IStockeDesTrucs stockage)
{
//je regarde si je connais l'utilisateur
var esTuConnu = ui.Utilisateur.DemandeIdentite();
if (esTuConnu)
return -1;
//je vais lui demander son année de naissance
var anneeNaissance = ui.QuelEstTonAnneeDeNaissance();
//je vais mémoriser son choix
var resultatStockage = stockage.Sauvegarde( anneeNaissance,
ui.Utilisateur.IdentifiantUniversel );
16. public class JeFaisDesTrucsSuperMaisEnMieux
{
public int JeLeFaisAvecUnUtilisateur(IParleALUtilisateur ui,
IStockeDesTrucs stockage)
{
var esTuConnu = ui.Utilisateur.DemandeIdentite();
if (esTuConnu)
return -1;
var anneeNaissance = ui.QuelEstTonAnneeDeNaissance();
var resultatStockage = stockage.Sauvegarde( anneeNaissance,
ui.Utilisateur.IdentifiantUniversel );
17. Et quand on en a marre de lire le code..
Quelle serait la place pour une documentation efficace?
Un document électronique qui n’est pas le code mais “entre” le code et les
spécifications...
Mais bon sang, c’est bien sûr....
19. public class JeFaisDesTrucsSuperMaisEnMieux
{
public int JeLeFaisAvecUnUtilisateur(IParleALUtilisateur ui,
IStockeDesTrucs stockage)
{
var esTuConnu = ui.Utilisateur.DemandeIdentite();
if (esTuConnu)
return -1;
var anneeNaissance = ui.QuelEstTonAnneeDeNaissance();
var resultatStockage = stockage.Sauvegarde( anneeNaissance,
ui.Utilisateur.IdentifiantUniversel );
20. [TestFixture ()]
public class TesteLeStockage
{
[Test ()]
public void LeStockageDoitMemoriserUneValeurPourUnUtilisateur ()
{ //arrange
int valeurAStocker = 101;
int IdUser = 1;
IJeStocke sut = depencyInjection.Get<IJeStocke> ();
//act
var resultatStockage = sut.Stocke (valeurAStocker, IdUser);
sut.ResetConnection();
int verificationValeur = 0;
var resultatLecture = sut.Lecture (out verificationValeur, IdUser);
//assert
Assert.That(verificationValeur , Is.EqualTo(valeurAStocker));
}
}
21. Les Tests Unitaires
• Ils décrivent ce qui est attendu
• Ils “déclenchent” le code
• Ils sont organisés avec le code
• Si le comportement du code change, au
moins un de mes tests passe au rouge
(sinon j’ai un souci...)
• Donc ils vivent avec le code
• Et si mes tests pouvaient être écrits dans un
langage compréhensible par tous...
23. [TestFixture ()]
public class TesteLeStockage
{
[Test ()]
public void LeStockageDoitMemoriserUneValeurPourUnUtilisateur ()
{
int valeurAStocker = 101;
int IdUser = 1;
IJeStocke sut = depencyInjection.Get<IJeStocke> ();
var resultatStockage = sut.Stocke (valeurAStocker, IdUser);
sut.ResetConnection();
int verificationValeur = 0;
var resultatLecture = sut.Lecture (out verificationValeur, IdUser);
Assert.That(verificationValeur , Is.EqualTo(valeurAStocker));
}
}
24. Behaviors Driven Tests
Une syntaxe simple et légère
• Given
• When
• Then
Des utilitaires pour faire tourner les tests basés sur *Unit
* au choix: J/N/JS/x/....
Pas la peine d’en faire plus!
25. Scenario: Le Stockage Doit Memoriser Une Valeur Pour
Un Utilisateur
Given j’initialise correctement mon test
And j’ai un utilisateur ‘1’ connecté
When je sauve la valeur ‘101’
And je réinitialise le système
And je lis la valeur stockée
Alors le résultat de lecture est ‘101’
27. Scenario: Le Stockage Doit Memoriser Une Valeur Pour
Un Autre Utilisateur
Given j’initialise correctement mon test
And j’ai un utilisateur ‘222’ connecté
When je sauve la valeur ‘33333’
And je réinitialise le système
And je lis la valeur stockée
Alors le résultat de lecture est ‘3333’
30. Executable Steps (2)
[Given(@"j’ai un utilisateur ‘(.*)’ connecté")]
public void GivenTestInit(string x)
{
int IdUser = int.Parse( x );
}
31. Regular expressions
Pour l’instant la seule manière de passer du
langage naturel à une expression comprise
par la machine...
Des idées pour le futur ?
33. Step to Step
[Given(@"j’ai un utilisateur ‘[([0-9]+)]’ connecté")]
public void GivenTestInit(int x)
{
int IdUser = x ;
ScenarioContext.Current.Set(IdUser, “IdUser”);
}
34. Step to Step
[When(@" je sauve la valeur ‘‘[([0-9]+)]’’")]
public void WhenValueIsSaved(int valeurAStocker)
{
var IdUser = ScenarioContext.Current.Get<int>(
“IdUser”);
var resultatStockage = sut.Stocke (valeurAStocker,
IdUser);
Assert.That (resultatStockage, Is.True);
}
36. Talking to objects
Objects = instance de classe
Class = abstraction, concept
Interface = contrat, capacité de comportement
37. Inter-active Steps
[When(@" je sauve la valeur ‘‘[([0-9]+)]’’")]
public void WhenValueIsSaved(int valeurAStocker)
{
var IdUser = ScenarioContext.Current.Get<int>( “IdUser”);
var sut = ScenarioContext.Current.Get<IJeStocke>
( “CurrentTestStorage”);
var resultatStockage = sut.Stocke (valeurAStocker, IdUser);
Assert.That (resultatStockage, Is.True);
}
38. public interface IJeStocke
{
int Stocke (int valeur, int identifiantUniversel);
int Lecture (out int valeur, int
identifiantUniversel);
}
42. Interfaces : the human side of objects
La documentation à travers les spécifications
exécutables est le reflet des interfaces objets
dans le monde des humains.
43. public interface IJeStocke
{
int JeSauve (int valeur, int identifiantUniversel);
int JeLis (out int valeur, int identifiantUniversel);
}
44. public interface IEntrepot
{
int JeSauve (int valeur, int identifiantUniversel);
int JeLis (out int valeur, int identifiantUniversel);
}
45. public class NoSqlQuiPoutre : IEntrepot
{
public int JeSauve (int valeur, int identifiantUniversel)
{ ............;}
public int JeLis (out int valeur, int identifiantUniversel)
{ ............;}
}
AI JE BESOIN DE COMMENTAIRES ???
46. [TestFixture ()]
public class TesteLeStockage
{
[Test ()]
public void LeStockageDoitMemoriserUneValeurPourUnUtilisateur ()
{
int valeurAStocker = 101;
int IdUser = 1;
IJeStocke sut = depencyInjection.Get<IJeStocke> ();
var resultatStockage = sut.JeSauve (valeurAStocker, IdUser);
sut.ResetConnection();
int verificationValeur = 0;
var resultatLecture = sut.JeLis (out verificationValeur, IdUser);
} }
Change the way you code
47. What are interfaces (really) ?
Du rôle des interfaces
Ainsi « l’interface devient le produit et l’objet du service ». Elle n’est
plus un espace de commande utilisable, elle est la représentation
du service, son usage et sa finalité symbolique, cognitive et
esthétique.
http://www.nodesign.net/blog/vers-un-confort-numerique-moderne/
Les Interfaces doivent être ergonomiques
https://goo.gl/WUEh48
52. Inter-active Steps
[When(@" je sauve la valeur ‘‘[([0-9]+)]’’")]
public void WhenValueIsSaved(int valeurAStocker)
{
var IdUser = ScenarioContext.Current.Get<IUtilisateur>(
“User”);
var sut = ScenarioContext.Current.Get<IJeStocke>
( “CurrentTestStorage”);
var resultatStockage = sut.Stocke (valeurAStocker, IdUser);
Assert.That (resultatStockage, Is.True);
}
57. Writing Test First
Feature: identification avec des jetons
Scenario: Un utilisateur est identifié
Given j’initialise correctement mon test
And j’ai un jeton égal à x10103
When je demande à identifier l’utilisateur avec ce jeton
Alors le résultat est ok
58. public class UtilisateurAJetons : IUtilisateur
{
#region IUtilisateur implementation
bool IUtilisateur.DemandeIdentite (Icredential credits)
{
throw new NotImplementedException ();
}
int IUtilisateur.DonneAnneeNaissance ()
{
throw new NotImplementedException ();
}
#endregion
}
59. Reusing Tests
Feature: identification avec Facebook
Scenario: Un utilisateur est identifié
Given j’initialise correctement mon test
And j’ai un jeton égal à FB44103
When je demande à identifier l’utilisateur avec ce jeton
Alors le résultat est ok
60. public class UtilisateurFacebook : IUtilisateur
{
#region IUtilisateur implementation
bool IUtilisateur.DemandeIdentite (Icredential credits)
{
throw new NotImplementedException ();
}
int IUtilisateur.DonneAnneeNaissance ()
{
throw new NotImplementedException ();
}
#endregion
}
62. Est ce que mon test est lisible ?
⇥
Est ce que j’ai bien ré-utilisé mes steps ?
⇥
Est ce que j’ai généralisé les bons concepts ?
⇥
Design des interfaces et des objets
65. Scenario: L’ Utilisateur doit pouvoir saisir une année de
naissance
Given j’initialise correctement le système graphique
And j’ai un utilisateur ‘1’ connecté
When l’ utilisateur saisi la valeur ‘1970’
Alors le résultat de Utilisateur[1].AnnéeDeNaissance est
‘1970’
66. Scenario: L’ Utilisateur doit pouvoir saisir une année de
naissance
Given j’initialise correctement le système graphique
And j’ai un utilisateur ‘1’ connecté
When l’ utilisateur saisi la valeur ‘1970’
Alors le résultat de Utilisateur[1].AnnéeDeNaissance est
‘1970’
Action/Verbe (step ré-utilisable)
Concept (ré-utilisable) ⇒ interface
73. Les tests dépendent de la vision du
logiciel que l’on a
et comment on le construit
74. Développeur = Testeur
Integration testing: Testing continuously evolving modules (with
defined expected actual outcome)
User acceptance testing: User representative testing (with defined
expected actual outcome)
Sanity testing: Testing after multiple builds (with defined expected
actual outcome)
Smoke testing: Testing after every build (with defined expected
actual outcome)
Exploratory testing: Unplanned and unscripted testing (no defined
expected actual outcome)
Regression testing: End-to-end testing done to ensure that
nothing is broken in the integrating modules -
https://www.scrumalliance.org/community/articles/2013/march/agile-methodology-is-not-all-about-
exploratory-tes#sthash.QEmYsyLg.dpuf
75. Yes, TDD has a cost!
• In 2008 Microsoft Research study and results published
in a paper Realizing quality improvement through test
driven development: results and experiences of four
industrial teams, by Nachi Nagappan and research
colleagues E. Michael Maximilien of IBM
• What the research team found was that the TDD teams
produced code that was 60 to 90 percent better in
terms of defect density than non-TDD teams.
• They also discovered that TDD teams took longer to
complete their projects—15 to 35 percent longer.
77. Gherkin / Cucumber / Specflow
fichiers textuels (.feature)
⇥ convertisseur html/pdf
⇥ liaison avec le repository de code (changes)
⇥ liaison avec le Product Backlog (UC / WI)
⇥ production de la documentation concernant
le release
⇥ mise au format du RQ/QA
⇥ signature.
78. REX
Documentation de 2000+ pages générée à la demande.
Générées automatiquement sans aucun effort ( ...
maintenant que les automatismes sont en place)
Personne de l’assurance qualité ne les lit, mais ils les
signent !
Les tests verts n’ont jamais tort!
Un bug = un test manque pour couvrir le cas rencontré.
79. Des développeurs essayent de se
rapprocher du fonctionnel
Et l’inverse ?
Specification by Exemple...