sabato 15 dicembre 2018

Testing o Collaudo del Software

 

Cos'è il Testing o Collaudo del Software?

Vi è mai capitato di imbattervi in una offerta di lavoro e tra i requisiti è richiesto il Testing del Software? Scommetto che molti hanno pensato: "Ah, che bello! Vado a giocare a Candy Crush tutto il giorno ahahah ☺". Purtroppo non è così: il Collaudo del Software o Testing del Software è un insieme di attività necessarie affinchè si produca software di qualità riducendo al minimo il rischio di malfunzionamento del sistema o componente software.


Special thanks *


A seguire ci sono gli appunti di studio dell'International Software Testing Qualification Board  ISTBQ basati sul Syllabus Livello "Foundation". Tutto il testo a seguire è una semplificazione ma non troppo del suddetto Syllabus. Se avete intenzione di studiare sul mio blog non lo fate...! Vi consiglio di leggere le mie note e poi approfondire sul testo originale. Partiamo...

Quali sono gli obiettivi tipici del testing?

Per ogni sistema software, gli obiettivi del testing possono includere:
  • La valutazione dei requisiti(1), le user story(2), la progettazione e del codice
  • La verifica che tutti i requisiti specificati siano stati soddisfatti
  • La validazione dell'oggetto di test in modo da assicurarsi che funziona come si attendono gli utenti e gli stakeholder
  • L'aumento della fiducia in termini di miglioramento del livello di qualità dell'oggetto testato
  • La prevenzione e la ricerca di failure e difetti
  • L'informazione degli stakeholder circa la qualità dell'oggetto di test in modo che essi possano prendere decisioni ragionate
  • La riduzione del rischio che si produca e si rilasci software di qualità inadeguato in ambiente operativo
  • Il rispetto dei requisiti in modo che gli standard contrattuali legali vengano rispettati

Qual'è la differenza tra il testing ed il debugging?

Il testing è l'attività che puo' mostrare failure causate da difetti del software.

Il debugging è l'attività che trova, analizza e corregge i difetti trovati dal testing. Dopo il debugging c'è ancora un'attività di testing confermativo che verifica se l'attività di correzione effettuata durante il debug abbia effettivamente risolto il problema evidenziato durante la prima fase di testing.


Perché il Testing è Necessario

Nell'ottica di ridurre il rischio di failure durante il funzionamento di un sistema (che può essere anche vitale se si pensa al software di controllo della velocità di un'auto), occorre testare in modo rigoroso componenti e sistemi software ma anche la documentazione. Ogni volta che si riscontra un difetto e lo si corregge miglioriamo la qualità del software. In determinati settori o per esigenze contrattuali, è una fase indispensabile del processo di produzione stesso.

Esempi del perché il testing è necessario 

  • Per evitare rilasci in esercizio di software affetto da difetti
  • Per prevenire failure in esercizio
  • Per essere sicuri che le esigenze degli stakeholder siano soddisfatte
  • Per contribuire al successo dello sviluppo
  • Per migliorare la manutenzione del software

Relazioni fra testing e quality assurance

La quality assurance (o garanzia della qualità o QA) è correlata al testing ma non è la stessa cosa.
La gestione della qualità all'interno di un'azienda comprende varie attività tra cui la garanzia della qualità e il controllo della qualità.

La garanzia di qualità si raggiunge attraverso l'esecuzione corretta di appositi processi di produzione. Ciò determina un prodotto di qualità superiore e previene difetti di produzione.

Il controllo di qualità comprende anche le attività di testing necessarie al raggiungimento di adeguati livelli di qualità.

Come il testing contribuisce in termini di qualità

Si contribuisce attraverso le attività tipiche del testing. Per citarne alcune:
  • Valutazione dei requisiti, delle user story, della progettazione, del codice
  • Esecuzione del sistema o del singolo componente per scoprire eventuali failure
  • Identificazione del difetto che ha causato la failure attraverso il debugging

Distinzione tra errore, difetto e failure

  • L'errore introduce un difetto
  • Un difetto può causare una failure
  • Una failure è un malfunzionamento
