SlideShare a Scribd company logo
1 of 67
Download to read offline
Andrea Adami (fol@fulcro.net) 1
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
JUG Meeting#76:
UNIT
TESTING
Con
PostgreSQL
Andrea Adami (fol@fulcro.net) 2
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
JUG Meeting#76:
BUONGIORNO
E
BENVENUTI
Andrea Adami (fol@fulcro.net) 3
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
JUG Meeting#76:
ANDREA
ADAMI
Andrea Adami (info@folstuff.eu) 4
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
ANDREA ADAMI
mi potete contattare tramite:
e-mail: info@folstuff.eu
blog: http://www.folstuff.eu
github: https://github.com/folstuff
linkedin: https://www.linkedin.com/in/andreaadami/it
instagram: https://www.instagram.com/folstuff
facebook: https://www.facebook.com/folstuff
google+: https://plus.google.com/+AndreaAdamiProfile
twitter @folstuff : https://twitter.com/folstuff
slideshare: https://www.slideshare.net/andreaadami
Andrea Adami (info@folstuff.eu) 5
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
WHO AM I
Andrea Adami si definisce un "Architetto di Soluzioni"
Si innamora di un Commodore 64 trovato sotto l'albero di
Natale nel 1980 e vive tutta l'evoluzione dell'informatica
dai grossi calcolatori per banche e assicurazioni fino a
internet a alle reti di personal computer passando dai
microcontrollori quando IoT era un'acronimo a cui non si
sapeva quale parola agganciare.
La cosa fuori dal comune e che dopo oltre 30 anni è
ancora sinceramente appasionato dalla programmazione
e gli piace trasmettere questa sua passione.
Nel tempo libero costruisce e fa' volare aeromodelli.
Tiene un blog all'indirizzo: http:www.folstuff.eu
Andrea Adami (info@folstuff.eu) 6
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
ANDREA ADAMI
Andrea Adami (info@folstuff.eu) 7
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
ANDREA ADAMI
Andrea Adami (info@folstuff.eu) 8
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
ANDREA ADAMI
Andrea Adami (info@folstuff.eu) 9
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
ANDREA ADAMI
Andrea Adami (info@folstuff.eu) 10
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
ANDREA ADAMI
Andrea Adami (fol@fulcro.net) 11
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
ANDREA ADAMI
Membro ATTIVO del Linux User Group di verona (http://www.lugverona.it)
Socio storico del gruppo Aereomodellistico del Garda (http://www.gardagag.it)
Nel direttivo del Verona FABLAB (http://www.veronafablab.it)
Nel tempo libero lavora in FULCRO SRL (http://www.fulcro.net)
Andrea Adami (fol@fulcro.net) 12
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
GRAZIE SPONSOR !
Andrea Adami (fol@fulcro.net) 13
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
Attributi dello Sviluppatore
R+W-
Read more
Write less
Andrea Adami (fol@fulcro.net) 14
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
SVILUPPO 3D
DATA
DRIVEN
DEVELOPMENT
Andrea Adami (fol@fulcro.net) 15
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
BACKEND VS FRONTEND
NON
OGGI
Andrea Adami (fol@fulcro.net) 16
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
DEFINIZIONI
https://it.wikipedia.org/wiki/Unit_testing
In ingegneria del software, per unit testing (testing
d'unita’ o testing unitario) si intende l'attivita’ di
testing (prova, collaudo) di singole unita’ software.
Per unita’ si intende normalmente il minimo
componente di un programma dotato di
funzionamento autonomo; a seconda del paradigma
di programmazione o linguaggio di programmazione,
questo puo’ corrispondere per esempio a una singola
funzione nella programmazione procedurale, o una
singola classe o un singolo metodo nella
programmazione a oggetti.
Andrea Adami (fol@fulcro.net) 17
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
COSTI / BENEFICI
●COSTI
–INERZIA
–CODING
●BENEFICI
–STABILITA
–TEMPO
●all’inizio ovviamente poco
●
poi si recupera
Andrea Adami (fol@fulcro.net) 18
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
AMBIENTE DI PROVA
Virtual Box per virtualizzare
https://www.virtualbox.org/wiki/Downloads
Andrea Adami (fol@fulcro.net) 19
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
AMBIENTE DI PROVA
Macchina virtuale con ubuntu 16.04.1 LTS
https://www.ubuntu.com/download/server
Andrea Adami (fol@fulcro.net) 20
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
AMBIENTE DI PROVA
Database da GITHUB Scuola247
https://github.com/Scuola247/PostgreSQL
README.md : istruzioni per
(Virtualbox/Ubuntu/PostgreSQL/Scuola247)
Andrea Adami (fol@fulcro.net) 21
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
AMBIENTE DI PROVA
Scuola247
http://www.scuola247.org
README.md : istruzioni per
(Virtualbox/Ubuntu/PostgreSQL/Scuola247)
Andrea Adami (fol@fulcro.net) 22
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
AMBIENTE DI PROVA
M I G L I A I A d i r i g h e d i d a t i
M I G L I A I A d i p h o t o p r e s e d a W i k i m e d i a C o m m o n s :
h t t p s : / / c o m m o n s . w i k i m e d i a . o r g / w i k i / M a i n _ P a g e
c o n d o c u m e n t a z i o n e d e l l a l i c e n z a p e r i l l i b e r o u t l i z z o
8 s c h e m i
6 4 t a b e l l e
6 9 v i s t e
3 2 t r i g g e r
8 7 f u n z i o n i
Andrea Adami (fol@fulcro.net) 23
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
In Postgres cos’e’ una singola unita’ software ?
Andrea Adami (fol@fulcro.net) 24
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
I domini di dati (Domain)
CREATE DOMAIN utility.week_day
AS smallint
CONSTRAINT week_day_range CHECK (VALUE >= 1 AND VALUE <= 7);
Andrea Adami (fol@fulcro.net) 25
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
I tipi di dati (Type)
CREATE TYPE public.sex AS ENUM
('M',
'F');
Andrea Adami (fol@fulcro.net) 26
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
Per chi ama la precisione:
CREATE TYPE public.sex AS ENUM
('M', 'F', '?', 'H', ‘SH',
'MC', 'FC', 'HM', 'HF',
'HT', 'I', 'A', 'X', 'O',
'MP', 'FP', 'CP');
Andrea Adami (fol@fulcro.net) 27
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
https://de.wikipedia.org/wiki/Datenstandards_zu
r_Beschreibung_des_Geschlechts
Andrea Adami (fol@fulcro.net) 28
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
Conversioni (Cast)
CREATE CAST (mime_type AS file_extension)
WITH FUNCTION public.file_extension(mime_type)
AS IMPLICIT;
CREATE CAST (file_extension AS mime_type)
WITH FUNCTION public.mime_type(file_extension)
AS IMPLICIT;
Andrea Adami (fol@fulcro.net) 29
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
Le funzioni (Function)
CREATE FUNCTION utility.day_name(_weekday
utility.week_day)
RETURNS character varying AS
$BODY$
<<me>>
DECLARE
function_name varchar = 'dayname';
BEGIN
RETURN to_char('2000-01-02'::date + _weekday, 'TMDay');
END;
$BODY$
Andrea Adami (fol@fulcro.net) 30
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
Le funzioni (Function)
CREATE OR REPLACE FUNCTION
public.italian_fiscal_code(
name character varying,
surname character varying,
sex sex,
birthday date,
country_of_birth smallint,
city_of_birth character varying)
RETURNS character varying AS
$BODY$
Andrea Adami (fol@fulcro.net) 31
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
Le viste (Views)
CREATE OR REPLACE VIEW
public.valutations_stats_classrooms_students_subjects AS
SELECT va.classroom,
va.student,
va.subject,
min(vo.thousandths) AS min,
max(vo.thousandths) AS max,
round(avg(vo.thousandths)) AS media,
round(stddev_pop(vo.thousandths)) AS dev_std
FROM valutations va
JOIN grades vo ON vo.grade = va.grade
GROUP BY va.classroom, va.student, va.subject;
Andrea Adami (fol@fulcro.net) 32
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
Le viste (Views) con window function e join multipli
CREATE VIEW public.valutations_references AS
SELECT t.classroom,
t.teacher,
t.subject,
t.on_date,
t.grade_type,
t.grade_type_description,
t.grade_type_mnemonic,
t.topic,
t.topic_description,
t.metric,
t.metric_description,
row_number() OVER (PARTITION BY t.classroom, t.teacher, t.subject, t.on_date ORDER BY t.grade_type_description,
t.topic_description, t.metric_description) AS row_number
FROM ( SELECT DISTINCT va.classroom,
va.teacher,
va.subject,
va.on_date,
va.grade_type,
tv.description AS grade_type_description,
tv.mnemonic AS grade_type_mnemonic,
va.topic,
COALESCE(a.description, ''::character varying) AS topic_description,
m.metric,
m.description AS metric_description
FROM valutations va
LEFT JOIN topics a ON a.topic = va.topic
JOIN grade_types tv ON tv.grade_type = va.grade_type
JOIN grades vo ON vo.grade = va.grade
JOIN metrics m ON m.metric = vo.metric
ORDER BY va.on_date, tv.description, (COALESCE(a.description, ''::character varying)), m.description) t;
Andrea Adami (fol@fulcro.net) 33
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
Le viste (Views) con crosstab function
CREATE OR REPLACE VIEW
unit_testing.tests_check_points_count_crosstab AS
SELECT crosstab.test,
COALESCE(crosstab."Failed", 0) AS "Failed",
COALESCE(crosstab."Passed", 0) AS "Passed",
COALESCE(crosstab."Skipped", 0) AS "Skipped",
COALESCE(crosstab."Failed", 0) +
COALESCE(crosstab."Passed", 0) + COALESCE(crosstab."Skipped",
0) AS "Total"
FROM crosstab('SELECT test, status, count FROM
unit_testing.tests_check_points_count ORDER BY 1'::text,
'SELECT enum_value FROM utility.enums_values WHERE schema_name
= ''unit_testing'' AND enum_name = ''check_point_status''
ORDER BY 1'::text) crosstab(test integer, "Failed" integer,
"Passed" integer, "Skipped" integer);
Andrea Adami (fol@fulcro.net) 34
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
Le tabelle (Tables)
●CONSTRAINT NULL (NOT NULL)
●CONSTRAINT DEFAULT
●CONSTRAINT UNIQUE
●CONSTRAINT CHECK
●CONSTRAINT REFERENCES
●EXCLUDE
Andrea Adami (fol@fulcro.net) 35
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
CREATE TABLE public.school_years
(
school_year bigint NOT NULL DEFAULT nextval('pk_seq'::regclass),
school bigint NOT NULL,
description character varying(160) NOT NULL,
duration daterange,
lessons_duration daterange,
CONSTRAINT school_years_pk PRIMARY KEY (school_year),
CONSTRAINT school_years_fk_school FOREIGN KEY (school)
REFERENCES public.schools (school) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT school_years_ex_duration EXCLUDE
USING gist (school WITH =, duration WITH &&), -- in the same school we cannot have
duration overlap
CONSTRAINT school_years_uq_description UNIQUE (school, description), -- description
must be unique
CONSTRAINT school_years_ck_duration CHECK (duration @> lessons_duration)
)
UNITÀ SOFTWARE
Andrea Adami (fol@fulcro.net) 36
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNITÀ SOFTWARE
I trigger (Always Function)
IF new.behavior IS NOT NULL THEN
IF (TG_OP = 'UPDATE') THEN
-- check that subject's school as equal as school
PERFORM 1 FROM subjects WHERE subject = new.behavior
AND school = new.school;
IF NOT FOUND THEN
RAISE EXCEPTION USING ......
END IF;
ELSE
--
-- cannot set the behavior because it needs school. You must:
-- 1) insert school
-- 2) insert subject
-- 3) update school with the subject
--
RAISE EXCEPTION USING ...
END IF;
END IF;
RETURN NEW;
Andrea Adami (fol@fulcro.net) 37
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
COSA TESTARE ?
●Attenzione a non testare PostgreSQL
●Testate le cose piu’ difficili
–TRIGGER
–FUNCTION
–FOREIGN KEY
●Poi se avete tempo e voglia
–Domains
–Types
Andrea Adami (fol@fulcro.net) 38
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
DIFFERENZE CON ALTRI
LINGUAGGI
POCHE
TEMPO DEDICATO PROPORZIONALMENTE UGUALE
TENDENTE A DIMINUIRE PER
1 GRANDE VANTAGGIO
Andrea Adami (fol@fulcro.net) 39
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
1 GRANDE VANTAGGIO
NON ABBIAMO ‘QUASI’ BISOGNO DI ...
MOCK OBJECT
Andrea Adami (fol@fulcro.net) 40
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
MOCK OBJECT
https://en.wikipedia.org/wiki/Mock_object
In object-oriented programming, mock objects are
simulated objects that mimic the behavior of real
objects in controlled ways. A programmer typically
creates a mock object to test the behavior of some
other object, in much the same way that a car
designer uses a crash test dummy to simulate the
dynamic behavior of a human in vehicle impacts.
Andrea Adami (fol@fulcro.net) 41
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
1 GRANDE VANTAGGIO
ABBIAMO LE
TRANSAZIONI
Andrea Adami (fol@fulcro.net) 42
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
1 GRANDE VANTAGGIO
BEGIN
test1
test2
tes3
testn
RAISE EXCEPTION SQLSTATE 'ZZZZZ';
EXCEPTION WHEN SQLSTATE 'ZZZZZ'
END;
Andrea Adami (fol@fulcro.net) 43
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
TEST FRAMEWORKS
https://wiki.postgresql.org/wiki/Test_Frameworks
Epic
pgTap
PGUnit
Simple pgunit
Andrea Adami (fol@fulcro.net) 44
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
PLPGUNIT
Un grazie a Binod Nirvan:
https://np.linkedin.com/in/binodnirvan
https://github.com/mixerp/plpgunit
Andrea Adami (fol@fulcro.net) 45
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
PLPGUNIT
Problemi:
●Il comando di lancio dei test non usa le
transazioni
●Si puo’ racchiudere il comando in una transazione
ma anche i dati risultanti dai test vengono
ripristinati (quindi persi)
●Poco dettaglio in caso di errore non previsto
●Poco dettaglio del singolo test
Andrea Adami (fol@fulcro.net) 46
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
●Ogni test fatto e’ un checkpoint
●I checkpoint sono raggruppati in function di unit
test
●Le unit test function hanno una caratteristica
fondamentale:
ritornano: array di unit_test_result
●Il framework automaticamente gestisce il richiamo
di tutte le unit_test functions in un unica
transazione che viene SEMPRE abortita
Andrea Adami (fol@fulcro.net) 47
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
●Si possono dichiarare dipendenze fra unit_tests
usando la tabella dependencies
●Il framework poi si occupa di richiamare
nell’ordine dichiarato le singole unit test
●Se una unit test fallisce il framework
automaticamente salta tutte le unit test che
dipendono da quella fallita
●Il framework controlla eventuali riferimenti
circolari infiniti
Andrea Adami (fol@fulcro.net) 48
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
Si possono costituire unit test set per limitare il
richiamo di unit test function (comodo durante lo
sviluppo di una funzione per limitare i messaggi
informativi)
Andrea Adami (fol@fulcro.net) 49
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
SCHEMAS
–assert
–diagnostic
–unit_testing
–unit_tests
–utility
Andrea Adami (fol@fulcro.net) 50
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
La magia e’:
SELECT unit_testing.run()
Andrea Adami (fol@fulcro.net) 51
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
Sintassi completa:
unit_testing.run(
IN _check_functions boolean DEFAULT FALSE,
IN _check_queries boolean DEFAULT FALSE,
IN _check_unit_tests boolean DEFAULT TRUE,
IN _unit_test_set bigint DEFAULT NULL::bigint,
IN _verbosity text DEFAULT 'notice'::text,
IN _note text DEFAULT NULL::text,
OUT _current_test bigint)
Andrea Adami (fol@fulcro.net) 52
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
parametro:
check_functions = TRUE / FALSE
equivale all’ esecuzione o meno di:
SELECT * FROM
diagnostic.functions_check;
Andrea Adami (fol@fulcro.net) 53
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
https://github.com/okbob/plpgsql_check
Andrea Adami (fol@fulcro.net) 54
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
parametro:
check_queries = TRUE / FALSE
equivale all’ esecuzione o meno di:
SELECT * FROM
diagnostic.diagnostic.views_working;
Andrea Adami (fol@fulcro.net) 55
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
parametro:
check_unit_tests = TRUE / FALSE
se FALSE non esegue alcuna test, se TRUE si’
Andrea Adami (fol@fulcro.net) 56
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
parametro:
unit_test_set = <unit test set>
limita i test eseguit a quelli elencati nella
unit_test_set indicata e relative dipendenze
Andrea Adami (fol@fulcro.net) 57
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
parametro:
verbosity = <verbosity level>
equivale all’ esecuzione di:
SET CLIENT_MIN_MESSAGES TO <verbosity level>
Controls which message levels are sent to the client. Valid
values are DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, LOG,
NOTICE, WARNING, ERROR, FATAL, and PANIC. Each level
includes all the levels that follow it. The later the level,
the fewer messages are sent. The default is NOTICE. Note
that LOG has a different rank here than in log_min_messages.
Andrea Adami (fol@fulcro.net) 58
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
Il problema del sovraffollamento diagnostico
Andrea Adami (fol@fulcro.net) 59
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
parametro:
note = <note text>
Riporta il valore del parametro nella colonna
‘note’ della tabella unit_tests dove vengono
memorizzati tutti i test eseguit
Andrea Adami (fol@fulcro.net) 60
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
Risultato:
NOTIFICA: --------------------------------
NOTIFICA: ---------- STATISTICS ----------
NOTIFICA: --------------------------------
NOTIFICA: Test id.........................: 773
NOTIFICA: Test started on.................: 2016-12-13 11:45:03.381946
NOTIFICA: Test ended on...................: 2016-12-13 11:45:03.409572
NOTIFICA: Test runtime was................: 00:00:00.027626
NOTIFICA: total functions............: 3
NOTIFICA: functions passed...........: 0
NOTIFICA: functions failed...........: 1
NOTIFICA: functions skipped..........: 2
NOTIFICA: total check points....: 4
NOTIFICA: check points passed...: 2
NOTIFICA: check points failed...: 2
Andrea Adami (fol@fulcro.net) 61
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
UNIT_TESTING
(il framework)
DEMO
Andrea Adami (fol@fulcro.net) 62
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
CONTINOUS INTEGRATION
https://en.wikipedia.org/wiki/Continuous_integration
In software engineering, continuous integration (CI)
is the practice of merging all developer working
copies to a shared mainline several times a day.
Grady Booch first named and proposed CI in his
1991 method, although he did not advocate
integrating several times a day. Extreme
programming (XP) adopted the concept of CI and
did advocate integrating more than once per day -
perhaps as many as tens of times per day.
Andrea Adami (fol@fulcro.net) 63
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
CONTINOUS INTEGRATION
SELECT unit_testing.set_continuous_integration(TRUE);
Andrea Adami (fol@fulcro.net) 64
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
CONTINOUS INTEGRATION
CREATE EVENT TRIGGER
continuous_integration
ON ddl_command_end
WHEN TAG IN ('ALTER FUNCTION')
EXECUTE PROCEDURE
unit_testing.tr_continuous_integration();
Andrea Adami (fol@fulcro.net) 65
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
CONTENUTI
Tutto quanto avete visto oggi sara’ su:
Slide:
http://www.slideshare.net/andreaadami
Codice (comprese le istruzioni per riprodurre tutto
l’ambiente oggi usato):
https://github.com/Scuola247/PostgreSQL
Macchine Virtuali già pronte su:
https://sourceforge.net/projects/scuola247/files/?s
ource=directory
Andrea Adami (fol@fulcro.net) 66
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
Q & A
Domande e ...
si spera ......
Risposte
Andrea Adami (fol@fulcro.net) 67
www.folstuff.eu
Mercoledì 3 Maggio 2017
www.jugpadova.it
GRAZIE PER L’ATTENZIONE
Quest’opera e’ da attribuire a:
Andrea Adami (http://www.folstuff.eu)
Eccetto quando diversamente indicato quest’opera e’
licenziata con la licenza:
Creative Commons Attribuzione - Condividi allo stesso
modo 4.0 Internazionale
http://creativecommons.org/licenses/by-sa/4.0 (testo compl
eto della licenza)

More Related Content

Featured

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Featured (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Jugpd meeting#76 Unit Testing with PostgreSQL

  • 1. Andrea Adami (fol@fulcro.net) 1 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it JUG Meeting#76: UNIT TESTING Con PostgreSQL
  • 2. Andrea Adami (fol@fulcro.net) 2 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it JUG Meeting#76: BUONGIORNO E BENVENUTI
  • 3. Andrea Adami (fol@fulcro.net) 3 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it JUG Meeting#76: ANDREA ADAMI
  • 4. Andrea Adami (info@folstuff.eu) 4 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it ANDREA ADAMI mi potete contattare tramite: e-mail: info@folstuff.eu blog: http://www.folstuff.eu github: https://github.com/folstuff linkedin: https://www.linkedin.com/in/andreaadami/it instagram: https://www.instagram.com/folstuff facebook: https://www.facebook.com/folstuff google+: https://plus.google.com/+AndreaAdamiProfile twitter @folstuff : https://twitter.com/folstuff slideshare: https://www.slideshare.net/andreaadami
  • 5. Andrea Adami (info@folstuff.eu) 5 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it WHO AM I Andrea Adami si definisce un "Architetto di Soluzioni" Si innamora di un Commodore 64 trovato sotto l'albero di Natale nel 1980 e vive tutta l'evoluzione dell'informatica dai grossi calcolatori per banche e assicurazioni fino a internet a alle reti di personal computer passando dai microcontrollori quando IoT era un'acronimo a cui non si sapeva quale parola agganciare. La cosa fuori dal comune e che dopo oltre 30 anni è ancora sinceramente appasionato dalla programmazione e gli piace trasmettere questa sua passione. Nel tempo libero costruisce e fa' volare aeromodelli. Tiene un blog all'indirizzo: http:www.folstuff.eu
  • 6. Andrea Adami (info@folstuff.eu) 6 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it ANDREA ADAMI
  • 7. Andrea Adami (info@folstuff.eu) 7 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it ANDREA ADAMI
  • 8. Andrea Adami (info@folstuff.eu) 8 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it ANDREA ADAMI
  • 9. Andrea Adami (info@folstuff.eu) 9 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it ANDREA ADAMI
  • 10. Andrea Adami (info@folstuff.eu) 10 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it ANDREA ADAMI
  • 11. Andrea Adami (fol@fulcro.net) 11 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it ANDREA ADAMI Membro ATTIVO del Linux User Group di verona (http://www.lugverona.it) Socio storico del gruppo Aereomodellistico del Garda (http://www.gardagag.it) Nel direttivo del Verona FABLAB (http://www.veronafablab.it) Nel tempo libero lavora in FULCRO SRL (http://www.fulcro.net)
  • 12. Andrea Adami (fol@fulcro.net) 12 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it GRAZIE SPONSOR !
  • 13. Andrea Adami (fol@fulcro.net) 13 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it Attributi dello Sviluppatore R+W- Read more Write less
  • 14. Andrea Adami (fol@fulcro.net) 14 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it SVILUPPO 3D DATA DRIVEN DEVELOPMENT
  • 15. Andrea Adami (fol@fulcro.net) 15 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it BACKEND VS FRONTEND NON OGGI
  • 16. Andrea Adami (fol@fulcro.net) 16 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it DEFINIZIONI https://it.wikipedia.org/wiki/Unit_testing In ingegneria del software, per unit testing (testing d'unita’ o testing unitario) si intende l'attivita’ di testing (prova, collaudo) di singole unita’ software. Per unita’ si intende normalmente il minimo componente di un programma dotato di funzionamento autonomo; a seconda del paradigma di programmazione o linguaggio di programmazione, questo puo’ corrispondere per esempio a una singola funzione nella programmazione procedurale, o una singola classe o un singolo metodo nella programmazione a oggetti.
  • 17. Andrea Adami (fol@fulcro.net) 17 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it COSTI / BENEFICI ●COSTI –INERZIA –CODING ●BENEFICI –STABILITA –TEMPO ●all’inizio ovviamente poco ● poi si recupera
  • 18. Andrea Adami (fol@fulcro.net) 18 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it AMBIENTE DI PROVA Virtual Box per virtualizzare https://www.virtualbox.org/wiki/Downloads
  • 19. Andrea Adami (fol@fulcro.net) 19 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it AMBIENTE DI PROVA Macchina virtuale con ubuntu 16.04.1 LTS https://www.ubuntu.com/download/server
  • 20. Andrea Adami (fol@fulcro.net) 20 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it AMBIENTE DI PROVA Database da GITHUB Scuola247 https://github.com/Scuola247/PostgreSQL README.md : istruzioni per (Virtualbox/Ubuntu/PostgreSQL/Scuola247)
  • 21. Andrea Adami (fol@fulcro.net) 21 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it AMBIENTE DI PROVA Scuola247 http://www.scuola247.org README.md : istruzioni per (Virtualbox/Ubuntu/PostgreSQL/Scuola247)
  • 22. Andrea Adami (fol@fulcro.net) 22 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it AMBIENTE DI PROVA M I G L I A I A d i r i g h e d i d a t i M I G L I A I A d i p h o t o p r e s e d a W i k i m e d i a C o m m o n s : h t t p s : / / c o m m o n s . w i k i m e d i a . o r g / w i k i / M a i n _ P a g e c o n d o c u m e n t a z i o n e d e l l a l i c e n z a p e r i l l i b e r o u t l i z z o 8 s c h e m i 6 4 t a b e l l e 6 9 v i s t e 3 2 t r i g g e r 8 7 f u n z i o n i
  • 23. Andrea Adami (fol@fulcro.net) 23 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE In Postgres cos’e’ una singola unita’ software ?
  • 24. Andrea Adami (fol@fulcro.net) 24 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE I domini di dati (Domain) CREATE DOMAIN utility.week_day AS smallint CONSTRAINT week_day_range CHECK (VALUE >= 1 AND VALUE <= 7);
  • 25. Andrea Adami (fol@fulcro.net) 25 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE I tipi di dati (Type) CREATE TYPE public.sex AS ENUM ('M', 'F');
  • 26. Andrea Adami (fol@fulcro.net) 26 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE Per chi ama la precisione: CREATE TYPE public.sex AS ENUM ('M', 'F', '?', 'H', ‘SH', 'MC', 'FC', 'HM', 'HF', 'HT', 'I', 'A', 'X', 'O', 'MP', 'FP', 'CP');
  • 27. Andrea Adami (fol@fulcro.net) 27 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE https://de.wikipedia.org/wiki/Datenstandards_zu r_Beschreibung_des_Geschlechts
  • 28. Andrea Adami (fol@fulcro.net) 28 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE Conversioni (Cast) CREATE CAST (mime_type AS file_extension) WITH FUNCTION public.file_extension(mime_type) AS IMPLICIT; CREATE CAST (file_extension AS mime_type) WITH FUNCTION public.mime_type(file_extension) AS IMPLICIT;
  • 29. Andrea Adami (fol@fulcro.net) 29 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE Le funzioni (Function) CREATE FUNCTION utility.day_name(_weekday utility.week_day) RETURNS character varying AS $BODY$ <<me>> DECLARE function_name varchar = 'dayname'; BEGIN RETURN to_char('2000-01-02'::date + _weekday, 'TMDay'); END; $BODY$
  • 30. Andrea Adami (fol@fulcro.net) 30 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE Le funzioni (Function) CREATE OR REPLACE FUNCTION public.italian_fiscal_code( name character varying, surname character varying, sex sex, birthday date, country_of_birth smallint, city_of_birth character varying) RETURNS character varying AS $BODY$
  • 31. Andrea Adami (fol@fulcro.net) 31 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE Le viste (Views) CREATE OR REPLACE VIEW public.valutations_stats_classrooms_students_subjects AS SELECT va.classroom, va.student, va.subject, min(vo.thousandths) AS min, max(vo.thousandths) AS max, round(avg(vo.thousandths)) AS media, round(stddev_pop(vo.thousandths)) AS dev_std FROM valutations va JOIN grades vo ON vo.grade = va.grade GROUP BY va.classroom, va.student, va.subject;
  • 32. Andrea Adami (fol@fulcro.net) 32 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE Le viste (Views) con window function e join multipli CREATE VIEW public.valutations_references AS SELECT t.classroom, t.teacher, t.subject, t.on_date, t.grade_type, t.grade_type_description, t.grade_type_mnemonic, t.topic, t.topic_description, t.metric, t.metric_description, row_number() OVER (PARTITION BY t.classroom, t.teacher, t.subject, t.on_date ORDER BY t.grade_type_description, t.topic_description, t.metric_description) AS row_number FROM ( SELECT DISTINCT va.classroom, va.teacher, va.subject, va.on_date, va.grade_type, tv.description AS grade_type_description, tv.mnemonic AS grade_type_mnemonic, va.topic, COALESCE(a.description, ''::character varying) AS topic_description, m.metric, m.description AS metric_description FROM valutations va LEFT JOIN topics a ON a.topic = va.topic JOIN grade_types tv ON tv.grade_type = va.grade_type JOIN grades vo ON vo.grade = va.grade JOIN metrics m ON m.metric = vo.metric ORDER BY va.on_date, tv.description, (COALESCE(a.description, ''::character varying)), m.description) t;
  • 33. Andrea Adami (fol@fulcro.net) 33 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE Le viste (Views) con crosstab function CREATE OR REPLACE VIEW unit_testing.tests_check_points_count_crosstab AS SELECT crosstab.test, COALESCE(crosstab."Failed", 0) AS "Failed", COALESCE(crosstab."Passed", 0) AS "Passed", COALESCE(crosstab."Skipped", 0) AS "Skipped", COALESCE(crosstab."Failed", 0) + COALESCE(crosstab."Passed", 0) + COALESCE(crosstab."Skipped", 0) AS "Total" FROM crosstab('SELECT test, status, count FROM unit_testing.tests_check_points_count ORDER BY 1'::text, 'SELECT enum_value FROM utility.enums_values WHERE schema_name = ''unit_testing'' AND enum_name = ''check_point_status'' ORDER BY 1'::text) crosstab(test integer, "Failed" integer, "Passed" integer, "Skipped" integer);
  • 34. Andrea Adami (fol@fulcro.net) 34 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE Le tabelle (Tables) ●CONSTRAINT NULL (NOT NULL) ●CONSTRAINT DEFAULT ●CONSTRAINT UNIQUE ●CONSTRAINT CHECK ●CONSTRAINT REFERENCES ●EXCLUDE
  • 35. Andrea Adami (fol@fulcro.net) 35 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it CREATE TABLE public.school_years ( school_year bigint NOT NULL DEFAULT nextval('pk_seq'::regclass), school bigint NOT NULL, description character varying(160) NOT NULL, duration daterange, lessons_duration daterange, CONSTRAINT school_years_pk PRIMARY KEY (school_year), CONSTRAINT school_years_fk_school FOREIGN KEY (school) REFERENCES public.schools (school) MATCH SIMPLE ON UPDATE CASCADE ON DELETE RESTRICT, CONSTRAINT school_years_ex_duration EXCLUDE USING gist (school WITH =, duration WITH &&), -- in the same school we cannot have duration overlap CONSTRAINT school_years_uq_description UNIQUE (school, description), -- description must be unique CONSTRAINT school_years_ck_duration CHECK (duration @> lessons_duration) ) UNITÀ SOFTWARE
  • 36. Andrea Adami (fol@fulcro.net) 36 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNITÀ SOFTWARE I trigger (Always Function) IF new.behavior IS NOT NULL THEN IF (TG_OP = 'UPDATE') THEN -- check that subject's school as equal as school PERFORM 1 FROM subjects WHERE subject = new.behavior AND school = new.school; IF NOT FOUND THEN RAISE EXCEPTION USING ...... END IF; ELSE -- -- cannot set the behavior because it needs school. You must: -- 1) insert school -- 2) insert subject -- 3) update school with the subject -- RAISE EXCEPTION USING ... END IF; END IF; RETURN NEW;
  • 37. Andrea Adami (fol@fulcro.net) 37 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it COSA TESTARE ? ●Attenzione a non testare PostgreSQL ●Testate le cose piu’ difficili –TRIGGER –FUNCTION –FOREIGN KEY ●Poi se avete tempo e voglia –Domains –Types
  • 38. Andrea Adami (fol@fulcro.net) 38 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it DIFFERENZE CON ALTRI LINGUAGGI POCHE TEMPO DEDICATO PROPORZIONALMENTE UGUALE TENDENTE A DIMINUIRE PER 1 GRANDE VANTAGGIO
  • 39. Andrea Adami (fol@fulcro.net) 39 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it 1 GRANDE VANTAGGIO NON ABBIAMO ‘QUASI’ BISOGNO DI ... MOCK OBJECT
  • 40. Andrea Adami (fol@fulcro.net) 40 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it MOCK OBJECT https://en.wikipedia.org/wiki/Mock_object In object-oriented programming, mock objects are simulated objects that mimic the behavior of real objects in controlled ways. A programmer typically creates a mock object to test the behavior of some other object, in much the same way that a car designer uses a crash test dummy to simulate the dynamic behavior of a human in vehicle impacts.
  • 41. Andrea Adami (fol@fulcro.net) 41 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it 1 GRANDE VANTAGGIO ABBIAMO LE TRANSAZIONI
  • 42. Andrea Adami (fol@fulcro.net) 42 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it 1 GRANDE VANTAGGIO BEGIN test1 test2 tes3 testn RAISE EXCEPTION SQLSTATE 'ZZZZZ'; EXCEPTION WHEN SQLSTATE 'ZZZZZ' END;
  • 43. Andrea Adami (fol@fulcro.net) 43 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it TEST FRAMEWORKS https://wiki.postgresql.org/wiki/Test_Frameworks Epic pgTap PGUnit Simple pgunit
  • 44. Andrea Adami (fol@fulcro.net) 44 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it PLPGUNIT Un grazie a Binod Nirvan: https://np.linkedin.com/in/binodnirvan https://github.com/mixerp/plpgunit
  • 45. Andrea Adami (fol@fulcro.net) 45 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it PLPGUNIT Problemi: ●Il comando di lancio dei test non usa le transazioni ●Si puo’ racchiudere il comando in una transazione ma anche i dati risultanti dai test vengono ripristinati (quindi persi) ●Poco dettaglio in caso di errore non previsto ●Poco dettaglio del singolo test
  • 46. Andrea Adami (fol@fulcro.net) 46 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) ●Ogni test fatto e’ un checkpoint ●I checkpoint sono raggruppati in function di unit test ●Le unit test function hanno una caratteristica fondamentale: ritornano: array di unit_test_result ●Il framework automaticamente gestisce il richiamo di tutte le unit_test functions in un unica transazione che viene SEMPRE abortita
  • 47. Andrea Adami (fol@fulcro.net) 47 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) ●Si possono dichiarare dipendenze fra unit_tests usando la tabella dependencies ●Il framework poi si occupa di richiamare nell’ordine dichiarato le singole unit test ●Se una unit test fallisce il framework automaticamente salta tutte le unit test che dipendono da quella fallita ●Il framework controlla eventuali riferimenti circolari infiniti
  • 48. Andrea Adami (fol@fulcro.net) 48 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) Si possono costituire unit test set per limitare il richiamo di unit test function (comodo durante lo sviluppo di una funzione per limitare i messaggi informativi)
  • 49. Andrea Adami (fol@fulcro.net) 49 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) SCHEMAS –assert –diagnostic –unit_testing –unit_tests –utility
  • 50. Andrea Adami (fol@fulcro.net) 50 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) La magia e’: SELECT unit_testing.run()
  • 51. Andrea Adami (fol@fulcro.net) 51 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) Sintassi completa: unit_testing.run( IN _check_functions boolean DEFAULT FALSE, IN _check_queries boolean DEFAULT FALSE, IN _check_unit_tests boolean DEFAULT TRUE, IN _unit_test_set bigint DEFAULT NULL::bigint, IN _verbosity text DEFAULT 'notice'::text, IN _note text DEFAULT NULL::text, OUT _current_test bigint)
  • 52. Andrea Adami (fol@fulcro.net) 52 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) parametro: check_functions = TRUE / FALSE equivale all’ esecuzione o meno di: SELECT * FROM diagnostic.functions_check;
  • 53. Andrea Adami (fol@fulcro.net) 53 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) https://github.com/okbob/plpgsql_check
  • 54. Andrea Adami (fol@fulcro.net) 54 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) parametro: check_queries = TRUE / FALSE equivale all’ esecuzione o meno di: SELECT * FROM diagnostic.diagnostic.views_working;
  • 55. Andrea Adami (fol@fulcro.net) 55 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) parametro: check_unit_tests = TRUE / FALSE se FALSE non esegue alcuna test, se TRUE si’
  • 56. Andrea Adami (fol@fulcro.net) 56 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) parametro: unit_test_set = <unit test set> limita i test eseguit a quelli elencati nella unit_test_set indicata e relative dipendenze
  • 57. Andrea Adami (fol@fulcro.net) 57 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) parametro: verbosity = <verbosity level> equivale all’ esecuzione di: SET CLIENT_MIN_MESSAGES TO <verbosity level> Controls which message levels are sent to the client. Valid values are DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, LOG, NOTICE, WARNING, ERROR, FATAL, and PANIC. Each level includes all the levels that follow it. The later the level, the fewer messages are sent. The default is NOTICE. Note that LOG has a different rank here than in log_min_messages.
  • 58. Andrea Adami (fol@fulcro.net) 58 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) Il problema del sovraffollamento diagnostico
  • 59. Andrea Adami (fol@fulcro.net) 59 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) parametro: note = <note text> Riporta il valore del parametro nella colonna ‘note’ della tabella unit_tests dove vengono memorizzati tutti i test eseguit
  • 60. Andrea Adami (fol@fulcro.net) 60 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) Risultato: NOTIFICA: -------------------------------- NOTIFICA: ---------- STATISTICS ---------- NOTIFICA: -------------------------------- NOTIFICA: Test id.........................: 773 NOTIFICA: Test started on.................: 2016-12-13 11:45:03.381946 NOTIFICA: Test ended on...................: 2016-12-13 11:45:03.409572 NOTIFICA: Test runtime was................: 00:00:00.027626 NOTIFICA: total functions............: 3 NOTIFICA: functions passed...........: 0 NOTIFICA: functions failed...........: 1 NOTIFICA: functions skipped..........: 2 NOTIFICA: total check points....: 4 NOTIFICA: check points passed...: 2 NOTIFICA: check points failed...: 2
  • 61. Andrea Adami (fol@fulcro.net) 61 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it UNIT_TESTING (il framework) DEMO
  • 62. Andrea Adami (fol@fulcro.net) 62 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it CONTINOUS INTEGRATION https://en.wikipedia.org/wiki/Continuous_integration In software engineering, continuous integration (CI) is the practice of merging all developer working copies to a shared mainline several times a day. Grady Booch first named and proposed CI in his 1991 method, although he did not advocate integrating several times a day. Extreme programming (XP) adopted the concept of CI and did advocate integrating more than once per day - perhaps as many as tens of times per day.
  • 63. Andrea Adami (fol@fulcro.net) 63 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it CONTINOUS INTEGRATION SELECT unit_testing.set_continuous_integration(TRUE);
  • 64. Andrea Adami (fol@fulcro.net) 64 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it CONTINOUS INTEGRATION CREATE EVENT TRIGGER continuous_integration ON ddl_command_end WHEN TAG IN ('ALTER FUNCTION') EXECUTE PROCEDURE unit_testing.tr_continuous_integration();
  • 65. Andrea Adami (fol@fulcro.net) 65 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it CONTENUTI Tutto quanto avete visto oggi sara’ su: Slide: http://www.slideshare.net/andreaadami Codice (comprese le istruzioni per riprodurre tutto l’ambiente oggi usato): https://github.com/Scuola247/PostgreSQL Macchine Virtuali già pronte su: https://sourceforge.net/projects/scuola247/files/?s ource=directory
  • 66. Andrea Adami (fol@fulcro.net) 66 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it Q & A Domande e ... si spera ...... Risposte
  • 67. Andrea Adami (fol@fulcro.net) 67 www.folstuff.eu Mercoledì 3 Maggio 2017 www.jugpadova.it GRAZIE PER L’ATTENZIONE Quest’opera e’ da attribuire a: Andrea Adami (http://www.folstuff.eu) Eccetto quando diversamente indicato quest’opera e’ licenziata con la licenza: Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale http://creativecommons.org/licenses/by-sa/4.0 (testo compl eto della licenza)