Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
______________________________ ENTE/I: Facolt di Scienze PROTOCOLLO N.: Uni-789-2011 DATA EMISSIONE: 01/11/2011 PAG. 1/51
OGGETTO:
1REVISIONI
Data 01/11/10 15/11/11 22/11/11 29/11/11 06/12/11 20/12/11 Versione 0.1 0.2 0.3 0.4 0.5 0.6 Autore Sangiovanni Peron/Sangiovanni Peron Peron Peron Peron Descrizione Nuova
Assegnazione Funzionalit del Sistema
Presentazione Mockup Revisione Mockup e presentazione Use Case Diagram Revisione Use Case Diagram Presentazione Class Diagram,Sequence Diagram,Activity Diagram e Statechart Diagram
DEFINIZIONE DELLARCHITETTURA
Individuazione componenti fondamentali: FUNZIONALI Utilizzo da browser :trattandosi di un applicazione BROWSER-BASED ,il fulcro dellarchitettura di questo progetto consiste nel servire allutente finale uninsieme di pagine web che gli permettono,attraverso il proprio web browser ,di interagire con le dinamiche di gioco,si rivela quindi indispensabile limpiego di un web server in grado di gestire pagine dinamiche. Persistenza: i meccanismi alla base di questo genere di giochi sfruttano scale temporali molto dilatate :levoluzione di singoli utenti e del mondo nel quale interagiscono si sviluppano nel corso di mesi .Queste modifiche e cambiamenti devono pertanto essere permanenti e non ristretti alla singola sessione di gioco;vista la grande mole di utenti impegnati contemporaneamente in questa attivit ,la soluzione pi adatta a mantenere lo stato globale dellapplicazione consiste nellutilizzo di un motore database. User experience : per garantire allutente finale un certo livello qualitativo nellinterazione con le pagine che compongono lapplicazione e per gestire le fasi di gioco troppo dinamiche per coinvolgere ROUND-TRIP con il server , opportuno basare parte delle componenti dellinterfaccia utente su tecnologie che agiscono lato client. NON FUNZIONALI Vi sono requisiti non funzionali che influiscono direttamente sulla struttura dellapplicazione ,i pi significativi da un punto di vista architetturale sono i seguenti: indipendenza tra i tier: per non ostacolare evoluzioni future del progetto in direzioni diverse da quelle iniziali, importante che vi sia un basso accoppiamento tra i vari strati che compongono lintera applicazione in particolare tra la business logic e il presentation layer non solo in termini di moduli software ma anche da un punto di vista fisico e tecnologico. Ad esempio non escluso che si desideri in seguito fornire agli utenti la possibilit di accedere al gioco attraverso altre piattaforme come mobile clients. scalabilit : RISIKO implica di per se una struttura di gioco che accoglie un numero sensibile di giocatori ,nellordine delle migliaia. Per far fronte a unimportante mole di accessi si richiede allarchitettura alla base del gioco stesso di essere molto scalabile,in grado cio di sopperire ad eventuali insufficienze prestazionali semplicemente aumentando il numero di server coinvolti. Con un buon livello di indipendenza tra i tiers,inoltre,linvestimento di nuove risorse risulta pi efficace perch maggiormente mirato sui punti deboli del sistema. Robustezza: larchitettura del sistema deve prevedere che intervengano
malfunzionamenti di vario genere ,dai problemi hardware ai bug software. A fronte di tali avvenimenti,il software deve essere strutturato in modo da minimizzare le ripercussioni sugli utenti finali, notificando lutente in modo chiaro e non allarmante mantenendo uno stato globale di gioco sempre consistente ed evitando grosse perdite di informazioni. Performance: in un contesto che prevede grosse moli di richieste al sever,anche il pi piccolo utilizzo di porzioni di memoria o cicli di cpu per il rendering di una pagina pu avere ripercussioni decisamente sensibili nel complesso;le varie componenti che agiscono lato server,pertanto,devono essere ottimizzate il pi possibile e utilizzare il minimo indispensabile delle risorse. Manutenibilit: ciascun modulo che compone lapplicazione devessere facilmente modificabile ,sia per la correzione di bug,sia per laggiunta di nuove funzionalit .Risulta quindi consigliabile che gli svariati elementi simili(pagine,stili,oggetti che espongono le informazioni dal database,etc.)siano strutturati in modo da fornire un punto condiviso per apportare le modifiche. Per definire un punto di abbozzo dellarchitettura si tenuto in maggior conto soprattutto il rispetto dei primi due vincoli non funzionali ,ovvero lindipendenza tra i tiers e la scalabilit. Gli elementi che compongono sono stati scomposti come segue: 1)Database: per la persistenza dei dati; 2)Data Access Layer:che funge da wrapper per le informazioni presenti nel database; 3) Business Logic Layer: si occupa della gestione dei meccanismi di gioco; 4)Un insieme di Web Services che espongono le interazioni e le informazioni elaborate dal livello responsabile delle business rules; 5)un Web Server per rendering delle pagine web inviate allutente,che compongono le fondamenta del Presentation Layer. Un ulteriore porzione di presentation layer realizzato con tecnologie che agiscono lato client. In figura rappresentato uno schema riassuntivo di come queste componenti sono distribuite e del modo in cui interagiscono tra loro
CLIENT
WS
BL
DAL
DB
lato client
WEB SERVER
lato server
I Web Services costituiscono un passaggio obbligato tra il web server (responsabile delle pagine dinamiche ) e la logica dellapplicazione. Questo vincolo presenta alcuni indubbi vantaggi: permette di ottenere un elevatissimo grado di disaccoppiamento tra la logica di Business e la componente di presentazione ,rendendo possibile linterazione con le dinamiche di gioco da parte di qualsiasi client tramite web application. Tuttavia,introduce numerosi problemi,tra cui: pesante impatto sulle performance: per qualsiasi architettura anche la pi semplice,alla di business,il motore di rendering delle pagine dinamiche costretto a interagire il WEB-SERVICE relativo,se questo si trova addirittura su unaltra macchina,le prestazioni precipitano enormemente a causa delle comunicazioni via rete e dellhoverhead introdotto dal protocollo SOAP . necessit di authorization:dal momento che le richieste al Web Services possono provenire sia dal Web Server sia dagli script lato client ,oltre che da potenziali client alternativi, necessario discernere quali Web Methods richiedono particolari autorizzazioni per poter essere eseguiti. Risulta quindi pi ragionevole che il motore di rendering delle pagine dinamiche abbia accesso diretto alla logica di business , e sia affiancata da Web Services per alcune interazioni lato client e per le simulazioni pi dinamiche. Vi un altro insieme di considerazioni che riguardano linterazione tra le logiche di business e la base di dati. Collocazione delle besuness rules : innanzitutto , non facile tracciare una linea di demarcazione netta tra quali siano le regole di business che riguardano prevalentemente lintegrit e la coerenza dei dati e,quali invece agiscono in maniera pi astratta sulle dinamiche di funzionamento del gioco stesso .In altre parole, non sempre risulta semplice scegliere se una particolare regola trovi collocazione ottimale allinterno del database ,sotto forma di trigger o stored procedure ,oppure nel modello ad oggetti della logica di business. Molteplicit delle entit coinvolte : nella maggior parte dei casi un singolo avvertimento o interazione con la logica di funzionamento del gioco corrisponde alla modifica di numerosi record appartenenti a realt diverse .Se effettuata a livello di modello ad oggetti la propagazione di queste modifiche diviene molto complessa,soggetta ad errori e soprattutto molto poco performante. Decidendo di supportare parzialmente queste modifiche attraverso la programmazione interna al database ci si ritrova al problema precedente ovvero lo stabilire quale sia il limite ideale tra logica di business e integrit dei dati. Scarsa robustezza: pi le logiche di funzionamento sono distanti dalla base di dati,minore la robustezza dellapplicazione,se le informazioni vengono persistite su database solo alla fine dei processi di gestione della logica di business ,un malfunzionamento del server pu causare un rollback di dimensioni molto consistenti.
Transazioni: vi sono molte operazioni che richiedono atomicit nellessere eseguite ,garantire transazionalit operando a livello di database relativamente semplice,mentre nel caso di modello ad oggetti pu essere molto problematico. Concorrenza: come per la transazionalit ,anche la concorrenza un fattore molto pi semplice da gestire attraverso il motore database piuttosto che col modello ad oggetti,dove le operazioni multithreaded e multiutente possono compromettere rapidamente la consistenza delle informazioni. Risulta conveniente spostare la logica di business direttamente allinterno del database Programmare le dinamiche di gioco utilizzando triggers e stored procedure risulta sicuramente pi complesso rispetto al modello ad oggetti ma permette di allocare livelli di performance ,robustezza,coerenza,transazionalit e gestire degli accessi decisamente molto superiori. La prossima componente da definire ed analizzare il DATA ACCESS LAYER: infatti a questo modulo che spetta il compito di fare da parte tra il mondo relazionale,cio quello dei dati strutturati e gestiti dal DBMS e quello orientato agli oggetti ,ovvero linsieme di classi che compongono il presentation tier. Con lo spostamento della business logic allinterno della base di dati,cambia in parte il ruolo svolto dal DAL ,o perlomeno la sua connotazione. In un primo momento ,secondo labbozza iniziale di architettura dellapplicazione ,il DAL doveva svolgere il ruolo tramite tra BL e lo schema interno del DataBase. Da un punto di vista maggiormente diretto ,in sostanza i compiti del DAL sarebbero stati fondamentalmente due: Lettura : dei dati provenienti dal DB e conseguentemente istanzi azione e inizializzazione di oggetti che modellano in maniera astratta le dinamiche di gioco,contenenti numerosi metodi per il rispetto delle logiche di business. Persistenza: su database degli oggetti di business una volta completata lesecuzione delle business rules prendendosi carico direttamente dei problemi legati alla validazione dei dati alla consistenza ,alla transazionalit e aggiornando gli oggetti con i valori creati o modificati sulla base di dati in seguito agli ultimi aggiornamenti. A meno di complicare ulteriormente la parte di DB ,il DAL necessita di una lista di personalizzazione delle singole classi che lo compongono. Lo spostamento delle logiche di business allinterno del database permette invece di approcciarsi alla componente di accesso di dati in modo molto pi semplice e standardizzato.
Su di essa gravano sempre i compiti di lettura e scrittura sulla base di dati,ma assumono in questo caso una connotazione decisamente diversa: la lettura dei dati pu sintetizzare le informazioni provenienti dalla base di dati in semplici data-objects,oggetti che espongono pubblicamente e in maniera tipizzata i valori dei singoli record. Linterazione con le dinamiche di gioco pu avvenire mediante un ristretto numero di metodi pubblici che permettono di dialogare con il ben pi semplice schema esterno del database(chiamando ad esempio le relative stored procedures o modificando viste aggiornabili) Tale esterma semplificazione data dal fatto che non vi pi la necessit di incontrare lapplicazione dei meccanismi di gioco sui data-objects,appesantendoli con grossi vincoli ,validazione modifiche a catena e via dicendo il ruolo si trasforma in una sorta di wrapper per lo schema esterno del database ad uso e consumo del presentation layer. In questo modo , possibile la standardizzare naturalmente la struttura dei dataobjects,fino alla definizione attraverso code.generation,decisamente conveneiente in questo progetto. Adesso possiamo passare alla definizione dei requisiti per le due categorie principali che compongono il Data Access Layer : il data object che stabiliscono dei Mapping tra lo schema esterno del DB ed presentation layer,ed il gestore del dialogo col database ,che si occupa del dialogo vero e proprio con il DBMS,eseguendo query e comandi SQL. DATA OBJECT Meccanismi di security: importante limitare laccesso alle informazioni ed alle informazioni ai soli utenti autorizzati ,si desidera pertanto che i meccanismi di security siano implementati gi a questo livello piuttosto che a livello di interfaccia utente. Meccanismi di caching: date le altissime probabilit che svariate informazioni provenienti dal database sono riutilizzabili pi volte, indispensabile ai fini delle performance che i data object prevedano meccanismi di caching. Compatibilit con i controlli offerti dal presentation layer: senza dubbio la piattaforma scelta per il rendering delle pagine dinamiche offrir alcuni controlli per la rappresentazione dei dati, opportuno che i data object vengano progettati fin da subito in un ottica di compatibilit con tali strumenti. Interazione automatizzata con il database : almeno per le modifiche pi semplici ,come ad esempio il cambiamento di un valore ,si desidera che i dataobjects gestiscano in maniera automatica la propagazione di tali aggiornamenti sulla base di dati.
Gestione autonoma delle eccezioni : gli errori generati dalla logica di business ,che si tratti di problemi interni o rifiuti di operazioni non valide ,devono filtrare al layer successisottoforma di eccezioni ben tipizzate che espongano il problema in maniera user-friendly(e senza esporre dettagli interni). Estensibilit: deessere possibile laggiunta di nuovi behavier alle singole classi senza che questo interferisca con il loro normale funzionamento di data-objects. Utilizzabili da Java-Script: le informazioni cos strutturate devono essere fruibili nel modo pi semplice possibile anche da codice Java Script lato client. Autogenerazione : se possibile, lautogenerazione dei data-objects garantirebbe enormi risparmi di tempo in fase di generazione e manutenzione di queste classi.dal momento che lo spostamento della logica di business allinterno del DB semplifica e standardizza notevolmente la struttura dei data-object, fortemente indicato lo sviluppo di un tool per la code generation. Type-safe: le informazioni organizzate nei data-object devono essere fortemente tipizzate ed avvicinarsi il pi possibile al relativo SQL Type. Performance : vista la mole dei dati da trattare assolutamente prioritario che i data object progettati consumino il minimo indispensabile delle risorse. La connessione al database deve essere mantenuta aperta solo per lo stretto necessario affinch sia possibile leggere i dati ,eseguire comandi. La composizione dei data-object deve evitare lutilizzo di oggetti pesanti,e minimizzare loccupazione di RAM. GESTORE DATABASE Integrazione efficiente con i data-object: il gestore dellinterazione con il database devessere in grado di generare data-object senza che vi sia la necessit per gli utilizzatori di specificare informazioni relative a query da effettuare. MODULO SIMULAZIONE Rappresenta quasi una realt a se stante allinterno del progetto. Con questo termine,sintende la componente responsabile di gestire i meccanismi di gioco pi dinamici,che presentano tempistiche troppo rapide o aggiornamenti troppo frequenti per essere inglobati efficacemente nella BUSINESS LOGIC contenuta nella base di dati. Ne costituiscono un esempio calzante le simulazioni degli scontri tra armate,la loro gestione separata consigliabile per una serie di motivi: -sono soggette a moltissime trasformazioni anche computazionalmente impegnative ,nellarco di poco tempo .La loro gestione a livello di basi di dati risulta molto complicata e decisamente poco performante; -le simulazioni si svolgono a finestre temporali ridotte e non hanno un senso compiuto se non alla fine dellintero processo.
Persistere i dati intermedi ,oltre che molto oneroso in termini di performance,risulta inutile. -in caso di simulazioni a pi stadi, in cui previsto lintervento dellutente,il modulo si pu interfacciare direttamente con lesterno attraverso il Web server e non ha bisogno di compiere tutto il percorso attraverso DAL e presentation layer. -i modelli di simulazione sono soggetti a cambiamenti e aggiornamenti molto pi frequenti rispetto alla strutturazione dei dati ed il resto delle logiche di business. Innanzitutto i moduli di simulazione devono essere accessibili direttamente dal presentation layer ,sia lato server per il rendering delle pagine e le interazioni pi profonde sia lato client per le chiamate e aggiornamenti pi superficiali in modo pi versatile per ottenere questi risultati consiste nellutilizzo del WebServices. GESTORE SECURITY Laccesso ai metodi che compongono questi moduli deve essere ristretto ai soli utenti autorizzati in quel particolare contesto ; indispensabile quindi che questa componente implementi al suo interno dei meccanismi di security. Per ogni simulazione il modulo effettuer soltanto due comunicazioni con le basi di dati :una lettura allavvio per inizializzare le realt che intervegano nel modello,ed una alla fine per aggiornare le entit coinvolte con le modifiche derivanti dalla simulazione. Lunione delle fasi intermedie simulate,invece,dev essere propagato al client affinch possa presentare allutente una rappresentazione completa dello scontro. Quindi di seguito rappresentata la nuova configurazione architetturale del progetto:
CLIENT
WS
MODULO SIM BL
DAL DB
(DISPONI ARMATE)
(FASE DI ATTACCO)
(INVIA MESSAGGIO)
(PASSA TURNO)
(SALVA PARTITA)
STATECHART RISTRUTTURATO:
CRC CARDS CREAZIONE NUOVA PARTITA Component Creazione Partita SuperClasse: SottoClasse: Pulsante,Tabella Responsabilit
Esegue azione collaboratore richiesta da un
Collaboratori
Form Imposta Parametri Partita
Collaboratori
Collaboratori
Collaboratori
Controllo Creazione Nuova Partita Component Creazione Partita
SottoClasse: Responsabilit
Effettua controlli sulla nuova partita
Collaboratori
Controllo Correttezza Dati Controllo Mappa Form Imposta Parametri Partita Modulo Persistenza Dati Form Partita Gi Presente
Collaboratori
Messaggio Errore Controllo Creazione Nuova Partita
Collaboratori
Google Maps Server Form Mappa Non Disponibile Mappa Controllo Creazione Nuova Partita
Collaboratori
Controllo Creazione Nuova Partita Mappa Partita Proprietario
Collaboratori
Controllo Creazione Nuova Partita
Responsabilit
Visualizza messaggio errore
Collaboratori
Controllo Correttezza Dati
Collaboratori
Controllo Mappa
Collaboratori
Controllo Mappa
Collaboratori
Controllo Mappa Modulo Persistenza Dati Territorio Armata Partita
Collaboratori
Proprietario Mappa Modulo Persistenza Dati
Collaboratori
Collaboratori
Collaboratori
Component Creazione Partita Armata Territorio Modulo Persistenza Dati
CARICAMENTO E PARTECIPAZIONE PARTITA Component Partecipazione e Caricamento Partita SuperClasse: SottoClasse: Pulsante ,Tabella Responsabilit
Esegue azione collaboratore richiesta da un
Collaboratori
Elenco Partite Create Elenco Partite Salvate
Collaboratori
Partecipazione e Caricamento
Collaboratori
Elenco Partite Create Controllo Mappa Messaggio massimo numero di giocatori raggiunto
Collaboratori
Controllo Partecipazione Partita
Collaboratori
Controllo Caricamento Partita Controllo Partecipazione Partita Partita Mappa Giocatore
Collaboratori
Elenco Partite Salvate Controllo Mappa Modulo Persistenza Dati Form Visualizzazione Errore
Collaboratori
Controllo Caricamento Partita
Partecipazione e Caricamento
Collaboratori
Controllo Caricamento Partita
Collaboratori
Controllo Mappa
Collaboratori
Controllo Mappa
Collaboratori
Controllo Mappa Modulo persistenza Dati Territorio Armata Partita
Collaboratori
Google Maps Server Form Mappa Non Disponibile Mappa Controllo Partecipazione Partita
Collaboratori
Giocatore Mappa Modulo Persistenza Dati Controllo Partecipazione Partita
Responsabilit
Contiene i dati relativi alle armate Giocatore Mappa
Collaboratori
Collaboratori
Collaboratori
Partecipazione e Caricamento
DISPOSIZIONE INIZIALE ARMATE Component Disposizione Armate SuperClasse: SottoClasse: Pulsante,Tabella,Indicatore,Tasto pi,Tasto meno,Display Responsabilit Collaboratori
Esegue azione collaboratore richiesta da un Menu giocatore
SottoClasse Responsabilit
Aziona un comando richiesto
Collaboratori
Collaboratori
Collaboratori
Collaboratori
Collaboratori
Collaboratori
Collaboratori
Component Disposizione Armate Controllo Disposizione Armate
Collaboratori
Menu Giocare Messaggio Disponi Armate Form numero armate insufficienti Modulo persistenza dati
Collaboratori
Controllo disposizione armate
Collaboratori
Controllo disposizione armate
Collaboratori
Modulo Persistenza Dati Territorio Armata Partita
Collaboratori
Giocatore Mappa Modulo Persistenza Dati
Collaboratori
Collaboratori
Collaboratori
Component Disposizione Armate Armata Territorio Modulo Persistenza Dati Partita
Collaboratori
Controllo Disposizione Armate Mappa Partita Giocatore
FASE DI ATTACCO Component Attacco SuperClasse: SottoClasse: Pulsante,tabella,display risultati,territorio origine,territorio Destinazione,selezionatore dado Responsabilit Collaboratori
richiesta da un Menu attacco Form lancia dadi
Collaboratori
Collaboratori
Collaboratori
Collaboratori
Collaboratori
Collaboratori
Component attacco Controllo Attacco
Collaboratori
Form lancia dadi Menu attacco Punteggio avversario Modulo persistenza dati
Collaboratori
Controllo Attacco
Collaboratori
Modulo Persistenza Dati Territorio Armata Partita
Collaboratori
Giocatore Mappa Modulo Persistenza Dati
Responsabilit
Contiene i dati relativi alle armate Giocatore Mappa Territorio
Collaboratori
Collaboratori
Collaboratori
Component Disposizione Armate Armata Territorio Modulo Persistenza Dati
Collaboratori
Controllo Attacco Mappa Partita Giocatore
Responsabilit
Esegue azione collaboratore richiesta da un
Collaboratori
Form conversazione
Collaboratori
Collaboratori
Controllo Invio messaggio Component invio messaggio
Collaboratori
Form di conversazione
Collaboratori
Component invio messaggio
PASSA TURNO Component Passa Turno SuperClasse: SottoClasse: pulsante,display turno,led turno Responsabilit Collaboratori
richiesta
da
un
con
loperazione
Collaboratori
Collaboratori
Collaboratori
Collaboratori
Component Passa Turno Controllo passa Turno
Collaboratori
Continuare con loperazione selezionata?
Collaboratori
Component passa turno
Collaboratori
Sei sicuro di voler salvare la partita?
Collaboratori
Collaboratori
Controllo Salvataggio partita Component salva partita Controllo Salvataggio partita
Collaboratori
Sei sicuro di voler salvare la partita? Modulo persistenza Dati
Collaboratori
Controllo Salvataggio Partita
Collaboratori
Component Salva partita
Diagramma di Gantt
TestCase
TEST ID TEST NAME TEST DESCRIPTION 1 INCVALORE Si intende verificare il corretto funzionamento dell operazione di incremento del valore relativo alla classe Indicatore Armate INPUT RISULTATO RISULTATO DESIDERATO OTTENUTO Pressione del Lindicatore tasto + Armate visualizza Precondizioni: il suo valore di -il Sistema default 1 nella fase di disposizione iniziale -Indicatore Armate al suo valore di default Pressione del Il valore viene tasto + incrementato di Precondizioni: una unit -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore default Non viene Il valore di premuto nessun rimane invariato altro tasto
N 1
Precondizioni: -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore default NOTE: per il corretto funzionamento delloperazione di incremento sono stati effettuati ulteriori controlli sul tipo di valore che viene fornito in ingresso : valore deve essere di tipo intero
N 1
2 DECVALORE Si intende verificare il corretto funzionamento dell operazione di decremento del valore relativo alla classe Indicatore Armate INPUT RISULTATO RISULTATO DESIDERATO OTTENUTO Pressione del Lindicatore tasto - Armate visualizza Precondizioni: il suo valore -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore di default Pressione del Il valore viene tasto + decrementato di Precondizioni: una unit -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore default Non viene Il valore di premuto nessun rimane invariato altro tasto
Precondizioni: -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore default NOTE: per il corretto funzionamento delloperazione di decremento sono stati effettuati ulteriori controlli sul tipo di valore che viene fornito in ingresso : valore deve essere di tipo intero
N 1
3 SETVALORE Si intende verificare il corretto funzionamento dell operazione di inizializzazione del valore relativo alla classe Indicatore Armate INPUT RISULTATO RISULTATO DESIDERATO OTTENUTO Pressione del Lindicatore Armate tasto +/- visualizza il suo valore Precondizioni: -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al suo valore di default Pressione del Il valore viene tasto +/- incrementato/decrementat Precondizioni: o di una unit. -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore default Non viene Il valore di rimane premuto nessun invariato altro tasto
Precondizioni: -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore default NOTE: per il corretto funzionamento delloperazione di inizializzazione sono stati effettuati ulteriori controlli sul tipo di valore che viene fornito in ingresso : valore
deve essere not null. TEST ID TEST NAME TEST DESCRIPTION N 1 4 GETVALORE Si intende verificare il corretto funzionamento dell operazione di getValore() relativo alla classe Indicatore Armate INPUT RISULTATO RISULTATO DESIDERATO OTTENUTO Pressione del Lindicatore Armate tasto + visualizza il suo valore Precondizioni: -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore di default Pressione del Il valore viene tasto +/- incrementato/decrementat Precondizioni: o di una unit -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore default Non viene Il valore di rimane premuto nessun invariato altro tasto
Precondizioni: -il Sistema nella fase di disposizione iniziale -Indicatore Armate non al valore default NOTE: per il corretto funzionamento di getvalore sono stati effettuati ulteriori controlli sul tipo di valore che viene fornito in uscita : valore deve essere di tipo intero TEST ID 5
VERIFICA PARTITA Si intende verificare il corretto funzionamento dell operazione di creazione di una nuova partita INPUT RISULTATO RISULTATO DESIDERATO OTTENUTO Pressione del Il Sistema tasto NUOVA visualizza il Precondizioni: pulsante nuova -il Sistema nella fase di creazione nuova partita Pressione del tasto NUOVA Precondizioni: -il Sistema apre il form relativo alla creazione della nuova partita Il Sistema visualizza il form CREAZIONE NUOVA PARTITA
Pressione del Il sistema salva tasto NUOVA: tutti i dati relativi Precondizioni: alla creazione della -Tutti i campi nuova partita relativi al form nuova partita vengono compilati correttamente Nessuna Il Sistema apre il pressione del tasto form PLAY NUOVA
CODICE JUNIT: //Classe partita package it.unina.dsf.knomelab; public class Partita { private String partitaName; //Costruttore public Partita(String name){ this.setPartitaName=name; } public void setPartitaName(String partitaName) { this.partitaName = partitaName; } public String getPartitaName() { return partitaName; } } //classe giocatore package it.unina.dsf.knomelab; import java.util.HashMap; import java.util.Map;
public class Giocatore { private String password; private String Username; public HashMap<String, Partita> nuova;
//costruttore public Giocatore(String password,String username){ this.setPassword(password); this.setUsername(username); this.nuova = new HashMap<String,Partita>(); } public HashMap<String, Partita> getNuova() { return nuova; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } public void setUsername(String username) { Username = username; }
public String getUsername() { return Username; } } //Classe indicatore armate package it.unina.dsf.knomelab; public class MyClass { int valore; public int IncValore(int valore){ return ++valore; } public int DecValore(int valore){ return --valore; } public int getValore(int valore){ return valore ; } public int SetValore(int valore){ return this.valore=valore; }
//TESTING * */ package it.unina.dsf.knomelab; import static org.junit.Assert.*; import org.junit.Test; /** * * */ public class MyClassTest { @Test public void testIncValore(){ MyClass inc = new MyClass(); //il test passa il valore fornito in ingresso viene incrementato di una unit assertEquals("incr",1,inc.IncValore(0)); //il test non passa il valore non viene incrementato di una unit assertEquals("notincr",2,inc.IncValore(0)); //test sul tipo di dato fornito in ingresso:il dato in ingresso deve essere di tipo intero assertSame("Result",1,inc.IncValore(0)); //test passa il parametro fornito non valido assertNotSame("NotResult",2,inc.IncValore("stringa")); } @Test public void testDecValore(){ MyClass dec = new MyClass(); //il test passa il valore fornito in ingresso viene decrementato di una unit assertEquals("incr",0,dec.DecValore(1)); //il test non passa il valore non viene decrementato di una unit assertEquals("notincr",2,dec.DecValore(0)); //test sul tipo di dato fornito in ingresso:il dato in ingresso deve essere di tipo intero assertSame("Result",0,dec.DecValore(1)); //test passa il parametro fornito non valido assertNotSame("NotResult",1,dec.DecValore(5)); }
@Test public void TestgetValore(){ MyClass ritorna = new MyClass(); //il test passa il metodo restituisce il valore inserito assertEquals("ritorna",1,ritorna.getValore(1)); //il test fallisce assertEquals("notritorna",2,ritorna.getValore(3)); //test passa fa riferimento allo stesso oggetto assertSame("ok",3,ritorna.getValore(3)); }
@Test public void TestSetValore(){ MyClass set = new MyClass(); //test passa il valore inserito valido assertEquals("ritorna",1,set.SetValore(1)); //test non passa il valore inserito non valido assertEquals("ritorna",1,set.SetValore(2)); //test passa il valore inserito notnull assertNotNull("notnull",set.SetValore(1)); } @Test public void VerificaPartita() { Partita pr =new Partita("Oceano"); Giocatore gi= new Giocatore("luca","566/228"); //verifico che il DB interno contiene la partita creata dal giocatore assertFalse(pr.getPartitaName().keySet().contains(partitaName)); //verifico che la nuova partita stata aggiunta alla lista assertEquals(1,gi.getNuova().size()); } }