Tutto parte dagli errori che si possono verificare per varie ragioni:
  • Vincoli di tempo, ad esempio una stima errata
  • L'uomo è infallibile ed è quindi inevitabile l'errore umano
  • Il team di sviluppo non è adeguatamente qualificato o è inesperto
  • Inadeguata comunicazione tra i partecipanti al progetto
  • Complessità del progetto
  • Malintesi tra le interfacce tra i vari sistemi che devono interagire
  • Tecnologie nuove non ancora adeguatamente conosciute
Ma le failure si possono presentare anche per cause non dovute al codice ma a fattori ambientali
  • Radiazioni
  • Campi elettromagnetici
  • Inquinamento
  • Temperatura
I fattori ambientali appena elencati possono modificare le condizioni dell'Hardware causando difetti del Firmware e di conseguenza una failure a livello di Software

Durante la fase di test si possono avere falsi positivi e falsi negativi.
  • falsi positivi sono segnalati come difetti ma in realtà non lo sono
  • I falsi negativi sono test che non rilevano i difetti che avrebbero dovuto rilevare
I falsi positivi o negativi possono verificarsi a causa di un errato modo di eseguire il test o a causa di difetti nei dati di test, all'ambiente di test o altri motivi. 

Distinzione tra root cause, difetti, ed effetti

  • Root Cause: il product owner non ha adeguati skills circa il calcolo degli interessi
  • Difetto principale: il product owner scrive una user story ambigua per il calcolo degli interessi
  • Difetto: è la riga di codice scritta in base alla user story che determina la failure
  • Failure: è in questo esempio il pagamento di interessi errati ai clienti della banca
  • Effetti: i clienti si lamentano perché ricevono un errato tasso di interessi.

I sette principi del testing

  1. Il testing mostra la presenza di difetti ma non può provarne l'assenza. Anche se nessun difetto viene trovato non significa che il software sie privo di difetti.
  2. Il testing esaustivo è impossibile tranne per casi banali. In questi casi è necessario usare l'analisi del rischio, le tecniche di testing e le priorità per decidere dove concentrare gli sforzi 
  3. Il testing anticipato permette di risparmiare tempo e denaro infatti ciò permette di individuare tempestivamente i difetti (ad ogni livello) aiutando quindi ad evitare modifiche successive in caso di errori che potrebbero essere anche costose e lunghe in base alla gravità.
  4. I difetti tendono a formare cluster(3) infatti solitamente un numero limitato di moduli è quello che contiene i difetti. Indicazione importante per l'analisi di rischio e per concentrare l'effort del test in modo specifico e mirato.
  5. Attenzione al paradosso pesticida. Se si usa sempre lo stesso test e sempre la stessa base dati si rischia di non rilevare più difetti. Per tanto è necessario a volte modificare sia la base dati che riprogettare il tipo di test. 
  6. Il testing è dipendente dal contesto. Un software safety-critical viene testato in modo diverso da una app per e-commerce o da un progetto Agile.
  7. L’assenza di errori è una falsa credenza anche se alcune organizzazioni sperano nel buon lavoro dei tester, ciò è impossibile! Un ottimo lavoro non garantisce comunque il successo di un sistema.

Il Processo di Test

Esistono un insieme di attività tipiche per raggiungere l'obiettivo del test ma non esiste un processo unico ed universale per il testing del software. Il processo di test è definito dalle attività da eseguire. In base a come, quali e quando queste attività sono scelte ed implementate, si determina un adeguato processo di test.

L’impatto del contesto sul processo di test

Il contesto influenza il processo di test. Tra i fattori di contesto che possono determinare il processo di test possiamo elencare i seguenti:
  • Il modello di ciclo vita e le metodologie dello sviluppo software
  • I livelli di test e i tipi di test adottati
  • I rischi sia del prodotto che del progetto
  • Il dominio del business
  • I vincoli operativi: budget e risorse, tempistiche, complessità, requisiti contrattuali e normativi
  • Le politiche e le pratiche organizzative
  • Gli standard interni ed esterni richiesti
