Partie 4 de cette série d'articles, qui va cette fois se concentrer sur la couverture du code par les tests unitaires, grâce à un outil nommé: NCover. Je ne rentre dans dans les détails sur ce qu'est capable de faire cet outil, leur site est très fourni à ce niveau là. Par contre pour ceux qui ne connaissent pas du tout, cet outil va vous permettre de lancer vos tests unitaires, et va analyser durant l'exécution des tests quelles sont les fonctions de votre code à tester qui sont appelées, et surtout celles qui ne le sont pas. Ce qui permet de savoir où orienter les tests unitaires afin de couvrir l'ensemble du code.
Tuesday 19 January 2010
Configuration d'un serveur d'intégration continue - [Partie 4] - NCover
By Michael DELVA on Tuesday 19 January 2010, 16:58 - Miscellaneous
Configuration d'un serveur d'intégration continue - [Partie 3] - FxCop
By Michael DELVA on Tuesday 19 January 2010, 10:43 - Miscellaneous
Poursuivons cette série d'articles en nous attardant désormais sur l'analyse du code des assemblies grâce à un outil que vous devez tous connaître (et si ce n'est pas le cas, je vous enjoins expressément à vous y intéresser): FxCop. D'une manière similaire à ce que nous avons fait auparavant avec les tests unitaires, nous allons là aussi "programmer" l'exécution de l'analyse dans le fichier NAnt, puis nous allons configurer Hudson pour afficher les résultats de cette analyse directement sur la page du projet.
Friday 15 January 2010
Configuration d'un serveur d'intégration continue - [Partie 2] - Tests unitaires
By Michael DELVA on Friday 15 January 2010, 16:03 - Miscellaneous
Après avoir vu dans la première partie comment installer Hudson, configurer notre premier job et notre premier fichier NAnt, nous allons maintenant voir comment lancer automatiquement dans le processus de compilation l'exécution de tous les tests unitaires de la solution, bien entendus créés avec le framework de test xUnit.
Thursday 14 January 2010
Configuration d'un serveur d'intégration continue - [Partie 1] - Les bases
By Michael DELVA on Thursday 14 January 2010, 11:20 - Miscellaneous
On trouve sur internet un paquet de tutoriaux sur la configuration de divers serveurs d'intégration continue, basés sur des solutions différentes (TeamCity, Hudson, Cruise Control.NET...), avec des options différentes (FxCop, avec ou sans tests unitaires...). Le problème est que ces tutoriaux ciblent tout le temps .NET 3.5 ou 2.0 (normal me direz vous) et que les "options" proposées ne me conviennent pas, notamment concernant les tests unitaires (Personne n'utilise donc xUnit?)
Je me suis donc efforcé de faire fonctionner un serveur d'intégration continue qui remplirait les objectifs suivants:
- Framework ciblé : .NET 4.0
- Librairie de tests unitaires : xUnit
- Utilisation d'outils d'analyse de code : FxCop
- Couverture de code : nCover
Et je me propose donc de vous en relater les étapes lors de cette série d'articles.
VS2010 et .NET 4 pour le 12 Avril prochain?
By Michael DELVA on Thursday 14 January 2010, 11:11 - .NET
Vu sur developpez.com, les sorties de Visual Studio 2010 et .NET 4 prévues pour le 12 Avril prochain, une RC en Février ?
Le compte à rebours est désormais lancé!
Nouvelle release de Code Contracts
By Michael DELVA on Thursday 14 January 2010, 10:10 - .NET
Hier soir est sortie une nouvelle release de Code Contracts, à télécharger ici.
Pour info, la release note:
Release 1.2.30113.1 (Jan 13, 2010) Contracts
- Silverlight 4 support added, Silverlight2 dropped.
- We now have a set of contract reference assemblies for the different target frameworks (3.5, 4.0, Silverlight 3.0, Silverlight 4.0). This allows contracts on newer APIs and avoids problems where the rewriter added the wrong references to the target assembly.
- Contract invariant methods now must be private.
- Invariants on auto properties are turned into pre and post conditions of the corresponding setter and getter. This permits using auto properties with contracts.
- Added more contracts to System.Linq, System.Net, System.Collections, System.Data, System.Math namespaces
- Fixed issues of referencing v3.5 assemblies with contracts from v4.0 projects
- Tweaks to extraction of contracts from VB constructors
Runtime Checker
- Makes sure contract invariant methods are not called directly
- Object invariants are now delayed until the end of the constructor to avoid checking them prematurely
- Fixes to contract inheritance that would generate bad IL.
- Avoid FxCop warnings about catching all exceptions in OldValue expressions
- Initial support for ContractIgnoredAttribute added (see documentation)
- Fix in rewriting attributes with arrays of enums
- Fixed codegen issues when removing Assert/Assumes from code
Documentation Generation
- Fixed path problems
- Fixed inheritance problems
Static Checker
- Improved handling of IsNan
- Improved error messages now include the condition in all cases (not just for other assemblies)
- Improved interval analysis
- Improved handling of box operations
- Squigglies now work in VS2010
- Fixed handling of unicode error messages in the output
- Better handling of IntPtr and UIntPtr
- Better handling of inferred mutations at method calls
- Masking of warnings at the assembly level using SuppressMessage now supported for global warnings
Monday 11 January 2010
Visual Studio 2010: "The application cannot start"
By Michael DELVA on Monday 11 January 2010, 16:21 - Visual Studio
Surprise!
Je lance Visual Studio 2010, et alors que tout fonctionnait parfaitement bien vendredi dernier, aujourd'hui monsieur me fait un caprice et ne veut plus s'ouvrir, et me donne un message d'erreur assez laconique: "The application cannot start"
Après une petite recherche sur le web, il s'avère que cette erreur peut être due à un fichier de préférences corrompu, ou bien à une tentative d'import de police non TrueType créée avec une version de VS inférieure. Comme je n'ai jamais approché de près ou de loin ce deuxième point, je me suis donc douté que ça devait bien être le fichier des préférences (Elémentaire mon cher watson).
La solution proposée, qui a très bien fonctionné pour moi: lancer VS via la ligne de commande en utilisant le flag resetuserdata:
devenv /resetuserdata
Pour info, l'exécutable de VS2010 se trouve dans ce dossier : ''C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE''
Bien évidemment, attendez vous à perdre toutes vos customisations. Pensez donc à les sauvegarder en copiant le fichier CurrentSettings.vssettings qui se trouve ici : “%USERPROFILE%\Documents\Visual Studio 2010\Settings !
Saturday 9 January 2010
VS2010: Nouvelle page de résumé pour le profiler
By Michael DELVA on Saturday 9 January 2010, 11:42 - Visual Studio
Vu sur le blog de l'équipe en charge du développement du profiler pour VS2010, les nouveautés concernant la page de résumé du profiling d'une application. A lire ici.
A lire également ici, une sorte d'introduction à comment lancer une séance de profiling grâce au raccourci clavier ALT+F2
Et pour finir, leur tout dernier article explique comment lancer une session de profiling sur une série de tests unitaires.
Bonne lecture!
Tuesday 5 January 2010
VS2010 / xUnit / Resharper : enfin, ça marche!
By Michael DELVA on Tuesday 5 January 2010, 10:43 - Visual Studio
Bonne nouvelle!
Cela faisait un moment que je tentais désespérément de lancer des tests unitaires sous VS2010 avec xUnit et Resharper 5, sans succès, comme vous vous en doutez. La seule solution avait été de recompiler le GUI de xUnit en .NET 4 et de l'utiliser pour les tests. Ce que je ne trouve pas très pratique, dans la mesure où ça oblige à jongler entre plusieurs applications. C'est toujours plus simple de rester dans son environnement de travail.
Eh bien c'est désormais possible. C'est extrêmement simple, en voici la procédure:
- Télécharger et installer la nouvelle version de Resharper 5.0, qui est désormais en Beta.
- Télécharger la dernière version de xUnit Contrib
- Installer xUnitContrib
Une fois ces 3 étapes faites, lancez VS2010 et ô surprise:

