Scrivi le asserzioni di test nei commenti delle tue funzioni (appena prima del codice)?

3

Sto usando PHP e PHPUnit. Qualcosa mi infastidisce: il fatto che le asserzioni siano in un'altra classe (troppo facile da dimenticare o da ignorare, per ogni nuovo programmatore nel progetto).

Se le asserzioni di test possono essere scritte sopra il codice, sarà più facile da mantenere, o difficile da ignorare, immagino.

Quanto può essere utile?

/**
 * @assertions for mycode goes here
 */
 public function mycode() {}
    
posta Eric Lavoie 19.09.2015 - 16:19
fonte

2 risposte

1

Gypsy includeva specifiche e affermazioni nella lingua stessa. Parte del sistema di programmazione e della metodologia Gypsy era la generazione di condizioni di verifica (teoremi da dimostrare) che provavano la correttezza del codice.

Il programma Gypsy ha dimostrato , tra le altre cose, che, contrariamente alla credenza popolare, è IS possibile fornire codice completamente privo di bug. Il Message Flow Modulator era un piccolo programma, che si trovava su una linea seriale e passava attraverso i messaggi filtrati. L'MFM è stato sviluppato presso l'UT Austin. La suite di test di accettazione è stata sviluppata in modo indipendente da una squadra sulla costa occidentale. La MFM ha visto per la prima volta la suite di test di accettazione al test di accettazione del cliente presso PAX River, e ha superato, al primo tentativo, nessuna deviazione, nessuna rinuncia, niente yeabuts, niente NULLA. È passato. (Don Good, il principale investigatore del progetto, mi disse che era passato molto tempo prima che il suo telefono smettesse di squillare dopo che quella notizia era uscita.)

    
risposta data 19.09.2015 - 17:17
fonte
1

Il Java Modeling Language (JML) potrebbe sii vicino a ciò che intendi. Fornisce un modo formalizzato per esprimere il contratto di una funzione o classe nei commenti speciali e esistono strumenti per convertire questi in asserzioni di run-time o unit test, ma per impostazione predefinita questi saranno solo commenti e avranno zero overhead.

Il seguente esempio è tratto dalla classe Arc nel esempio digraph sul sito web JML. Il commento con @ s definisce il contratto.

/** Invert the direction of this arc. */
/*@ public normal_behavior
  @   assignable source, target;
  @   ensures source == \old(target) && target == \old(source);
  @*/
public void flip() {
    NodeType temp = source;
    source = target;
    target = temp;
}
    
risposta data 19.09.2015 - 17:39
fonte