« Code Contract » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
 
 
(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">
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
|
<syntaxhighlight 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));
</syntaxhighlight>
</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.
{|
 
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
<kode lang="csharp">
|
<syntaxhighlight 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);
</syntaxhighlight>
</kode>
|}


=Assert=
= Assert =
{|
<kode lang="csharp">
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
|
<syntaxhighlight 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);
</syntaxhighlight>
</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.

Csharp.svg
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.

Csharp.svg
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

Csharp.svg
// 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.