web-dev-qa-db-fra.com

C # - Que fait la méthode Assert ()? Est-ce toujours utile?

Je débogue avec des points d'arrêt et je réalise l'appel à assert? Je pensais que c'était uniquement pour les tests unitaires. Que fait-il plus que le point d'arrêt? Depuis que je peux casser un point, pourquoi devrais-je utiliser Assert?

145
Pokus

Dans une compilation de débogage, Assert accepte une condition booléenne en tant que paramètre et affiche le dialogue d'erreur si la condition est fausse. Le programme se poursuit sans interruption si la condition est vraie.

Si vous compilez dans Release, all Debug.Assert sont automatiquement omis.

184

De code complet

8 Programmation défensive

8.2 Assertions

Une assertion est un code utilisé pendant le développement (généralement une routine ou une macro) qui permet à un programme de se vérifier lui-même pendant son exécution. Quand une assertion est vraie, cela signifie que tout fonctionne comme prévu. Lorsqu'il est faux, cela signifie qu'il a détecté une erreur inattendue dans le code. Par exemple, si le système suppose qu'un fichier d'informations client ne contiendra jamais plus de 50 000 enregistrements, le programme peut contenir une assertion selon laquelle le nombre d'enregistrements est inférieur ou égal à 50 000. Tant que le nombre d'enregistrements est inférieur ou égal à 50 000, l'assertion restera silencieuse. S'il rencontre plus de 50 000 enregistrements, cependant, il "affirmera" très fort qu'il y a une erreur dans le programme.

Les assertions sont particulièrement utiles dans les grands programmes compliqués et dans les programmes à haute fiabilité. Ils permettent aux programmeurs de vider plus rapidement les hypothèses d’interface incompatibles, les erreurs qui se glissent lorsque le code est modifié, etc.

Une assertion prend généralement deux arguments: une expression booléenne décrivant l’hypothèse supposée vraie et un message à afficher s’il ne l’est pas.

(…)

Normalement, vous ne voulez pas que les utilisateurs voient les messages d’assertion dans le code de production; Les assertions sont principalement utilisées pendant le développement et la maintenance. Les assertions sont normalement compilées dans le code au moment du développement et extraites du code pour la production. Au cours du développement, les assertions éliminent les hypothèses contradictoires, les conditions inattendues, les mauvaises valeurs transmises aux routines, etc. Au cours de la production, elles sont compilées à partir du code afin que les assertions ne dégradent pas les performances du système.

90
juan

Vous devez l'utiliser pour les moments où vous ne voulez pas avoir à interrompre chaque petite ligne de code pour vérifier les variables, mais vous souhaitez obtenir une sorte de retour si certaines situations sont présentes, par exemple:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
37
thelsdj

Assert vous offre également une autre occasion de rire des compétences en conception d'interface utilisateur de Microsoft. Je veux dire: un dialogue avec trois boutons Abandonner, Réessayer, Ignorer et une explication sur la façon de les interpréter dans la barre de titre!

12
Joe

Assert vous permet d’affirmer qu’une condition (post ou pré) s’applique dans votre code. C'est une manière de documenter vos intentions et de demander au débogueur de vous informer par un dialogue si votre intention n'est pas respectée.

Contrairement à un point d'arrêt, l'Assert va avec votre code et peut être utilisé pour ajouter des détails supplémentaires sur votre intention.

9
Jeff Yates

Assert peut vous aider à définir un comportement de messagerie distinct entre le test et la publication. Par exemple,

Debug.Assert(x > 2)

ne déclenchera une pause que si vous exécutez une version "debug", pas une version validée. Il y a un exemple complet de ce comportement ici

9
Ryan

Tout d'abord, la méthode Assert() est disponible pour les classes Trace et Debug.
Debug.Assert() ne s'exécute qu'en mode débogage.
Trace.Assert() est en cours d'exécution en mode débogage et libération.

Voici un exemple:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

Exécutez ce code en mode débogage, puis en mode publication.

enter image description here

Vous remarquerez qu'en mode de débogage votre instruction de code Debug.Assert Échoue, vous obtenez une boîte de message indiquant le suivi de la pile actuelle de l'application. Cela ne se produit pas en mode Release car la condition Trace.Assert() est vraie (i == 4).

La méthode WriteLine() vous offre simplement la possibilité de consigner les informations dans une sortie Visual Studio. enter image description here

6
Serge Voloshenko

Les assertions figurent largement dans Design by Contract (DbC) qui, si j'ai bien compris, a été introduite/approuvée par Meyer, Bertand. 1997. Contruction logicielle orientée objet.

Une caractéristique importante est qu’ils ne doivent pas produire d’effets secondaires. Par exemple, vous pouvez gérer une exception ou agir différemment avec une instruction if (programmation défensive).

Les assertions sont utilisées pour vérifier les conditions préalables/postérieures du contrat, la relation client/fournisseur - le client doit s'assurer que les conditions préalables du fournisseur sont remplies, par exemple. envoie 5 £ et le fournisseur doit s'assurer que les conditions postérieures sont remplies, par exemple. délivre 12 roses. (Juste une explication simple du client/fournisseur - peut accepter moins et livrer plus, mais à propos des assertions). C # introduit également Trace.Assert (), qui peut être utilisé pour le code de version.

Pour répondre à la question, oui, ils sont toujours utiles, mais ils peuvent ajouter de la complexité et de la lisibilité au code ainsi que du temps difficile à maintenir. Devrions-nous toujours les utiliser? Oui, allons-nous tous les utiliser? Probablement pas, ou pas dans la mesure décrite par Meyer.

(Même le OU Java Bien sûr, cette technique ne m'a montré que des exemples simples et le reste du code n'a pas appliqué les règles d'assertion DbC sur la plupart du code, mais a été supposé être utilisé pour assurer l'exactitude du programme!)

3
Knightlore

La façon dont je le conçois est Debug.Assert est un moyen d’établir un contrat sur la manière dont une méthode est censée être appelée, en se concentrant sur des détails concernant les valeurs d’un paramètre (au lieu du type). Par exemple, si vous n'êtes pas censé envoyer une valeur null dans le deuxième paramètre, vous ajoutez l'assertion autour de ce paramètre pour indiquer au consommateur de ne pas le faire.

Cela empêche quelqu'un d'utiliser votre code de manière effrénée. Mais cela permet également à cette manière pointilleuse de passer en production et de ne pas donner le message désagréable à un client (en supposant que vous construisez une version Release).

3
Flory