Code Contract
Généralités
Code Contract donne une alternative plus lisible et performante aux tests If-Then-Throw.
Disponible à partir du Framework 4.0, et donc sur VS 2010. Manuel de Microsoft.
Pré-conditions (Requires)
Permet de tester les arguments passé à la méthode.
Les tests Requires doivent impérativement se trouver au début de la méthode avant tout autre code.
void Methode(string argument, List<string> arguments) { // si le test n'est pas validé, l'exception ArgumentNullException est lancée // avec le message "Échec de la condition préalable : argument != null" Contract.Requires<ArgumentNullException>(argument != null); // test si les éléments de la liste ne sont pas null Contract.Requires<ArgumentNullException>(Contract.ForAll(arguments, a => a != null)); |
Post-condition (Ensures)
Permet de tester la valeur retournée par la méthode.
Les tests Ensures doivent impérativement se trouver au début de la méthode avant tout autre code.
int Methode() { // si le test n'est pas validé, une exception ContractException est lancée // avec le message Échec de la post-condition : Contract.Result<int>() > 0 Contract.Ensures(Contract.Result<int>() > 0); |
Assert
// permet de réaliser un test // si le test n'est pas validé et que l'Assembly Mode est à Full // lance une exception du type ContractException avec le message "Échec d'assertion : objet != null" Contract.Assert(objet != null); |
Scénarios d'utilisation
Cas 1
Vous souhaitez effectuer une validation en Debug mais pas en Release.
- Utilisez
Contract.Require(...)
- Activez « Runtime Checking » en Debug et désactivez-le en Release
Cas 2
Vous souhaitez effectuer une validation en Debug et en Release.
Et vous souhaitez utiliser CCrewriter en Release.
- Utilisez
Contract.Require<Exception>(...)
sur les méthodes accessibles en dehors de l'assemblage - Utilisez
Contract.Require(...)
pour les autres méthodes - Activez « Runtime Checking » en Debug et Release
- Choisir l'option pour ne vérifier que les « Preconditions »
- Choisir l'option « Only Public Surface Contracts »
Cas 3
Vous souhaitez effectuer une validation en Debug et en Release.
Mais vous ne souhaitez pas utiliser CCrewriter en Release (personnalisation de l'exception).
- Utilisez
if(...) throw Exception(); Contract.EndContractBlock();
sur les méthodes accessibles en dehors de l'assemblage - Utilisez
Contract.Require(...)
sur les autres méthodes - Activez « Runtime Checking » en Debug et désactivez-le en Release
Visual Studio
Assembly Mode
Standard Contract Requires
Cas 1 ou Cas 2
Utilisation de if(...) throw Exception(); Contract.EndContractBlock();
n'est pas autorisée.
Custom Parameter Validation
Cas 3
Utilisation de Contract.Require<Exception>(...)
n'est pas autorisée.
Runtime Checking
Runtime Checking Level
Checking Level | Legacy | Require<Exception> | Require | Ensures | Invariants | Asserts | Assumes |
---|---|---|---|---|---|---|---|
Full | X | X | X | X | X | X | X |
Pre and Post | X | X | X | X | |||
Preconditions | X | X | X | ||||
ReleaseRequires | X | X | |||||
None |
Public Surface Contract Checks
Supprime tous les contrats des méthodes qui ne sont pas accessibles depuis l'extérieur de l'assemblage.
Assert on Contract Failure
Affiche ou non la fenêtre « Assert Failure : Abandonner, Recommencer, Ignorer ».
Contract Reference Assembly
Permet de générer un assemblage « MonProjet.Contracts.dll » et le XML de documentation associé.
Il sera utilisé par les projets référençant cette assemblage et voulant savoir s'il contient des contrats, ou si vous voulez inclure les contrats dans la documentation.