{"id":37666,"date":"2019-10-31T22:18:55","date_gmt":"2019-10-31T19:18:55","guid":{"rendered":"https:\/\/prohoster.info\/blog\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\/"},"modified":"2019-10-31T22:18:55","modified_gmt":"2019-10-31T19:18:55","slug":"unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","title":{"rendered":"Unit test nei DB \u2014 come lo facciamo da Sportmaster, parte seconda","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>La prima parte \u00e8 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">qui<\/a><\/noindex>.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\"><img decoding=\"async\" alt=\"Unit test nei DB \u2014 come lo facciamo da Sportmaster, parte seconda\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Immagina la situazione. Hai il compito di sviluppare una nuova funzionalit\u00e0. Hai a disposizione il lavoro dei tuoi predecessori. Se assumiamo che tu non abbia alcun obbligo morale, come ti comporteresti?<\/p>\n<p>Nella maggior parte dei casi, tutto il lavoro precedente viene dimenticato e si inizia da capo. A nessuno piace lavorare su codice di qualcun altro e, se c'\u00e8 tempo, perch\u00e9 non dedicarsi a creare un sistema tutto tuo? Questo \u00e8 un approccio tipico e, in gran parte, corretto. Ma nel nostro progetto non abbiamo agito in questo modo. Abbiamo basato il nostro futuro sistema di testing automatico sui lavori riguardanti i test unitari su utPLSQL dei predecessori, e poi abbiamo iniziato a lavorare in diverse direzioni parallele.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>Ripristino dei vecchi test unitari.<\/b> Per ripristino si intende l'adattamento dei test allo stato attuale del sistema di fidelizzazione e l'adattamento dei test agli standard di utPLSQL. <\/li>\n<li><b>Risoluzione del problema di comprensione su quali metodi e processi siano coperti dai nostri test automatici. <\/b>\u00c8 necessario tenere a mente queste informazioni o trarre conclusioni direttamente dal codice dei test automatici. Pertanto, abbiamo deciso di creare un catalogo. A ciascun test automatico abbiamo assegnato un codice mnemonico unico, redatto una descrizione e registrato le impostazioni (come, ad esempio, in quali condizioni deve essere eseguito o cosa deve succedere se il test fallisce). In sostanza, abbiamo compilato i metadati sui test automatici e inserito questi metadati nelle tabelle standard dello schema utPLSQL.<\/li>\n<li><b>Definizione della strategia di estensione, cio\u00e8 la scelta delle funzionalit\u00e0 da controllare con i test automatici.<\/b> Abbiamo deciso di concentrarci su tre aspetti: nuove modifiche al sistema, incidenti in produzione e processi chiave del sistema. In questo modo, ci sviluppiamo parallelamente al rilascio, garantendo una qualit\u00e0 superiore e, nel contempo, ampliando l'ambito del testing di regressione e assicurando l'affidabilit\u00e0 del sistema nei punti critici. Il primo di questi colli di bottiglia \u00e8 stato il processo di distribuzione degli sconti e dei bonus sullo scontrino.<\/li>\n<li><b>Naturalmente, ci siamo dedicati allo sviluppo di nuovi test automatici. <\/b>Una delle prime attivit\u00e0 di rilascio \u00e8 stata la valutazione delle performance dei campioni predefiniti del sistema di fidelizzazione. Nel nostro progetto \u00e8 presente un blocco di query SQL fisse che selezionano i clienti in base a determinate condizioni. Ad esempio, ottenere un elenco di tutti i clienti la cui ultima acquisto \u00e8 avvenuto in una specifica citt\u00e0, o un elenco di clienti la cui media di spesa supera un valore predeterminato. Scrivendo test automatizzati, abbiamo verificato i campioni predefiniti, registrato i parametri di performance di riferimento e inoltre abbiamo introdotto il test di carico.<\/li>\n<li><b>Lavorare con i test automatizzati deve essere comodo<\/b>. Le due azioni pi\u00f9 comuni sono: l'esecuzione dei test automatizzati e la creazione di dati di test. Cos\u00ec nel nostro sistema sono stati introdotti due moduli ausiliari: il modulo di esecuzione e il modulo di generazione dati.\n<p>Il modulo di avvio \u00e8 presentato come una singola procedura universale con un parametro di testo in ingresso. Come parametro, \u00e8 possibile passare il mnemonic code del test automatico, il nome del pacchetto, il nome del test, la configurazione del test automatico o una parola chiave riservata. La procedura seleziona e avvia tutti i test automatici che soddisfano i criteri.<\/p>\n<p>Il modulo di generazione dei dati \u00e8 presentato come un pacchetto, in cui per ogni oggetto del sistema in fase di test (tabella nel database), \u00e8 stata creata una procedura speciale che inserisce i dati al suo interno. In questa procedura, i valori predefiniti sono stati massimamente riempiti, il che garantisce la creazione di oggetti con un semplice clic. Inoltre, sono stati creati modelli per i dati generati, come ad esempio la creazione di un cliente di una certa et\u00e0 con un numero di telefono di prova e un acquisto effettuato.<\/li>\n<li><b>I test automatici devono essere avviati e funzionare entro un tempo accettabile per il vostro sistema. <\/b>Per questo motivo \u00e8 stato organizzato un avvio notturno quotidiano, i cui risultati vengono raccolti in un rapporto e inviati a tutto il team di sviluppo via email aziendale. Dopo il ripristino dei vecchi test automatici e la creazione di nuovi, il tempo totale di esecuzione \u00e8 stato di 30 minuti. Tale produttivit\u00e0 ha soddisfatto tutti, poich\u00e9 l'esecuzione avveniva al di fuori dell'orario lavorativo.\n<p>Tuttavia, \u00e8 stato necessario lavorare per ottimizzare la velocit\u00e0 operativa. L'aggiornamento del sistema di fidelizzazione in produzione avviene di notte. Durante uno dei rilasci, sono stati effettuati cambiamenti urgenti durante la notte. Mezz'ora di attesa per i risultati dei test automatici alle tre del mattino non ha reso felice il responsabile del rilascio (un affettuoso saluto ad Alexey Vasyukov!), e la mattina seguente sono stati spesi molti complimenti verso il nostro sistema. Tuttavia, alla fine \u00e8 stato stabilito un standard di 5 minuti per il lavoro.<\/p>\n<p>Per migliorare le prestazioni, abbiamo utilizzato due metodi: i test automatici vengono eseguiti su tre flussi paralleli, grazie all'architettura del nostro sistema di fidelizzazione. Abbiamo anche abbandonato l'approccio in cui i test automatici non generano i dati di test autonomamente, ma cercano qualcosa di pertinente nel sistema. Dopo le modifiche, il tempo totale di esecuzione \u00e8 stato ridotto a 3-4 minuti.<\/li>\n<li><b>\u00c8 necessario poter distribuire il progetto con i test automatici su diversi ambienti.<\/b> All'inizio abbiamo provato a scrivere i nostri script di installazione, ma ci siamo resi conto che l'installazione automatizzata scritta in casa era un completo disastro; quindi ci siamo orientati verso soluzioni industriali. Poich\u00e9 nel progetto ci sono molte righe di codice (soprattutto memorizziamo il codice dei test automatici) e pochi dati (i dati principali sono metadati sui test automatici), \u00e8 stato abbastanza semplice implementare Liquibase nel progetto.\n<p>Liquibase \u00e8 una libreria open source indipendente dal database, utilizzata per monitorare, gestire e applicare le modifiche della schema del database. Pu\u00f2 essere gestita tramite linea di comando o framework come Apache Maven. Il funzionamento di Liquibase \u00e8 abbastanza semplice. Abbiamo un progetto organizzato in un certo modo, composto da modifiche o script da applicare al server target, e file di controllo che definiscono in quale ordine e con quali parametri applicare queste modifiche. <\/p>\n<p>A livello di DBMS, viene creata una tabella speciale in cui Liquibase memorizza il log delle applicazioni. Ogni modifica ha un hash calcolato che viene confrontato ogni volta tra il progetto e lo stato nel database. Grazie a Liquibase, possiamo facilmente applicare le modifiche del nostro sistema su qualsiasi ambiente. I test automatici vengono ora eseguiti sugli ambienti di test e di produzione, cos\u00ec come su container (ambienti personali degli sviluppatori).<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Unit test nei DB \u2014 come lo facciamo da Sportmaster, parte seconda\" src=\"\/wp-content\/uploads\/2019\/09\/4306f6c33543d38f5d8b77f67e22e247.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuindi, parliamo dei risultati dell'applicazione del nostro sistema di unit test. <\/p>\n<ol>\n<li>Certamente, prima di tutto, siamo convinti che abbiamo iniziato a sviluppare software di qualit\u00e0 superiore. I test automatici vengono eseguiti quotidianamente e ogni rilascio trova decine di errori. Inoltre, alcuni di questi errori sono solo indirettamente correlati alle funzionalit\u00e0 che volevamo realmente modificare. Ci sono grandi dubbi sul fatto che questi errori siano stati trovati tramite test manuali. <\/li>\n<li>Il team ha acquisito fiducia che una specifica funzionalit\u00e0 funzioni correttamente\u2026 Questo \u00e8 particolarmente vero per i nostri processi critici. Ad esempio, negli ultimi sei mesi non abbiamo avuto problemi nella distribuzione di sconti e bonus in cassa, nonostante le modifiche rilasciate ogni volta, mentre in periodi precedenti si sono verificati errori con certa periodicit\u00e0.<\/li>\n<li>Siamo riusciti a ridurre il numero di iterazioni di test. Grazie al fatto che i test automatici sono scritti per le nuove funzionalit\u00e0, gli analisti e, allo stesso tempo, i tester ricevono codice di qualit\u00e0 superiore, poich\u00e9 \u00e8 gi\u00e0 stato verificato.<\/li>\n<li>Alcune delle tecnologie di testing automatizzato vengono utilizzate dagli sviluppatori. Ad esempio, i dati di test sui contenitori vengono creati utilizzando un modulo di generazione degli oggetti.<\/li>\n<li>\u00c8 importante notare che abbiamo raggiunto un'accettazione del sistema di test automatici da parte degli sviluppatori. C'\u00e8 consapevolezza che sia fondamentale e utile. Tuttavia, dalla mia esperienza, posso dire che non \u00e8 affatto cos\u00ec. I test automatici devono essere scritti, mantenuti e sviluppati, con analisi dei risultati, e spesso questi sforzi temporali non valgono la pena. \u00c8 molto pi\u00f9 semplice andare in produzione e affrontare i problemi l\u00ec. I nostri sviluppatori, infatti, fanno la fila e chiedono di coprire le loro funzionalit\u00e0 con i test automatici.<\/li>\n<\/ol>\n<h2>Cosa succede dopo<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit test nei DB \u2014 come lo facciamo da Sportmaster, parte seconda\" src=\"\/wp-content\/uploads\/2019\/09\/a11596618e97c0afaa9f5f25b613575e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nParliamo dei piani di sviluppo del progetto di test automatico.<\/p>\n<p>Senza dubbio, finch\u00e9 il sistema di fedelt\u00e0 di Sportmaster \u00e8 vivo e continua a svilupparsi, possiamo espandere quasi all'infinito i test automatici. Pertanto, la principale direzione di sviluppo \u00e8 l'espansione della copertura.<\/p>\n<p>Con l'aumento del numero di test automatici, il tempo complessivo di esecuzione crescer\u00e0 inevitabilmente, e dovremo tornare a considerare la questione delle prestazioni. Probabilmente, la soluzione consister\u00e0 nell'aumentare il numero di flussi paralleli.<\/p>\n<p>Tuttavia, questi sono percorsi di sviluppo evidenti. Se parliamo di qualcosa di pi\u00f9 non triviale, evidenziamo quanto segue:<\/p>\n<ol>\n<li>Attualmente la gestione dei test automatici avviene a livello di DBMS, cio\u00e8 \u00e8 necessaria la conoscenza di PL\/SQL per lavorare con successo. Se necessario, \u00e8 possibile spostare la gestione del sistema (ad esempio, l'esecuzione di avviamenti o la creazione di metadati) in un'interfaccia di amministrazione, utilizzando Jenkins o qualcosa di simile.<\/li>\n<li>Tutti amano gli indicatori quantitativi e qualitativi. Per i test automatici, un indicatore universale \u00e8 la Code Coverage o metrica di copertura del codice. Con questo indicatore possiamo determinare quale percentuale del codice del nostro sistema in fase di test \u00e8 coperta dai test automatici. A partire dalla versione 12.2, Oracle offre funzionalit\u00e0 per il calcolo di questa metrica e suggerisce di utilizzare il pacchetto standard DBMS_PLSQL_CODE_COVERAGE.\n<p>Il nostro sistema di test automatici ha poco pi\u00f9 di un anno e forse ora \u00e8 il momento giusto per valutare la copertura. Nel mio progetto precedente (che non era di Sportmaster) \u00e8 andata proprio cos\u00ec. Dopo un anno di lavoro sui test automatici, la direzione ha chiesto di valutare quale percentuale di codice stessimo coprendo. Con una copertura superiore all'1%, la direzione sarebbe stata felice. Noi sviluppatori ci aspettavamo un risultato attorno al 10%. Abbiamo attivato la misurazione della code coverage, fatto i calcoli e ottenuto il 20%. Con entusiasmo ci siamo diretti a richiedere un premio, ma come \u00e8 andata e dove ci siamo diretti dopo \u00e8 un'altra storia del tutto diversa.<\/li>\n<li>I test automatici possono verificare i servizi web esposti. Oracle permette benissimo di farlo, e noi non ci imbatteremo pi\u00f9 in una serie di problemi. <\/li>\n<li>E naturalmente, il nostro sistema di testing automatico pu\u00f2 essere applicato ad un altro progetto. La soluzione che abbiamo ottenuto \u00e8 universale e richiede semplicemente l'uso di Oracle. Ho sentito che ci sono interessi verso il testing automatico in altri progetti di Sportmaster e, probabilmente, ci dirigeremo verso di loro.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Conclusioni<\/h2>\n<p>\nRiepiloghiamo. Nel progetto del sistema di fedelt\u00e0 di Sportmaster, siamo riusciti a implementare un sistema di test automatizzati. La base di questo sistema \u00e8 la soluzione utPLSQL di Steven Feuerstein. Intorno a utPLSQL si trova il codice dei test automatici e moduli ausiliari scritti in proprio: modulo di avvio, modulo di generazione dei dati e altri. I test automatici vengono eseguiti quotidianamente e, cosa pi\u00f9 importante, funzionano e portano beneficio. Siamo convinti di aver iniziato a rilasciare software di qualit\u00e0 superiore. Inoltre, la soluzione ottenuta \u00e8 universale e pu\u00f2 essere facilmente applicata a qualsiasi progetto che necessita di organizzare test automatizzati su database Oracle.<\/p>\n<p><i>P.S. Questo articolo non \u00e8 molto specifico: contiene molto testo e praticamente nessun esempio tecnico. Se il tema generale \u00e8 interessante, siamo pronti a continuarne la trattazione e tornare con un seguito, dove racconteremo cosa \u00e8 cambiato negli ultimi sei mesi e porteremo esempi di codice.<\/p>\n<p>Scrivete nei commenti se ci sono aspetti su cui dovremmo concentrarci in futuro o domande che richiedono approfondimenti.<\/i><\/p>\n<p class=\"for_users_only_msg\">Solo gli utenti registrati possono partecipare al sondaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Accedi<\/a><\/noindex>, per favore.<\/p>\n<h2 class=\"default-block__polling-title\">Continuiamo a scrivere su questo?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    S\u00ec, certo<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    No, grazie<\/p>\n<\/li>\n<\/ul>\n<p>    Hanno votato 12 utenti. 4 utenti si sono astenuti.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u043e\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435, \u0442\u043e \u043a\u0430\u043a \u0431\u044b \u0432\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438? \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0431\u0432\u0435\u043d\u0438\u044e \u0438 \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430. \u0412 \u0447\u0443\u0436\u043e\u043c \u043a\u043e\u0434\u0435 \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043b\u044e\u0431\u0438\u0442, \u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28269,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37666","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u043e\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435, \u0442\u043e \u043a\u0430\u043a \u0431\u044b \u0432\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438? \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0431\u0432\u0435\u043d\u0438\u044e \u0438 \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430. \u0412 \u0447\u0443\u0436\u043e\u043c \u043a\u043e\u0434\u0435 \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043b\u044e\u0431\u0438\u0442, \u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Unit-\u0442\u0435\u0441\u0442\u044b \u0432 \u0421\u0423\u0411\u0414 \u2014 \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435, \u0447\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u043e\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435, \u0442\u043e \u043a\u0430\u043a \u0431\u044b \u0432\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438? \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0431\u0432\u0435\u043d\u0438\u044e \u0438 \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430. \u0412 \u0447\u0443\u0436\u043e\u043c \u043a\u043e\u0434\u0435 \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043b\u044e\u0431\u0438\u0442, \u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:18:55+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:55+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Unit test nei DBMS \u2014 come lo facciamo in Sportmaster, parte seconda | ProHoster","description":"La prima parte \u00e8 qui. Immaginate la situazione. Vi trovate di fronte a un compito di sviluppo di una nuova funzionalit\u00e0. Avete delle base dai vostri predecessori. Se supponiamo che non avete alcun vincolo morale, come vi comportereste? Spesso tutte le vecchie progettazioni vengono dimenticate e si ricomincia da capo. Nessuno ama frugare nel codice altrui, e con la presenza","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Unit-\u0442\u0435\u0441\u0442\u044b \u0432 \u0421\u0423\u0411\u0414 \u2014 \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435, \u0447\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f | ProHoster","og:description":"\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u043e\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435, \u0442\u043e \u043a\u0430\u043a \u0431\u044b \u0432\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438? \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0431\u0432\u0435\u043d\u0438\u044e \u0438 \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430. \u0412 \u0447\u0443\u0436\u043e\u043c \u043a\u043e\u0434\u0435 \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043b\u044e\u0431\u0438\u0442, \u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:18:55+00:00","article:modified_time":"2019-10-31T19:18:55+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37666","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 18:48:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:23:06","updated":"2026-01-23 18:48:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/37666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=37666"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/37666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/28269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=37666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=37666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=37666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}