Sarebbe buona pratica che la base dei test, abbia criteri di copertura definiti e misurabili in modo da poter dimostrare attraverso i KPI (key performace indicator) il raggiungimento degli obiettivi del testing del progetto/sistema software.

Supponiamo di avere una lista di requisiti e una lista di smartphone supportati dall'app che dobbiamo realizzare. Ogni requisito ed ogni smartphone fanno parte della base di test. 
I criteri di copertura richiedono, ad esempio, che occorre effettuare almeno un caso di test per ciascun elemento sia requisiti che smartphone in modo da indicare agli stakeholder che i requisiti sono stati soddisfatti e se sugli smartphone sono state riscontrate failure.

Descrivere le attività di testing e i rispettivi compiti nel processo di test

Un processo di test è costituito da vari gruppi di attività. A seguire i gruppi di attività principali:
  • Pianificazione dei test
  • Monitoraggio e controllo dei test
  • Analisi dei test
  • Progettazione dei test
  • Implementazione dei test
  • Esecuzione dei test
  • Completamento dei test
L'implementazione delle suddette attività, benché portano a pensare ad una implementazione sequenziale, spesso avviene in maniera iterativa.

Pianificazione dei test
La pianificazione del test comprende tutte le attività che definiscono gli obiettivi del test e l'approccio per soddisfarli nell'ambito del contesto esistente. Ad esempio specificando tecniche e test idonei e schedulando i test per rispettare le scadenze. I piani di test possono essere rivisti in base ai feedback ed alle attività di monitoraggio e controllo.

Monitoraggio e controllo dei test
Il monitoraggio dei test prevede il confronto degli avanzamenti rispetto al piano attraverso le metriche definite dal piano di test.
Il controllo dei test è necessario per poter adottare le azioni necessarie a soddisfare gli obiettivi del piano di test.
Entrambi, monitoraggio e controllo, sono supportati dalle valutazioni dei criteri di uscita. 

Un esempio di valutazione dei criteri di uscita in base a risultati e log dei test potrebbe essere:
  • Verifica dei risultati rispetto ai criteri di copertura
  • Valutazione del livello di qualità del componente o del sistema
  • Necessità di avere nuovi test perché i test progettati non hanno raggiunto l'obiettivo
(1) - Esempio di requisito: Il sistema permetterà di prenotare un taxi e di avere una stima del tempo di attesa

(2) - Esempio di una User Story:
Cliente: “Salve Radio City, mi occorre un taxi in via Napoli 1861”

Sistema: “Vesuvio 79 arriverà in 5 minuti”

(3) - Un cluster è un raggruppamento logico

* https://openclipart.org/detail/308849/mental-health

Codice esempio Testing del Software

Codice esempio di un Collaudo del Software

Primi approcci pratici al test o collaudo del software!


Dopo aver iniziato lo studio del testing del software ho realizzato un esempio pratico di collaudo del software! E' molto semplice ed utile per capire di cosa si tratta quando si parla di testing

Testing del Software

L'immagine sopra rappresenta il risultato dei 5 test effettuati per il "software under test"

La demo che ho fatto è scaricabile da github ed è composta da tre file:

  • PSU è la classe che rappresenta un Power Supply a 9 Volt. Il costruttore, quello software, si occupa di popolare il PartNumber, la Descrizione ed il SerialNumber. Ci sono dei metodi get che si occupano di restituire i valori precedentemente assegnati, alcuni set per modificare lo stato On/Off del PSU, un SelfTest e utility varie meglio descritte nel codice sorgente.
  • PSU_Test è la classe che si occupa di verificare il corretto funzionamento dei metodi della classe PSU.java. Utilizza il framework JUnit per il testing. Il mio approccio è stato veramente basic: ho realizzato 5 "Test Method" che "confermano" il risultato del test con quello che ci si aspetta.
  • PSU_Tester simula un testo automatico in ambiente di produzione: è il test funzionale del dispositivo fisico, il Power Supply 9 Volt in questo caso. Non necessaria per il testing software.
