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
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)
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)