Difference between revisions of "Assertion Settings"

m (Critics)
m (Agents)
 
(23 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
Author: Matthias Konrad
 
Author: Matthias Konrad
 +
 +
[[Category:Assertion checking]]
  
 
==Introduction==
 
==Introduction==
Line 7: Line 9:
 
* Postconditions
 
* Postconditions
 
* Invariants
 
* Invariants
* Loop variants
+
* Loop variants/invariants
 
* Checks
 
* Checks
  
In theory these assertions should be checked all the time. In practice, especially when working with huge systems, this is not possible. (Quite often it is not even possible during the testing phase of the system.) It is thus nessecary to decide which assertions should be tested.  
+
In theory these assertions should be checked all the time. In practice, especially when working with huge systems, this is not possible. (Quite often it is not even possible during the testing phase of the system.) It is thus necessary to decide which assertions should be tested.  
  
It is not sufficient to just enable or disable a certain assertion kind for the whole system. Large systems are composed of smaller parts and reused components (like the base library). These are typically tested independently (unit level testing). It should thus be possible to disable assertion testing on the tested part and enable it on the other parts.
+
It is not sufficient to just enable or disable a certain assertion kind for the whole system. Large systems are composed of smaller parts and reused components (like the base library). These are typically tested independently (unit level testing). It should thus be possible to disable assertion testing on the tested parts and enable it on the other parts.
  
In EiffelStudio the user has to decide which assertions need to be checked. He can do this on various levels (for each assertion kind):
+
EiffelStudio lets the user decide which assertion kinds are checked for every class.
* Class
+
* Cluster
+
* Library
+
* System
+
  
==Critics==
+
==Proposal for a property: Supplier_preconditions==
When the user specifies the assertions for a class he expresses a certain level of trust or mistrust towards it. When he enables invariant checking for a class he is not shure wether the specified invariants really hold, so they need to be checked. The same thing is true for loop variants, postconditions and checks. Whereas for preconditions there is different. When precondition checking is enabled the user mistrusts all the clients of the class.
+
At the moment, when the user mistrusts a class, he has to enable precondition checking both for the class itself and all the supplier classes, since he might violate preconditions of the called features. This has two drawbacks:
 +
* It is tedious to find the suppliers and change their configuration. So in practice users just enable precondition checking for the whole system. (Which makes the next drawback even worse.)
 +
* There are more precondition checks at runtime than necessary.  
  
#He might not trust the callers of the class, so the preconditions of this class need to be checked.
+
It would thus be nice if one could specify for a class, that all the preconditions of its called features are checked. Not always, but only when they are called by this class. This option would typically be enabled on all the untested (and therefore untrusted) classes and disabled on the others for performance reasons. Such a property could be called '''Supplier_preconditions'''.
#Or he might not trust the class to hold the preconditions required by features it calls, so all the preconditions of the features called by this class need to be checked.
+
The current version of EiffelStudio uses the first approach. When the user indeed mistrusts that the class holds the preconditions of the feature it calls, he needs to enable precondition checking for all the called classes. This will result in a big slow down of the system.
+
  
====Default settings====
+
The following picture shows one class with this property enabled and one that has it disabled:
When a user creates a new project from scratch, precondition checking is enabled for all the classes in the system. All the other assertion kinds are disabled. First users of EiffelStudio might be very surprised that they never run into any invariant or postcondition violations.
+
  
====A common pattern for assertion====
+
[[Image:SupplierPrecond.jpg]]
  
 +
The arrows show whether the preconditions need to be checked for a given caller (tail of the arrow) and a callee (peak of the arrow).
  
 
+
====Default settings====
 
+
When a user creates a new project from scratch he uses a template config file. This template should per default disable all assertion kinds for all the library classes and enable all assertion kinds on the root cluster (including the new Supplier_preconditions property).
One would typically completely trust a class from a library provided by a third party and dissable all kinds of assertion checks on the whole library. On the other side
+

Latest revision as of 08:42, 1 November 2006

Author: Matthias Konrad

Introduction

The Eiffel Language specifies several assertion types:

  • Preconditions
  • Postconditions
  • Invariants
  • Loop variants/invariants
  • Checks

In theory these assertions should be checked all the time. In practice, especially when working with huge systems, this is not possible. (Quite often it is not even possible during the testing phase of the system.) It is thus necessary to decide which assertions should be tested.

It is not sufficient to just enable or disable a certain assertion kind for the whole system. Large systems are composed of smaller parts and reused components (like the base library). These are typically tested independently (unit level testing). It should thus be possible to disable assertion testing on the tested parts and enable it on the other parts.

EiffelStudio lets the user decide which assertion kinds are checked for every class.

Proposal for a property: Supplier_preconditions

At the moment, when the user mistrusts a class, he has to enable precondition checking both for the class itself and all the supplier classes, since he might violate preconditions of the called features. This has two drawbacks:

  • It is tedious to find the suppliers and change their configuration. So in practice users just enable precondition checking for the whole system. (Which makes the next drawback even worse.)
  • There are more precondition checks at runtime than necessary.

It would thus be nice if one could specify for a class, that all the preconditions of its called features are checked. Not always, but only when they are called by this class. This option would typically be enabled on all the untested (and therefore untrusted) classes and disabled on the others for performance reasons. Such a property could be called Supplier_preconditions.

The following picture shows one class with this property enabled and one that has it disabled:

SupplierPrecond.jpg

The arrows show whether the preconditions need to be checked for a given caller (tail of the arrow) and a callee (peak of the arrow).

Default settings

When a user creates a new project from scratch he uses a template config file. This template should per default disable all assertion kinds for all the library classes and enable all assertion kinds on the root cluster (including the new Supplier_preconditions property).