En voilà une bonne nouvelle pour une rentrée de Vacances :)
Monday 21 December 2009
Go go PEX et Code Contracts !!!
By Michael DELVA on Monday 21 December 2009, 00:34 - .NET
Si vous ne connaissez pas PEX ou Code Contracts, bonne nouvelle! Il existe un podcast en français (oui oui!) qui présente très succinctement ces 2 nouveaux outils prévus pour .NET 4.0 qui vous permettront de faciliter vos développements en TDD.
En effet, Code Contracts vous permet de définir dans le corps de vos fonctions des contrats (étonnant non?) qui vont porter sur les valeurs d'entrée et de sortie de vos fonctions. Ça vous permet d'éviter toutes ces séries de tests rébarbatives vérifiant par exemple que ArgumentNullException est bien lancée quand vous passez un null, ou qu'une fonction ne retourne jamais null. De quoi alléger un peu les test.
PEX quant à lui va vous permettre d'automatiser l'appel des fonctions avec des valeurs plus ou moins aléatoires, ce qui va vous permettre de voir dans quelle mesure vos tests unitaires couvrent bien l'intégralité des possibilités d'erreur (ou non) lorsque vous utilisez ces fonctions.
2 nouveaux outils que je trouve vraiment très intéressant et pour lesquels je pense faire prochainement des articles lorsque je commencerai à les utiliser.
Via Coq Blog.
Friday 18 December 2009
VS 2010 RC en février 2010
By Michael DELVA on Friday 18 December 2009, 17:13 - .NET
Finalement il y aura bien une nouvelle version intermédiaire de VS2010 avant la version finale:
In October, we shipped Beta 2 of Visual Studio 2010 and .NET Framework 4. Since then, we have received a lot of helpful, constructive feedback from you all. Thank you.
A lot of you have given us very positive feedback on the new capabilities of VS 2010 and .NET Framework 4 and are very happy with the breadth of value that we are poised to deliver in this release.
At the same time, you have also given us feedback around performance issues, specifically in a few key scenarios including virtual memory usage. As you may have seen, we significantly improved performance between Beta 1 and Beta 2. Based on what we’ve heard, we clearly needed to do more work. Over the last couple of months, our engineering team has been doing a push to improve performance. We have made significant progress in this space since Beta 2.
With these improvements in the product, we do want to make sure that they truly address the performance issues while continuing to maintain a high quality bar. As a result, we are going to extend the beta period by adding another interim checkpoint release, a Release Candidate with a broad “go live” license, which will be publicly available in the February 2010 timeframe.
Since the goal of the Release Candidate is to get more feedback from you, the team will need some time to react to that feedback before creating the final release build. We are therefore moving the launch of Visual Studio 2010 and .NET Framework 4 back a few weeks.
Please continue to send us your feedback. It truly has an impact on the product development process and helps us to deliver a high quality product.
On ne peut que s'en féliciter, vu le nombre de grognements de plus en plus importants des utilisateurs de l'actuelle Beta2 quant aux problèmes de performance de l'IDE.
La source originale se trouve ici.
Methode d'extension pour agir sur l'UI depuis un autre thread en WPF
By Michael DELVA on Friday 18 December 2009, 11:58 - WPF
Je profite d'en avoir parlé lors de mon dernier post pour vous donner une méthode d'extension toute faite qui vous permettra d'appeler automatiquement BeginInvoke sur le Dispatcher d'un contrôle WPF si l'action que vous voulez exécuter sur le contrôle se passe depuis un autre thread que celui sur lequel tourne l'application:
namespace System.Windows.Threading
{
public static class DispatcherExtensions
{
///
/// Executes the action on the thread of the UI if needed, or on the current thread if not
///
/// The Dispatcher of the control
/// The action to execute
/// The dispatcher or the action are null
public static void CheckAccessAndDo(this Dispatcher dispatcher, Action action)
{
CheckAccessAndDo(dispatcher, DispatcherPriority.Normal, action);
}
///
/// Executes the action on the thread of the UI if needed, or on the current thread if not
///
/// The Dispatcher of the control
/// The priority of the action
/// The action to execute
/// The dispatcher or the action are null
public static void CheckAccessAndDo(this Dispatcher dispatcher, DispatcherPriority priority, Action action)
{
if (dispatcher == null) throw new ArgumentNullException("dispatcher");
if (action == null) throw new ArgumentNullException("action");
if (dispatcher.CheckAccess())
action();
else
{
dispatcher.BeginInvoke(priority, action);
}
}
}
}
Pour l'utiliser, c'est très simple et évident:
label.Dispatcher.CheckAccessAndDo(delegate { label.Content = "foo"; } );
De quoi rendre la vie plus facile :p
Exécuter une tâche sur le même thread que celui de l'UI
By Michael DELVA on Friday 18 December 2009, 10:48 - .NET
Le problème est classique: vous créez un thread pour réaliser une opération, et vous voulez que ce thread modifie un composant graphique (comme une ProgressBar par exemple). La solution, que vous devez sûrement connaître, consiste à exécuter l'action en question sur le même thread que celui de l'UI, c'est à dire, en WPF, utiliser la fonction BeginInvoke de la propriété Dispatcher de votre contrôle. Si vous avez un grand nombre de modifications de votre interface utilisateur qui sont effectués depuis une ou plusieurs tâches, plutôt que d'appeler BeginInvoke de multiples fois, il existe une solution toute simple, qui consiste à créer et lancer vos tâches en utilisant une TaskFactory à laquelle vous aurez donné comme TaskScheduler celui chargé de gérer l'UI.
Pour cela, c'est très simple:
public partial class MyUserControl : UserControl
{
private TaskFactory _ui;
public MyUserControl()
{
InitializeComponent();
_ui = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
_ui.StartNew(() => { Width = 100; } );
}
}
Et donc toutes les tâches que vous créerez depuis cette TaskFactory seront "schedulées" (je ne sais pas trop comment traduire ça au mieux) sur le thread de l'UI, et donc vous dispensera d'utiliser Dispatcher.BeginInvoke à tout va.
A noter que le code suivant fonctionne tout aussi bien:
public partial class MyUserControl : UserControl
{
private TaskScheduler _ts;
public MyUserControl()
{
InitializeComponent();
_ts = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() => { Width = 100; }, _ts);
}
}Thursday 17 December 2009
TPL et téléchargement: suite et fin
By Michael DELVA on Thursday 17 December 2009, 18:02 - .NET
Après le précédent article d'introduction à la TPL et l'exemple de code de téléchargement d'un fichier sur internet, voici la suite, et fin, avec l'implémentation de la reprise, de la progression et de la fin (par annulation, ou à cause d'une erreur) du téléchargement.
Introduction aux Parallel Extensions : Télécharger un fichier en asynchrone
By Michael DELVA on Thursday 17 December 2009, 00:37 - .NET
Voici mon tout premier article sur les tant attendues (du moins par moi) Parallel Extensions, la librairie de threading .NET 4.0 qui va tout révolutionner (ceci est un avis hautement subjectif j'en conviens).
Au menu de cet article, un cas concret: télécharger un fichier sur internet, de manière asynchrone. Avec en plus la possibilité de stopper le téléchargement, de connaître la progression, et de pouvoir reprendre un téléchargement interrompu.
Monday 14 December 2009
"Magic" null argument testing
By Michael DELVA on Monday 14 December 2009, 13:00 - C#
Trouvée ici, une astuce vraiment *TRES* tricky, qui permet de simplifier (?) le test sur la "nullité" d'un ou plusieurs arguments, le tout à base d'expression trees et de types anonymes...
Friday 11 December 2009
Liste et description des exemples de Parallel Programming en .NET 4.0
By Michael DELVA on Friday 11 December 2009, 14:56 - .NET
Monday 9 March 2009
Savoir si un type est dérivé d'un type générique
By Michael DELVA on Monday 9 March 2009, 10:32 - C#
Je cherchais récemment à détecter grâce à la reflection tous les types d’une assembly qui dérivaient d’un type de base générique, afin d’utiliser une version modifiée de la factory que j’ai déjà présenté sur ce blog. Soit par exemple un type comme celui-ci: class Toto : Base<int> Pour cela, j’ai trouvé sur internet une petite fonction qui fait ça bien comme il faut:
private static bool IsTypeDerivedFromGenericType(Type typeToCheck, Type genericType)
{
if (typeToCheck == typeof(object))
return false;
if (typeToCheck == null)
return false;
if (typeToCheck.IsGenericType && typeToCheck.GetGenericTypeDefinition() == genericType)
return true;
return IsTypeDerivedFromGenericType(typeToCheck.BaseType, genericType);
}
A l’utilisation, on a donc:
Assembly assembly = Assembly.GetExecutingAssembly();
// Loop each type in assembly
foreach (Type type in assembly.GetTypes())
{
if (type.IsClass && !type.IsAbstract && IsTypeDerivedFromGenericType(type, typeof(GenericManager<>)))
{
//...
}
}
A mettre d’urgence dans votre DLL à tout faire!
Thursday 20 November 2008
Benchmark sur les itérations
By Michael DELVA on Thursday 20 November 2008, 09:55 - C#
Je viens de lire cet article relativement court, mais intéressant, qui permet de mieux situer l'impact sur les performances entre une itération à base de for et à base de foreach, ainsi qu'entre un tableau classique (Array) et une liste générique.
Conclusion: préférez for à foreach quand les performances sont importantes, car il se révèle à peu près 2 fois plus rapide. Mais préférez dans tous les autres cas foreach, pour des questions évidentes de lisibilité.
Wednesday 30 July 2008
Utiliser des mock objects pour émuler une couche de persistance (Correctif)
By Michael DELVA on Wednesday 30 July 2008, 16:27 - C#
J'avais donné dans mon article précédent un lien expliquant comment utiliser plusieurs Expect pour une même fonction.
Il se trouve que j'aurais dû être plus consciencieux dans mon article, puisqu'un test unitaire se devait vraiment d'utiliser cette fonctionnalité très puissante de Moq.
En voici la preuve...
« previous entries - page 3 of 4 - next entries »