PASS Virtual Chapter - SQL Server Continuous IntegrationAlessandro Alpi
油
Build automatizzate, esecuzione di unit test, creazione di un pacchetto nuget, ecco cosa serve per essere pronti con SQL Server e la continuous integration
Unit Test: Un tipo di test del software in cui vengono testate singole di un software. Lo scopo 竪 convalidare che ogni unit del codice software funzioni come previsto. Lo Unit Testing viene eseguito durante lo sviluppo (fase di codifica) di un'applicazione da parte degli sviluppatori. Essi isolano una sezione di codice e ne verificano la correttezza.
Unit: pu嘆 essere una singola funzione, metodo, procedura, modulo o oggetto. La definizione di unit 竪 decisa team by team
Una panoramica sui test automatizzati con un p嘆 di teoria su come approciarsi.
Ed infine una panoramica su Serenity BDD, tool utilizzato per creare i test automatizzati
Le operazioni di testing possono richiedere molto tempo e possono implicare ingenti costi per le imprese. Per questo motivo 竪 di fondamentale importanza individuare sul mercato le migliori soluzioni disponibili, al fine di ridurre al minimo gli effort impiegati per testare le proprie applicazioni.
TestComplete di SmartBear centra appieno questi obiettivi: TestComplete, infatti, offre una piattaforma di test per creare, eseguire e mantenere in modo semplice test automatici per applicazioni software di tipo desktop, Web, mobile, e client-server, favorendo unelevata riduzione dei tempi e dei costi dedicati alle operazioni di testing.
In questo webinar uno dei Testing Guru di Emerasoft mostra come sfruttare al meglio le potenzialit offerte dal testing automatico grazie allutilizzo di TestComplete.
Guarda il webinar on demand: https://www.youtube.com/watch?v=N7aTTfSoREI
Una primissima introduzione al TDD per chi 竪 a digiuno di test in generale e di TDD in particolare. Usa Java/Junit, ma 竪 facimente adattabile ad altri linguaggi. 40-60 minuti.
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
油
Continuous Integration con SQL Server. Come automatizzare i processi di build e di test su database SQL Server. Come includere SQL Server nei processi di Application Lifecycle Management (Database Lifecycle Management).
Test, Tools and Tips per tester e non.
Consigli su come affrontare il testing e come comportarsi con applicazioni di tipo web, con scenari e possibili soluzioni con vari tools a disposizione
Analisi di prestazione dell'interprete tuProlog su piattaforma Java - Present...MicheleDamian
油
Il documento presenta il lavoro di tesi svolto da Michele Damian presso la facolt di Ingegneria Informatica dell'universit di Bologna. Lo scopo della dissertazione 竪 quello di analizzare il comportamento di tuProlog (un interprete per il linguaggio di programmazione logica Prolog) e individuarne i punti critici al fine di migliorarne le prestazioni sia in termini di tempi di esecuzione che di gestione della memoria.
Quando si scrivono i test, la corretta gestione delle dipendenze (Dependency Injection) 竪 uno degli aspetti pi湛 rilevanti e molte volte le best practices per lutilizzo di un Dependency injector ed una libreria di Mocking sono le stesse.
In questa presentazione si cerca di capire quando un Dependency injector rappresenta un Anti-pattern e quando invece diventa un valido strumento professionale per risparmiare tempo, ridurre gli errori, scrivere meno codice e rendere lapplicazione molto flessibile.
Tutto questo per嘆 senza sacrificare il design dei nostri oggetti e legarci in modo indissolubile ad un framework.
Quando, come e perch辿 utilizzare PowerMock. Vengono analizzati i legami tra design delle applicazioni e strumenti di test. Sono presenti esempi di codice semplice ma verosimile con i rispettivi test.
Il testing delle applicazioni MVC Zend Framework 竪 spesso visto come una sorta di stregoneria, ma tutto sommato non lo 竪. In questo seminario web vedremo cosa e come testare, i pattern pi湛 comuni per il testing e le possibili difficolt che si possono incontrare. Verranno trattati inoltre alcuni elementi di base su PHPUnit in modo da fornire concetti fondamentali per loperativit anche a chi non 竪 esperto di testing.
Le operazioni di testing possono richiedere molto tempo e possono implicare ingenti costi per le imprese. Per questo motivo 竪 di fondamentale importanza individuare sul mercato le migliori soluzioni disponibili, al fine di ridurre al minimo gli effort impiegati per testare le proprie applicazioni.
TestComplete di SmartBear centra appieno questi obiettivi: TestComplete, infatti, offre una piattaforma di test per creare, eseguire e mantenere in modo semplice test automatici per applicazioni software di tipo desktop, Web, mobile, e client-server, favorendo unelevata riduzione dei tempi e dei costi dedicati alle operazioni di testing.
In questo webinar uno dei Testing Guru di Emerasoft mostra come sfruttare al meglio le potenzialit offerte dal testing automatico grazie allutilizzo di TestComplete.
Guarda il webinar on demand: https://www.youtube.com/watch?v=N7aTTfSoREI
Una primissima introduzione al TDD per chi 竪 a digiuno di test in generale e di TDD in particolare. Usa Java/Junit, ma 竪 facimente adattabile ad altri linguaggi. 40-60 minuti.
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
油
Continuous Integration con SQL Server. Come automatizzare i processi di build e di test su database SQL Server. Come includere SQL Server nei processi di Application Lifecycle Management (Database Lifecycle Management).
Test, Tools and Tips per tester e non.
Consigli su come affrontare il testing e come comportarsi con applicazioni di tipo web, con scenari e possibili soluzioni con vari tools a disposizione
Analisi di prestazione dell'interprete tuProlog su piattaforma Java - Present...MicheleDamian
油
Il documento presenta il lavoro di tesi svolto da Michele Damian presso la facolt di Ingegneria Informatica dell'universit di Bologna. Lo scopo della dissertazione 竪 quello di analizzare il comportamento di tuProlog (un interprete per il linguaggio di programmazione logica Prolog) e individuarne i punti critici al fine di migliorarne le prestazioni sia in termini di tempi di esecuzione che di gestione della memoria.
Quando si scrivono i test, la corretta gestione delle dipendenze (Dependency Injection) 竪 uno degli aspetti pi湛 rilevanti e molte volte le best practices per lutilizzo di un Dependency injector ed una libreria di Mocking sono le stesse.
In questa presentazione si cerca di capire quando un Dependency injector rappresenta un Anti-pattern e quando invece diventa un valido strumento professionale per risparmiare tempo, ridurre gli errori, scrivere meno codice e rendere lapplicazione molto flessibile.
Tutto questo per嘆 senza sacrificare il design dei nostri oggetti e legarci in modo indissolubile ad un framework.
Quando, come e perch辿 utilizzare PowerMock. Vengono analizzati i legami tra design delle applicazioni e strumenti di test. Sono presenti esempi di codice semplice ma verosimile con i rispettivi test.
Il testing delle applicazioni MVC Zend Framework 竪 spesso visto come una sorta di stregoneria, ma tutto sommato non lo 竪. In questo seminario web vedremo cosa e come testare, i pattern pi湛 comuni per il testing e le possibili difficolt che si possono incontrare. Verranno trattati inoltre alcuni elementi di base su PHPUnit in modo da fornire concetti fondamentali per loperativit anche a chi non 竪 esperto di testing.
Presentazione tesi specialistica in Ingegneria Informatica - 2012 - Universit di Trieste
"Progetto e realizzazione di uninfrastruttura di test per un sistema PACS"
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...Alessandro Alpi
油
In questa serie di slide vedremo come creare i build step su Visual Studio Team Services sfruttando gli add-on forniti da Red Gate, come DLM Automation 2: Build.
Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...Boymix81
油
Breve presentazione del lavoro svolto per la tesi : STRUMENTI PER LA GENERAZIONE AUTOMATICA DI TEST STRUTTURALI E FUNZIONALI, scaricabile dal sito web http://boymix81.mynickname.info
La continuous integration, ovvero un insieme di pratiche di sviluppo atte a rilasciare frequentemente le modifiche al nostro codice, pu嘆 essere applicata anche a SQL Server. In questa sessione andremo a descrivere come mettere sotto controllo del codice sorgente i nostri database in un'ottica di teamwork e, successivamente, a capire come automatizzare il processo di test unitario al fine di prevenire regressioni e correggere quanto prima bug.
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...Idriss Riouak
油
Uno studio sull'efficacia del checker Clang Tidy in particolare sull'efficacia del modulo "modernize". Il test 竪 stato applicato sulla Parma Polyhedra Library.
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...Davide Cerbo
油
Nicola e Davide vi guideranno in uno spericolato refactoring di un codice poco gradevole alla vista di qualsiasi buon programmatore con lo scopo di illustrare i principali problemi che normalmente affligono il nostro povero codice rendendo difficile la scrittura di fantastici e utili test unitari. Verranno spiegati i principi da rispettare per ottenere un codice facile da testare quali: dependency injection, law of demeter, uso del pattern factory e builder, corretta scrittura dei costruttori, come scovare nomi pericolosi. Ed illustrate le pratiche da evitare: pattern singleton, stati globali, service locator, scrittura di classi con troppa responsabilit. Alla fine del talk verranno presentati alcuni link, software e libri utili nella scrittura di test unitari.
1. Android Test Driven Development
Carlo Codega
carlo.codega@funambol.com
Milano, 21 Maggio 2010
2. Agenda
Introduzione al Test Driven Development
Unit testing vs Functional testing
Unit testing:
Componenti indipendenti da Android: JUnit
Componenti dipendenti da Android, isolabili dal resto dellapplicazione
Macro componenti: Application, Activity, Service e ContentProvider
Generazione di test suite
Esecuzione di test suite con adb (Android Debug Bridge)
Functional testing:
Componenti che hanno interfaccia utente: Activity
Integration testing sullintera applicazione: Instrumentation
Stress testing: Monkey tool
3. Introduzione al TDD
Perch辿 fare TDD in Android:
1. Scrivere codice che funziona :)
2. Scrivere i test prima dellimplementazione funzionale
3. Pensare al design dellapplicazione prima dellimplementazione
reale
4. Evitare i bachi di regression. Scrivere speci鍖ci test case per ogni
bug trovato
5. Facilitare il refactoring del codice
4. Unit testing vs Functional testing
Unit tests:
Servono a veri鍖care che tutte le componenti di un programma
funzionano correttamente
Vengono fatti solitamente dagli stessi sviluppatori che hanno
implementato il codice
Vengono scritti in un determinato linguaggio di programmazione
Funcional tests (o acceptance tests):
Servono a veri鍖care se un programma risponde ai requisiti dellutente
Vengono fatti da persone di QA (Quality Assurance)
Vengono scritti in un linguaggio di alto livello
5. Unit testing vs Functional testing
Unit testing Functional testing
6. Android testing framework
Android integra al suo interno un framework per il testing:
Package android.test
Basato su JUnit 3
Supporta:
Unit testing: TestCase, AndroidTestCase
Functional testing: InstrumentationTestCase
Include delle utility per facilitare la creazione di test suite
Android Debug Bridge (adb) per eseguire i test su emulatore o
device reale
7. Unit testing
Componenti indipendenti da Android: JUnit classico
TestCase
Aiuta a separare la logica dal contesto
Esempio: MorseCode
9. Unit testing
= dipendende da Android
Activity
= indipendende da Android
MorseCode MorseCodeConverter
10. Unit testing
class MorseCodeConverter {
static final long SPEED_BASE = 100;
static final long DOT = SPEED_BASE;
static final long DASH = SPEED_BASE * 3;
static final long GAP = SPEED_BASE;
/** The characters from 'A' to 'Z' */
private static final long[][] LETTERS = new long[][] {
/* A */ new long[] { DOT, GAP, DASH },
/* B */ new long[] { DASH, GAP, DOT, GAP, DOT, GAP, DOT },
/* C */ new long[] { DASH, GAP, DOT, GAP, DASH, GAP, DOT },
...
};
/** The characters from '0' to '9' */
private static final long[][] NUMBERS = new long[][] {
/* 0 */ new long[] { DASH, GAP, DASH, GAP, DASH, GAP, DASH },
/* 1 */ new long[] { DOT, GAP, DASH, GAP, DASH, GAP, DASH },
...
};
11. Unit testing
/** Return the pattern data for a given character */
static long[] pattern(char c) {
...
}
/** Return the pattern data for a given string */
static long[] pattern(String str) {
...
}
}
13. Unit testing
public class MorseCodeConverterTest extends TestCase {
public void testCharacterS() throws Exception {
long[] expectedBeeps = { MorseCodeConverter.DOT,
MorseCodeConverter.DOT,
MorseCodeConverter.DOT,
MorseCodeConverter.DOT,
MorseCodeConverter.DOT };
long[] beeps = MorseCodeConverter.pattern('s');
assertEquals(expectedBeeps, beeps);
}
}
14. Unit testing
Componenti dipendenti da Android:
AndroidTestCase
Viene utilizzato per le componenti che richiedono laccesso al
Context:
eseguire Intent, lanciare Activity e Service
accedere al File System e ContentProvider
Esempio: AndroidKeyValueStore
16. Unit testing
public class AndroidKeyValueStore {
private SQLiteDatabase dbStore;
private DatabaseHelper mDatabaseHelper;
public AndroidKeyValueStore(Context context) {
mDatabaseHelper = new DatabaseHelper(context,
"dbname, "tablename");
open();
// Create table
dbStore.execSQL(...);
close();
}
public void open() {
if(dbStore == null) {
dbStore = mDatabaseHelper.getWritableDatabase();
}
}
17. Unit testing
public void close() {
dbStore.close();
dbStore = null;
}
public void put(String key, String value) {
dbStore.execSQL(...);
}
public String get(String key) {
dbStore.execSQL(...);
}
}
18. Unit testing
AndroidTestCase
AndroidKeyValueStoreTest
19. Unit testing
public class AndroidKeyValueStoreTest extends AndroidTestCase {
private AndroidKeyValueStore store;
protected void setUp() {
store = new AndroidKeyValueStore(getContext());
store.load();
}
protected void tearDown() {
store.close();
}
public void testPutGet() throws Exception {
store.put("aKey", "aValue");
String value = store.get(aKey);
assertEquals(value, "aValue");
}
}
20. Unit testing
Test di macro componenti in ambiente controllato:
Controllo globale sul ciclo di vita del componente
Application:
ApplicationTestCase <T extends Application>
Activity (functional test):
ActivityTestCase
ActivityInstrumentationTestCase<T extends Activity> (deprecato)
ActivityInstrumentationTestCase2<T extends Activity>
Service:
ServiceTestCase<T extends Service>
ContentProvider:
ProviderTestCase <T extends ContentProvider> (deprecato)
ProviderTestCase2 <T extends ContentProvider>
21. Unit testing
AndroidTestCase
ApplicationTestCase ServiceTestCase ProviderTestCase
22. Unit testing
InstrumentationTestCase
ActivityInstrumentationTestCase
Instrumentation = Functional testing !!
23. Unit testing
Generazione di test suite per raggruppare e classi鍖care i TestCase:
TestSuite
MyTestSuite TestSuiteBuilder
24. Unit testing
Includere tutti i test case appartenenti ad un package:
public class SomeTests extends TestSuite {
public static Test suite() {
return new TestSuiteBuilder(SomeTests.class)
.includePackages("com.myapp.package1", "com.myapp.package2")
.build();
}
}
public class AllTests extends TestSuite {
public static Test suite() {
return new TestSuiteBuilder(AllTests.class)
.includeAllPackagesUnderHere().build();
}
}
25. Unit testing
Struttura dei test:
> AndroidManifest.xml
src
res
tests > AndroidManifest.xml
src > com > myapp > AllTests.java
SomeTests.java
package1 > TestCase1.java
TestCase2.java
package2 > AndroidTestCase1.java
AndroidTestCase2.java
27. Unit testing
Eseguire test suite con adb (Android Debug Bridge):
Eseguire tutti i test:
adb shell am instrument -w com.myapp/android.test.InstrumentationTestRunner
Eseguire una singola TestSuite o un singolo TestCase:
adb shell am instrument -w -e class com.myapp.SomeTests
com.myapp/android.test.InstrumentationTestRunner
adb shell am instrument -w -e class com.myapp.package1.TestCase1
com.myapp/android.test.InstrumentationTestRunner
Eseguire solo unit tests:
Test che non derivano da InstrumentationTestCase
adb shell am instrument -w -e unit true
com.myapp/android.test.InstrumentationTestRunner
28. Unit testing
Classi鍖care per dimensione:
adb shell am instrument -w -e size small
com.myapp/android.test.InstrumentationTestRunner
Classi鍖cati in base alle annotazioni:
@SmallTest > -e size small
@MediumTest > -e size medium
@LargeTest > -e size large
Output da adb:
com.myapp.package1.TestCase1:........
com.myapp.package1.TestCase2:.....
com.myapp.package2.AndroidTestCase1:.........
com.myapp.package2.AndroidTestCase1:......
Test results for InstrumentationTestRunner=............................
Time: 124.526
OK (28 tests)
29. Unit testing
Eseguire i test direttamente dallemulatore:
30. Functional testing
Componenti che hanno interfaccia utente: Activity
ActivityInstrumentationTestCase
Integration testing sullintera applicazione:
Instrumentation
31. Functional testing
Componenti che hanno interfaccia utente: Activity
InstrumentationTestCase
ActivityInstrumentationTestCase
32. Functional testing
ActivityInstrumentationTestCase2<T extends Activity>
Testing isolato per una singola Activity
Tramite loggetto Instrumentation si pu嘆 interagire con linterfaccia
utente
possibile utilizzare le TouchUtils per simulare eventi touch
40. Functional testing
public void testPressSomeKeys() {
// Make sure that we clear the output
press(KeyEvent.KEYCODE_ENTER);
press(KeyEvent.KEYCODE_CLEAR);
// 3 + 4 * 5 => 23
press(KeyEvent.KEYCODE_3);
press(KeyEvent.KEYCODE_PLUS);
press(KeyEvent.KEYCODE_4);
press(KeyEvent.KEYCODE_9 | KeyEvent.META_SHIFT_ON);
press(KeyEvent.KEYCODE_5);
press(KeyEvent.KEYCODE_ENTER);
assertEquals(displayVal(), "23");
}
41. Functional testing
public void testTapSomeButtons() {
// Make sure that we clear the output
tap(R.id.equal);
tap(R.id.del);
// 567 / 3 => 189
tap(R.id.digit5);
tap(R.id.digit6);
tap(R.id.digit7);
tap(R.id.div);
tap(R.id.digit3);
tap(R.id.equal);
assertEquals(displayVal(), "189");
42. Functional testing
// make sure we can continue calculations also
// 189 - 789 => -600
tap(R.id.minus);
tap(R.id.digit7);
tap(R.id.digit8);
tap(R.id.digit9);
tap(R.id.equal);
assertEquals(displayVal(), -600");
}
}
Le primitive sono semplici e astratte: press, tap, assert
43. Functional testing
Integration testing sullintera applicazione:
De鍖nire un linguaggio di alto livello per testare lapplicazione dal
punto di vista dellutente
Implementare un interprete del linguaggio per tradurre i comandi in
azioni effettuate tramite loggetto Instrumentation
Implementare un custom Instrumentation ci permette di avere il
totale controllo sullapplicazione
Il manifest di test deve contenere una copia del manifest
dellapplicazione originale e la de鍖nizione di un nuovo
Instrumentation per poter eseguire i test di integrazione
45. Functional testing
De鍖nire un linguaggio di alto livello per simulare le azioni
dellutente (esempio: Funambol integration tests):
StartMainApp()
KeyPress(String command, int count)
WriteString(String text)
CreateEmptyContact()
DeleteAllContacts()
Include(String scriptUrl)
Linguaggio utilizzato dal QA per scrivere i test partendo dagli
acceptance tests
47. Functional testing
CustomInstrumentation:
Carica lo script di test e lo esegue tramite il CommandRunner
CommandRunner:
Interpreta lo script
Traduce ogni comando in azione eseguita tramite il Robot
Robot:
Esegue delle azioni sullapplicazione tramite un riferimento
alloggetto Instrumentation
48. Functional testing
Acceptance test case:
1. On Device add a record in the Contacts section 鍖lling in all possible
鍖elds
2. Fire synchronization and wait for sync complete
3. Check the new contact is added to the server
49. Functional testing
# Create on Device side a new Contact (Andrea Bianchi)
CreateEmptyContact()
SetContactField(FirstName,"Andrea")
SetContactField(LastName, "Bianchi")
SetContactField(TelHome, "0382665765979")
SetContactField(TelCell, "3445674")
SetContactField(Birthday, "1987-09-13")
...
SaveContact()
# Fire the synchronization and wait that is complete
KeyPress(KeyFire)
WaitForSyncToComplete(2,20)
# Verify Exchanged Data
CheckExchangedData("Contacts",1,0,0,0,0,0)
RefreshServer()
# Verify if the contact is added on the Server
CheckNewContactOnServer("Andrea", "Bianchi", true)
50. Functional testing
Eseguire i test di integrazione:
adb shell am instrument [options] -w
com.myapp/com.myapp.CustomInstrumentation
possibile speci鍖care dei parametri aggiuntivi tramite il 鍖ag -e (extra)
I parametri vengono passati tramite una Bundle attraverso il metodo
onCreate() delloggetto Instrumentation:
public void onCreate(Bundle arguments)
Dallemulatore:
Dev Tools / Instrumentation / MyApp Integration Tests
51. Stress testing
Monkey tool:
Applicazione command line che pu嘆 essere eseguita su emulatore o
device reale
Genera eventi utente pseudo-casuali:
Click
Touch
Gestures
Con鍖gurabile:
-p <allowed-package-name>: lista dei package sui quali 竪 possibile
generare eventi
Usage:
adb shell monkey [options] <event-count>