L'esempio è davvero semplice e in un certo senso sminuisce ciò che è l'articolata attività di testing che dovrebbe essere adottata in ambienti professionali per mirare allo sviluppo di sistemi software solidi e di alta qualità.

mercoledì 8 agosto 2018

Controlla gratis se la tua carta di credito è stata rubata!

Cari amici se pensate che la vosta carta di credito è stata clonata non esitate un solo secondo e fate un controllo gratis usando la mia applicazione Secure Card. Si tratta di un'App Android che controlla nei Data Base Hacker Mondiali la presenza della vostra Carta di Credito. 

Carta di credito esempio *

Hai mai usato Amazon oppure Google Shopping?
I dati che occorrono per fare il controllo sono proprio quelli per fare gli acquisti on-line!
Li elenco per non farti sbagliare durante l'immissione!

Occorrono solamente le seguenti informazioni:
  • Numero della carta di credito (1234 5678 9876 5432)
  • Nome dell'intestatario (Manny Pitt)
  • La data di scadenza (12/15)
  • Il codice di sicurezza o CVV2 che si trova sul retro
Secure Card è Sicura, Semplice ed IntuitivaE' sicura perchè uso la crittografia SHA a 512bit per trasmettere i dati.  E' semplicissima perchè occorrono solo pochi dati della tua carta di credito. E' veloce perchè in pochi minuti avrai il report dettagliato con tutte le informazioni che ti occorrono!


Compila tutti i campi richiesti e premi Controlla la Carta di Credito!




A questo punto il gioco è fatto!
Ho a disposizione i dati della tua carta di credito e posso iniziare a comprare alle tue spalle... ahahaha

Se c'è qualcuno davvero intenzionato ad installare l'app "Secure Card" fatemelo sapere in privato perchè l'app non si trova nei canali ufficiali 😎!

Ritornando ad essere seri... C'è da dire a volte capita che le persone navigano su siti web o installano App che sembrano affidabili ma che hanno in realtà l'unico scopo di rubare informazioni sensbili. Questa pratica è chiamata phishing.

Come proteggersi dalle frodi e dal phishing?
  • Non installare mai "pseudo" App tipo questa Secure Card 😛
  • Controlla sempre la barra dell'indirizzo del sito dove stai facendo acquisti on-line per verificarae se il dominio è realmente quello che ti aspetti. Ad esempio amazon.it e non amazon.it.not.ru
  • Non comunicare mai la tua password di accesso via telefono o via e-mail a nessuno nemmeno alla tua banca
  • Usa la Carta di Credito e non il Bancomat (o Carto di Debito) per gli acquisti on-line. Questo perchè in caso di acquisto fraudolento con la carta di credito c'è piu' tempo per bloccare l'operazione mentre con il bancomat la transazione è immediata
  • Attiva il servizio di notifica via sms per ogni acquisto effettuato se disponibile
  • Tieni sempre a portata di mano i numeri telefonici per bloccare la carta e quello dell'assistenza telefonica


Bene... non credo di aver altro di aggiungere altro tranne che di fare sempre ATTENZIONE!


https://openclipart.org/detail/248765/credit-card

sabato 31 marzo 2018

Convertitore valuta cinese Yuan in Euro

Cosa fare per ammazzare il tempo in Cina?
Semplice: un'app Android per convertire Yuan in Euro e viceversa 😅

Download

In realtà l'ultima trasferta a Wuhan Optics Valley è stata lunga ed impegnativa dal punto di vista lavorativo ed il tempo per distrarmi insieme a due amici e colleghi, si è ridotto al minimo.

Jiuann converter è un semplice convertitore di valuta off-line! 

