{"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 DBMS - come lo facciamo noi in Sportmaster, parte seconda","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Parte prima - <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 DBMS - come lo facciamo noi in Sportmaster, parte seconda\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Immaginate la situazione. Avete il compito di sviluppare una nuova funzionalit\u00e0. Avete a disposizione lavori precedenti dai vostri predecessori. Se consideriamo che non avete alcun obbligo morale, come vi comportereste?<\/p>\n<p>Nella maggior parte dei casi, tutti i passati lavori vengono dimenticati e si riparte da zero. Nessuno ama spulciare il codice di qualcun altro, e se ci si trova davanti a del tempo, perch\u00e9 non dedicarsi alla creazione di un proprio sistema? Questo \u00e8 un approccio tipico, e in gran parte corretto. Ma nel nostro progetto non abbiamo proceduto in questo modo. Abbiamo basato il futuro sistema di test automatici sulle esperienze di unit test su utPLSQL dei nostri predecessori, per poi lavorare in diverse direzioni parallele.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>Ripristino dei vecchi unit test.<\/b> Per ripristino si intende l'adattamento dei test allo stato attuale del sistema di loyalty e l'adattamento dei test agli standard utPLSQL. <\/li>\n<li><b>Risolvere il problema della comprensione di quali metodi e processi siano coperti dai test automatici. <\/b>Bisogna tenere queste informazioni a mente o trarre conclusioni direttamente dal codice dei test automatici. Pertanto, abbiamo deciso di formare un catalogo. Ad ogni test automatico abbiamo assegnato un codice mnemonico unico, abbiamo creato una descrizione e registrato le impostazioni (ad esempio, in quali condizioni deve essere eseguito o cosa deve succedere se il test fallisce). In sostanza, abbiamo riempito i metadati sui test automatici e inserito questi metadati nelle tabelle standard dello schema utPLSQL.<\/li>\n<li><b>Definizione della strategia di ampliamento, ovvero selezione delle funzionalit\u00e0 da verificare con i test automatici.<\/b> Abbiamo deciso di prestare attenzione a tre aspetti: nuove implementazioni del sistema, incidenti dalla produzione e processi chiave del sistema. In questo modo ci sviluppiamo parallelamente al rilascio, garantendo una qualit\u00e0 superiore e ampliando nel contempo l'area di regressione, assicurando la stabilit\u00e0 del sistema nei punti critici. La prima di queste strozzature \u00e8 stata il processo di distribuzione di sconti e bonus nel pagamento.<\/li>\n<li><b>Naturalmente, ci siamo messi al lavoro sulla creazione di nuovi test automatici. <\/b>Uno dei primi compiti di rilascio \u00e8 stata la valutazione delle prestazioni dei campioni predefiniti del sistema di fidelizzazione. Nel nostro progetto, abbiamo un blocco di query SQL fissate, che selezionano i clienti in base a determinati criteri. Ad esempio, ottenere un elenco di tutti i clienti la cui ultima acquisto \u00e8 avvenuto in una citt\u00e0 specifica, o un elenco di clienti la cui spesa media supera un valore definito. Scrivendo dei test automatici, abbiamo verificato i campioni predefiniti, registrato i parametri di riferimento delle prestazioni e, in aggiunta, abbiamo introdotto il testing di carico.<\/li>\n<li><b>Lavorare con i test automatici deve essere comodo<\/b>. Le due azioni pi\u00f9 comuni sono: avvio dei test automatici e creazione di dati di test. Cos\u00ec, nel nostro sistema sono stati creati due moduli di supporto: un modulo di avvio e un modulo di generazione dati.\n<p>Il modulo di avvio \u00e8 presentato come una singola procedura universale con un unico parametro di input testuale. Come parametro, si pu\u00f2 passare il mnemonico del test automatico, il nome del pacchetto, il nome del test, le impostazioni del test automatico o una parola chiave riservata. La procedura seleziona e avvia tutti i test automatici che soddisfano le condizioni.<\/p>\n<p>Il modulo di generazione dati \u00e8 presentato come un pacchetto, in cui per ogni oggetto del sistema sottoposto a test (tabella nel DB), \u00e8 stata creata una procedura speciale che inserisce dati. In questa procedura, i valori predefiniti sono riempiti al massimo, garantendo la creazione di oggetti in un attimo. E per comodit\u00e0 d'uso sono stati creati modelli di dati da generare. Ad esempio, creare un cliente di una certa et\u00e0 con un telefono di prova e un acquisto effettuato.<\/li>\n<li><b>I test automatici devono avviarsi e funzionare in un tempo accettabile per il tuo sistema. <\/b>Pertanto, \u00e8 stato organizzato un avvio notturno giornaliero, i cui risultati generano un rapporto sulle prestazioni e viene inviato a tutto il team di sviluppo via e-mail aziendale. Dopo il ripristino dei vecchi test automatici e la creazione di nuovi, il tempo totale di esecuzione era di 30 minuti. Questa prestazione soddisfaceva tutti, poich\u00e9 l'avvio avveniva al di fuori dell'orario lavorativo.\n<p>Ma abbiamo dovuto lavorare sull'ottimizzazione della velocit\u00e0 di funzionamento. L'aggiornamento del sistema di fidelizzazione in produzione avviene durante la notte. Durante uno dei rilasci, \u00e8 stato necessario apportare modifiche urgenti nella notte. Una attesa di mezz'ora per i risultati dei test automatici alle tre di notte non ha reso felice il responsabile del rilascio (un caloroso saluto ad Aleksey Vasyukov!), e la mattina seguente sono state spese molte parole gentili verso il nostro sistema. Tuttavia, alla fine \u00e8 stato stabilito un limite di 5 minuti per il lavoro.<\/p>\n<p>Per aumentare le prestazioni, abbiamo utilizzato due metodi: i test automatici sono stati avviati in tre flussi paralleli, il che \u00e8 stato molto conveniente grazie all'architettura del nostro sistema di fidelizzazione. Inoltre, abbiamo abbandonato l'approccio in cui il test automatico non crea dati di prova per s\u00e9 ma cerca di trovare nel sistema qualcosa di appropriato. Dopo le modifiche, il tempo totale di esecuzione \u00e8 stato ridotto a 3-4 minuti.<\/li>\n<li><b>Il progetto con i test automatici deve poter essere distribuito su diversi stand.<\/b> All'inizio del percorso ci sono stati tentativi di scrivere i propri script batch, ma \u00e8 diventato chiaro che installazioni automatizzate scritte a mano sono un vero incubo, quindi ci siamo orientati verso soluzioni industriali. Poich\u00e9 nel progetto ci sono molto codice (in primo luogo, memorizziamo il codice dei test automatici) e pochi dati (i dati principali sono i metadati sui test automatici), l'introduzione di Liquibase nel progetto \u00e8 risultata molto semplice.\n<p>\u00c8 una libreria indipendente dal database con codice sorgente aperto per monitorare, gestire e applicare modifiche agli schemi del database. Viene gestita tramite riga di comando o framework come Apache Maven. Il principio di funzionamento di Liquibase \u00e8 piuttosto semplice. Abbiamo un progetto organizzato in un certo modo, composto da modifiche o script che devono essere applicati sul server di destinazione, e file di controllo che definiscono in quale sequenza e con quali parametri devono essere installate 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 al nostro sistema su qualsiasi ambiente. I test automatici vengono ora eseguiti sugli ambienti di test e di rilascio, cos\u00ec come sui container (ambienti personali degli sviluppatori).<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Unit test nei DBMS - come lo facciamo noi in 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 testing. <\/p>\n<ol>\n<li>Naturalmente, prima di tutto, siamo convinti di aver iniziato a sviluppare software di migliore qualit\u00e0. I test automatici vengono eseguiti quotidianamente e ogni rilascio trova decine di errori. Inoltre, una parte di questi errori \u00e8 solo indirettamente legata alla funzionalit\u00e0 che volevamo effettivamente cambiare. Ci sono grandi dubbi sul fatto che questi errori siano stati trovati tramite testing manuale. <\/li>\n<li>Il team ha acquisito fiducia che una determinata funzionalit\u00e0 funzioni correttamente... Questo riguarda principalmente i nostri processi critici. Ad esempio, negli ultimi sei mesi non abbiamo avuto problemi con la distribuzione degli sconti e dei bonus sullo scontrino, nonostante le modifiche ad ogni rilascio, anche se nei periodi precedenti si verificavano periodicamente degli errori.<\/li>\n<li>Siamo riusciti a ridurre il numero di iterazioni di test. Grazie al fatto che i test automatici vengono scritti su nuove funzionalit\u00e0, gli analisti e testatori, a tempo pieno e congiuntamente, ricevono un codice di qualit\u00e0 superiore, poich\u00e9 \u00e8 gi\u00e0 stato verificato.<\/li>\n<li>Parte dei lavori di testing automatizzato viene utilizzata dagli sviluppatori. Ad esempio, i dati di test sui container vengono creati utilizzando un modulo di generazione di oggetti.<\/li>\n<li>Non \u00e8 di poco conto che abbiamo sviluppato un \"accettazione\" del sistema di testing automatizzato da parte degli sviluppatori. C'\u00e8 consapevolezza che sia importante e utile. E dalla mia esperienza posso dire che non \u00e8 affatto cos\u00ec. I test automatici devono essere scritti, devono essere mantenuti e sviluppati, analizzati i risultati, e spesso questi investimenti di tempo non valgono la pena. \u00c8 molto pi\u00f9 semplice andare in produzione e affrontare i problemi l\u00ec. Tuttavia, i nostri sviluppatori si mettono in fila e chiedono di coprire le loro funzionalit\u00e0 con test automatici.<\/li>\n<\/ol>\n<h2>E ora?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit test nei DBMS - come lo facciamo noi in 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 testing automatizzato.<\/p>\n<p>Senza dubbio, finch\u00e9 il sistema di loyalty di Sportmaster \u00e8 attivo e continua a svilupparsi, possiamo anche sviluppare praticamente all'infinito i test automatici. Pertanto, la principale direzione di sviluppo \u00e8 l'espansione dell'area di copertura.<\/p>\n<p>Con l'aumento del numero di test automatici, aumenter\u00e0 inesorabilmente anche il tempo totale di esecuzione, e dovremo nuovamente affrontare la questione delle prestazioni. Probabilmente, la soluzione consister\u00e0 nell'aumentare il numero di flussi paralleli.<\/p>\n<p>Ma queste sono strade di sviluppo ovvie. Parlare di qualcosa di pi\u00f9 non banale, evidenziamo quanto segue:<\/p>\n<ol>\n<li>Attualmente, la gestione dei test automatici viene effettuata a livello di database, cio\u00e8 sono necessarie conoscenze di PL\/SQL per lavorare con successo. Quando necessario, la gestione del sistema (ad esempio, avviare esecuzioni o creare metadati) pu\u00f2 essere realizzata tramite un'interfaccia di amministrazione, utilizzando Jenkins o qualcosa di simile.<\/li>\n<li>Tutti amano indicatori quantitativi e qualitativi. Per i test automatici, un indicatore universale \u00e8 il Codice di Copertura o la 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 la possibilit\u00e0 di calcolare questa metrica e propone 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 (un progetto diverso da Sportmaster) \u00e8 successo proprio cos\u00ec. Un anno dopo l'inizio del lavoro sui test automatici, la direzione ha richiesto di valutare quale percentuale di codice fossimo in grado di coprire. Con una copertura superiore all'1%, la direzione sarebbe stata felice. Noi sviluppatori ci aspettavamo un risultato attorno al 10%. Abbiamo implementato il codice di copertura, misurato, e abbiamo ottenuto il 20%. Con grande entusiasmo ci siamo recati a richiedere un premio, ma come ci siamo comportati in merito e dove siamo andati dopo, \u00e8 tutta un'altra storia.<\/li>\n<li>I test automatici possono verificare i servizi web esposti. Oracle lo consente ampiamente, e noi non ci imbatteremo pi\u00f9 in tutta una serie di problemi. <\/li>\n<li>E, naturalmente, il nostro sistema di test automatizzati pu\u00f2 essere applicato a un altro progetto. La soluzione che abbiamo ottenuto \u00e8 universale e richiede solo l'uso di Oracle. Ho sentito che ci sono interessi in progetti diversi di Sportmaster per il testing automatico e, forse, ci dirigeremo verso di loro.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Conclusioni<\/h2>\n<p>\nRicapitoliamo. Nel progetto del sistema di fidelizzazione di Sportmaster, siamo riusciti a implementare un sistema di test automatizzati. La base \u00e8 una soluzione utPLSQL di Steven Feuerstein. Attorno a utPLSQL si trova il codice dei test automatici e moduli ausiliari scritti da noi: modulo di avvio, modulo di generazione dei dati e altri. I test automatici vengono eseguiti quotidianamente e, cosa pi\u00f9 importante, funzionano e apportano benefici. Siamo convinti di aver iniziato a rilasciare software di qualit\u00e0 superiore. Inoltre, la soluzione ottenuta \u00e8 universale e pu\u00f2 essere liberamente applicata a qualsiasi progetto che richieda l'organizzazione del testing automatizzato su DBMS Oracle.<\/p>\n<p><i>P.S. Questo articolo \u00e8 risultato non molto specifico: ci sono molte parole e quasi nessun esempio tecnico. Se in generale l'argomento \u00e8 interessante, siamo pronti a continuarlo e tornare con un seguito, in cui parleremo di cosa \u00e8 cambiato negli ultimi sei mesi e forniremo esempi di codice.<\/p>\n<p>Scrivete nei commenti se ci sono aspetti su cui vale la pena concentrare l'attenzione in futuro, o domande che richiedono chiarimenti.<\/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. Si sono astenuti 4 utenti.<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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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 in DBMS: come lo facciamo in Sportmaster, parte seconda | ProHoster","description":"La prima parte \u00e8 qui.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}