La "Unit test" è una forma di metodo formale?

7

Dopo alcune ricerche, capisco che:

Come vedo qui , una dimostrazione formale è solo un calcolo matematico, basato su un'espressione matematica (espressione booleana).

Un test unitario viene verificato da asserzioni, quindi principalmente su una o una serie di espressioni booleane.

Inoltre, ho letto (molto rapidamente) un documento di ricerca di generazione di test unitari da prova formale.

  • Il test unitario è una forma di metodo formale (qui penso a un sistema come la dimostrazione formale)?
  • Se è un concetto totalmente separato, quali sono le differenze?

Lo scopo di questa domanda non è sapere se dopo aver eseguito il test delle unità ci sono ancora bug. Il suo scopo è sapere se esiste un legame tra test unitario e metodo formale.

    
posta csblo 10.04.2015 - 10:28
fonte

2 risposte

25

I due sono cose diverse, e in effetti sono molto più diversi nella pratica di quanto non sarebbero in teoria.

Una prova formale di correttezza dimostra qualcosa sul comportamento di un algoritmo . Ad esempio, potrebbe investigare gli invarianti che si applicano ai dati mentre viene trasformato da un algoritmo di ordinamento e dimostrare che se l'algoritmo termina, ogni elemento è più grande del precedente. Questo tipo di prova può essere rigoroso, cioè se è fatto correttamente, l'algoritmo non può essere sbagliato a questo riguardo.

In pratica, gli algoritmi devono essere incorporati nel codice del computer e di solito non è fattibile provare che un dato bit di codice rappresenta esattamente l'algoritmo che si desidera. (Ciò richiederebbe una dimostrazione formale del comportamento del compilatore, della libreria standard, della macchina virtuale, ecc.) Diventa un po 'più facile, più il linguaggio di programmazione è simile alla notazione matematica che hai usato nella dimostrazione formale, ma non tanto. (Si diceva che il codice in esecuzione nei sistemi centrali dello Space Shuttle fosse quasi una perfetta notazione matematica, ma non molto piacevole da programmare.)

È molto più economico eseguire effettivamente il codice su input scelti con giudizio e verificare che produca i risultati attesi. Questo ha lo svantaggio che non si può mai essere certi che non ci sia un errore in esso - potrebbe comportarsi per quelle coppie di input / output non testate (e di solito ci sono più coppie di quelle che si possono testare, altrimenti non si Per prima cosa è necessario un programma per computer, o, peggio, il codice potrebbe essere sottilmente non deterministico o dipendente dal contesto in modo che i test non vengano esposti.

Ma in pratica, gli errori più che influiscono su un calcolo possono essere esposti con controlli intelligenti e se si tiene un registro degli errori noti e dei casi di test verificando che non possono ripetersi , la qualità del codice può essere generalmente adeguata a un valore aziendale. Certamente è un'idea migliore eseguire test unitari, test di integrazione e test di accettazione degli utenti e ottenere qualcosa fuori dalla porta che la gente pagherà piuttosto che condurre una lunga e costosa prova formale che trascura una sottile deviazione tra le specifiche scritte e attese del cliente. Quindi nel mondo reale, i due sono attività quasi completamente distinte.

    
risposta data 10.04.2015 - 10:43
fonte
9

Non esiste una definizione precisa e universalmente accettata di "metodo formale". Tuttavia, la maggior parte delle definizioni implica una qualche forma di rigore matematico, formalismo o dimostrazione, nessuna delle quali fornisce un test unitario.

Un test unitario è semplicemente "provalo e vedi se funziona in questo caso specifico singolo", mentre i metodi formali cercano di dimostrare che "funziona sempre in ogni caso in ogni condizione in ogni ambiente".

    
risposta data 10.04.2015 - 11:21
fonte

Leggi altre domande sui tag