« Code Contract » : différence entre les versions
(→Assert) |
|||
(2 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 3 : | Ligne 3 : | ||
Disponible à partir du Framework 4.0, et donc sur VS 2010. [http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf Manuel de Microsoft]. | Disponible à partir du Framework 4.0, et donc sur VS 2010. [http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf Manuel de Microsoft]. | ||
=Pré-conditions (Requires)= | = Pré-conditions (Requires) = | ||
Permet de tester les arguments passé à la méthode.<br/> | Permet de tester les arguments passé à la méthode.<br/> | ||
Les tests Requires doivent impérativement se trouver au début de la méthode avant tout autre code. | Les tests Requires doivent impérativement se trouver au début de la méthode avant tout autre code. | ||
<kode lang="csharp"> | |||
< | |||
void Methode(string argument, List<string> arguments) | void Methode(string argument, List<string> arguments) | ||
{ | { | ||
Ligne 18 : | Ligne 15 : | ||
// test si les éléments de la liste ne sont pas null | // test si les éléments de la liste ne sont pas null | ||
Contract.Requires<ArgumentNullException>(Contract.ForAll(arguments, a => a != null)); | Contract.Requires<ArgumentNullException>(Contract.ForAll(arguments, a => a != null)); | ||
</ | </kode> | ||
=Post-condition (Ensures)= | = Post-condition (Ensures) = | ||
Permet de tester la valeur retournée par la méthode.<br/> | Permet de tester la valeur retournée par la méthode.<br/> | ||
Les tests Ensures doivent impérativement se trouver au début de la méthode avant tout autre code. | Les tests Ensures doivent impérativement se trouver au début de la méthode avant tout autre code. | ||
<kode lang="csharp"> | |||
< | |||
int Methode() | int Methode() | ||
{ | { | ||
Ligne 33 : | Ligne 27 : | ||
// avec le message Échec de la post-condition : Contract.Result<int>() > 0 | // avec le message Échec de la post-condition : Contract.Result<int>() > 0 | ||
Contract.Ensures(Contract.Result<int>() > 0); | Contract.Ensures(Contract.Result<int>() > 0); | ||
</ | </kode> | ||
=Assert= | = Assert = | ||
<kode lang="csharp"> | |||
< | |||
// permet de réaliser un test | // permet de réaliser un test | ||
// si le test n'est pas validé et que l'Assembly Mode est à Full | // 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" | // lance une exception du type ContractException avec le message "Échec d'assertion : objet != null" | ||
Contract.Assert(objet != null); | Contract.Assert(objet != null); | ||
</ | </kode> | ||
=Scénarios d'utilisation= | =Scénarios d'utilisation= |
Dernière version du 12 avril 2020 à 12:43
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.