Perchè off-line? Evitare la conessione dati in roaming può proteggere da brutte sorprese sul conto telefonico quando si sta in Cina... Per un'idea di cosa si rischia riporto il messaggio di Vodafone circa le tariffe: Benvenuto in Cina. Con Smart Passport ha 200 min, 200 SMS e 200MB fino alle 24:00 ora italiana a 35 euro solo in caso di utilizzo. Le verrà addebitata una ricarica automatica al primo evento di roaming. Raggiunte le soglie continuerà a utilizzare il servizio acquistando una ricarica automatica di 35 euro ogni 200 min, 200 SMS e 200MB fino a un massimo di 1000 min, 1000 SMS e 1000MB giornalieri. Al termine dei 1000MB navigherà gratuitamente a una velocità ridotta a 32 Kbps. Può bloccare il traffico all'estero impostando il suo smartphone in modalità aereo o disattivando la ricarica automatica al numero gratuito +393482002323. Per controllare la spesa chiami gratis il 414 o +393492002414. Buon viaggio!
A tal proposito.. speriamo bene 🙏!

Ritornando al convertitore, i tassi di conversione sono preimpostati ed è possibile aggiornarli anche successivamente, manualmente... off-line!

L'utilizzo è veramente semplice grazie alla conversione immediata ogni volta che il testo cambia.
Questa funzionalità si ottiene grazie ai listner sulle EditText addTextChangedListener che mette a disposizione vari @Override tra cui afterTextChanged



Non c'è molto da dire su quest'App tranne di fare attenzione a non incorrere in un loop infinito di conversione che manda in crash l'App qualora si dovessero attivare contemporaneamnete i listner sulle due EditText (una per l'Euro e l'altra per lo Yuan). Ho gestito la cosa attivando e disattivando i listner nel momento dell'ottenimento e della perdita del focus usando  setOnFocusChangeListener

Ultima cosa circa le SharedPreferences: ho scoperto che non esiste un metodo per memorizzare i double tipo editor.putDouble ed il rispettivo getter preferences.getDouble  per cui occorre crearsi dei metodi che scrivono il double in 'raw long bits' equivalente e riconvertirlo successivamente in double quando occorre..  https://stackoverflow.com/a/18098090


 


你好中国,很快见到你

黄鹤楼


* thanks joker876 from openclipart

venerdì 2 marzo 2018

Debug del software

Rubber Duck Debugging


Rubber Ducking

A Marzo ho partecipato all'evento Dive into AI presso l'Università Parthenope di Napoli.

Gli argomenti trattati nella sessione formativa sono stati davvero interessanti: Intelligenza artificiale, Machine learning, Big data, IoT

Ma... cosa c'entra la paperella tra tutta questa scienza?
La papera in figura era il gadget offerto ai partecipanti del workshop.

A cosa serve realmente?
Oltre ad essere un simpatico soprammobile la papera è usata per fare il debug del software. Sembra strano ma è uno dei metodi usato per scovare bug software che si nascondono tra i milioni di linee di codice scritto durante le notti insonni!

Come si usa?
Semplice, si trasferisce il codice et voilà il bug è trovato! Scherzo, la tecnica corretta è quella di spiegare riga per riga il codice a questa simpatica paperella inanimata. Descrivendo infatti il funzionamento che ci si attende dal programma ed osservando il codice che svolge tale funzione, si riesce ad identificare il problema o a trovare la soluzione al malfunzionamento.

Tecniche alternative?
Per evitare di sembrare un matto mentre si parla con un oggetto inanimato si può chiedere aiuto al proprio amico purché non sia un esperto programmatore. Osservando il problema da un altro punto di vista spesso si arriva all'identificazione ed alla soluzione del problema.

Bene, questo è tutto circa la simpatica paperella offerta dagli ambassador di Intel e... alla prossima!


domenica 14 gennaio 2018

JSON Web Service con ESP8266 e DHT11

Ho già usato l'ESP8266 in un'altra applicazione per trasmettere dati in real-time nel Cloud (Firebase) attraverso una connessione alla rete internet. L'ESP8266 è un dispositivo economico e allo stesso tempo ricco di potenzialità! Con il ricetrasmettitore WiFi integrato e i pin General Purpose Input/Output dove poter collegare gli svariati sensori esistenti è possibile dare libero sfogo ad ogni tipo di fantasia nerd 😎 ahaha!

