Posso evitare ulteriori errori se utilizzo diversi paradigmi per l'implementazione e le specifiche / test?

7

Poiché è conveniente per lo sviluppatore, lo stesso paradigma viene spesso utilizzato per implementazioni e specifiche, ad es.

  • per i test (ad esempio Java per l'implementazione e i test unitari, Scala per l'implementazione e il test delle proprietà)
  • per i test basati su modelli (ad esempio C # per l'implementazione e le specifiche utilizzando Spec Explorer o Java per l'implementazione e le specifiche con Conformiq)
  • per la verifica (ad es. C per alcuni software e specifiche incorporate nella lingua Promela del linguaggio C per il controllo del modello, o Dafny, che integra l'implementazione e le specifiche).

Sembra che ci sia una tendenza in questa direzione.

Ho sempre pensato che l'utilizzo di paradigmi diversi avrebbe aiutato a pensare a diversi livelli di astrazione e più in generale a strutture diverse, e che i difetti potevano essere rilevati molto meglio in questo modo, controllando l'implementazione rispetto ai test / specifiche (simile all'utilizzo di diversità del design per sistemi fault tolerant).

Quindi è vero che diversi paradigmi per l'implementazione e le specifiche possono evitare più errori? Hai un riferimento citabile?

    
posta DaveFar 11.07.2015 - 16:09
fonte

3 risposte

1

Questo non è completamente correlato, ma se si includono linguaggi di specifiche formali, si hanno vantaggi con l'annotazione del codice con invarianti formali e contratti.

Vedi ad esempio il manuale di riferimento ACSL , per C. Lo stesso vale per Ada che consente forall espressioni che non fanno parte della lingua, ma disponibili per le specifiche: link . Inoltre, potresti dare un'occhiata a ACL2 .

Quando si tratta di test, si consiglia di consultare Basato su modelli Test : definisci un modello che è utile solo per i test.

Spesso è più facile descrivere il test in modo funzionale, in modo chiaro, trasmette cosa dovrebbe fare l'implementazione, invece di come .

    
risposta data 13.07.2015 - 19:34
fonte
1

Penso che quello che vuoi sia un certo livello di formalismo, vedi Metodi formali . Questo è l'unico modo garantito per ottenere meno errori utilizzando paradigmi diversi perché l'uso di qualcosa di diverso ha anche il potenziale di dare diversi errori (anche le correzioni producono errori).

L'implementazione a livello più vicino alla matematica darà la possibilità di avere un certo livello di prova matematica, il che significa che non avrai alcun difetto e che potenzialmente eliminerai la necessità di test.

Questo link Da HOL a Haskell e Fondamentali software dovrebbero illustrare le idee sull'uso delle specifiche di sviluppo nel dimostratore di teoremi e quindi tradurle in linguaggio di programmazione. Un articolo parla dell'utilizzo di Isabelle / HOL e haskell, l'altro riguarda l'uso di Coq, che quindi puoi tradurre in scala usando alcuni strumenti.

Perché ci vuole più tempo per farlo formalmente, solo una piccola quantità di codice viene sviluppata in questo modo.

    
risposta data 31.07.2015 - 06:45
fonte
0

È mia opinione come una persona di controllo qualità che uno non ha realmente bisogno di paradigmi di test diversi. Molti non saranno d'accordo con questa affermazione, ma c'è solo un metodo necessario che sta semplicemente testando tutti i casi limite conosciuti di qualunque esso sia. La teoria è semplicemente Min, Min-1, Min + 1, Max, Max-1 e Max + 1, Null e o Empty String. Se tutti questi bordi sono stati testati, hai un codice antiproiettile.

Le persone diranno sciocchezze e usano termini fantasi come end-to-end, scatola nera, scatola bianca, scatola grigia, test unitario, test di accettazione degli utenti, test unitario, integrazione, test dei componenti e del sistema, parleranno di casualità , approcci statistici. ecc. Tutto quanto sopra si riduce ai casi Edge come metodo da utilizzare. I test dei casi limite possono essere eseguiti manualmente, automatizzati ecc.

Infine gli studi mostrano che il 70% di tutti i bug sono stati introdotti prima che lo sviluppatore consegnasse il codice al QA. Cosa significa questo? Significa che il massimo sforzo per l'automazione è Unit Test! Considerando questo, il 90% di tutti gli sviluppatori afferma che "Unit Testing non è integrato nel mio programma" ... Il risultato è che il codice non a prova di proiettile viene continuamente consegnato al QA, ma il QA può prendere solo il 20-50 % di tutti i bug in quanto non possono vedere il codice di solito ...

Scrivere casi di test nella lingua utilizzata dagli sviluppatori è buono perché ora gli sviluppatori possono contribuire e mantenere la libreria Test unità. I componenti di QA dovrebbero essere integrati con gli sviluppatori e scrivere test mentre il codice viene creato. Gli stub di test possono essere scritti solo da una specifica e rendere il test quasi pronto per quando il codice è presente.

È vero che gli sviluppatori semplicemente non hanno il tempo giusto per sviluppare buoni Test unitari dati gli orari veloci di oggi.

    
risposta data 31.07.2015 - 00:40
fonte

Leggi altre domande sui tag