L'ESP8266 può funzionare in tre modi diversi: come stazione WiFi, come Access Point oppure entrambe le modalità contemporaneamente. In questo caso l'ho usato come Access Point per creare un Web Server JSON che restituisce temperatura ed umidità quando interrogato.

Per il codice del Web Service JSON ho usato lo stesso IDE che si usa per programmare di Arduino. Qui di seguito riporto qualche riga del codice occorrente anche se in rete si trovano svariati e tutorial. 

// E' la libreria che si occupa del Web Server
#include<ESP8266WebServer.h>

// Un'istanza del Web Server su porta 80
ESP8266WebServer server(80);

void setup(void){

// Inizializzazione HW e connessione WiFi
...

// Codice eseguito dal server all'indirizzo/jsonservice
server.on("/jsonservice", [](){
char buffer[200];
StaticJsonBuffer<200> jsonBuffer;
JsonObject& weather = jsonBuffer.createObject();
gettemperature(); // Leggo dal sensore DHT11 weather["ipaddress"] = WiFi.localIP().toString();
weather["temperature"] = String(temp_c);
weather["humidity"] = String(humidity);
weather["last_update"] = getCurrentTime();
server.send(200, "text/plain", buffer);
});
server.begin(); // Avvia il server
Serial.println("HTTP server started"); }
void loop(void){
// Il server si mette in ascolto di richieste HTTP GET o POST dei client
server.handleClient(); }


Il codice precedentemente riportato è evidentemente solo una parte: occorre aggiungere il codice per l'inizializzazione HW, la connessione alla rete WiFi ed il codice per gestire il sensore che si trova facilmente in rete. Occorre a questo punto solo programmare il dispositivo, connettersi alla rete WiFi e fare la prima chiamata al Web Server. Il sensore DHT11 è molto lento e poco preciso e quindi bisogna attendere un pochino prima di avere dati significativi.

Per interrogare il Web Server si possono usare vari client: un browser ad esempio, un programma specializzato oppure un'App. Si usano a tal proposito le richieste HTTP GET o POST.

Le richieste HTTP POST sono usate per inviare dati e riceverli, ad esempio il tuo username e password quando fai il login ad un sito. Le informazioni inviate al server con il metodo POST sono elaborate e possono determinare anche delle operazioni di modifica lato server o azioni da eseguire in base ai dati di input.

Le richieste HTTP GET sono usate per ricevere dati dal server, ad esempio una pagina web o come nel mio caso dei dati formattati JSON. Sono solo richieste e non cambiano nulla lato server.

La stringa che occorre per usare il Web Service precedentemente creato è del tipo HTTP GET ed è tipo questa: http://192.168.1.31:80/jsonservice. Usata nella barra degli indirizzi di un browser, se tutto funziona correttamente, restituisce le seguenti informazioni:


JSON Web Service

Con Android Studio ho fatto anche un'App Android che usa lo stesso Web Service. L'App ed ha le seguenti caratteristiche che ritengo siano interessanti:
- Identificazione subnet della rete WiFi alla quale si è effettuato il login 
- Scansione della rete per cercare gli IP dei Web Server live 
- Report, per ogni "server" in rete, delle informazioni restituite dalla HTTP GET
- Metodi asincroni per la scansione della rete e delle query ai Web Server


Come si nota dai print screen ho due dispositivi collegati alla rete WiFi con lo stesso codice SW precedentemente illustrato e caricato a bordo. Hanno evidentemente IP univoco e riportano umidità e temperatura diversa dato che si trovano in due ambienti diversi (diciamo così ahahah 😀 in realtà è il sensore DHT11 che non è molto preciso). Ci sarebbe molto da dire anche per la parte Android, ma questo forse in un'altra puntata!

Per finire metto qualche foto dei dispositivi che ho usato: il NodeMCU e l'ESP01 



Per ulteriori informazioni o chiarimenti non esitate a contattarmi!