{"id":37495,"date":"2019-10-31T22:17:57","date_gmt":"2019-10-31T19:17:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya\/"},"modified":"2019-10-31T22:17:57","modified_gmt":"2019-10-31T19:17:57","slug":"unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","title":{"rendered":"Unit test nei DB \u2014 come facciamo noi in Sportmaster, parte prima","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ciao, Habr!<\/p>\n<p>Mi chiamo Maxim Ponomarenko e sono uno sviluppatore in Sportmaster. Ho 10 anni di esperienza nel settore IT. Ho iniziato la mia carriera nel campo del testing manuale, poi mi sono spostato nello sviluppo di database. Negli ultimi 4 anni, accumulando le conoscenze acquisite nel testing e nello sviluppo, mi occupo dell'automazione del testing a livello di DBMS.<\/p>\n<p>Faccio parte del team di Sportmaster da poco pi\u00f9 di un anno e in uno dei grandi progetti mi occupo dello sviluppo del testing automatico. Ad aprile, insieme ai ragazzi di Sportmaster Lab, abbiamo partecipato a una conferenza a Krasnodar, il mio intervento si intitolava \u201cUnit test nel DBMS\u201d, e ora voglio condividerlo con voi. Ci sar\u00e0 molta carne al fuoco, quindi ho deciso di suddividere l'intervento in due post. Nel primo parleremo dei test automatici e del testing in generale, mentre nel secondo ci soffermeremo pi\u00f9 nel dettaglio sul nostro sistema di unit testing e sui risultati ottenuti.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\"><img decoding=\"async\" alt=\"Unit test nei DB \u2014 come facciamo noi in Sportmaster, parte prima\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Iniziamo con un po' di noiosa teoria. Cos'\u00e8 il testing automatico? \u00c8 un tipo di testing che viene effettuato tramite strumenti software e nell'IT moderno viene utilizzato sempre pi\u00f9 frequentemente nello sviluppo di software. Questo \u00e8 legato al fatto che le aziende crescono, crescono anche i loro sistemi informatici e di conseguenza aumenta il numero di funzionalit\u00e0 da testare. Effettuare testing manuale diventa sempre pi\u00f9 costoso e complicato.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nHo lavorato in una grande azienda, i cui rilasci avvengono ogni due mesi. Durante il primo mese, un team di dieci tester controllava manualmente le funzionalit\u00e0. Grazie all'implementazione dell'automazione con un piccolo team di sviluppatori, siamo riusciti a ridurre il tempo di testing a due settimane in un anno e mezzo. Non solo abbiamo aumentato la velocit\u00e0 del testing, ma abbiamo anche migliorato la sua qualit\u00e0. I test automatici vengono eseguiti regolarmente e compiono sempre tutte le verifiche programmate, escludendo cos\u00ec il fattore umano. <\/p>\n<p>Nel moderno settore IT \u00e8 caratteristico che da uno sviluppatore non si richieda solo di scrivere il codice del prodotto, ma anche di scrivere unit test che verifichino quel codice. <\/p>\n<p>Ma cosa fare se il vostro sistema si basa principalmente sulla logica del server? Non esiste una soluzione universale e best practices sul mercato. Di solito, le aziende risolvono questo problema creando il proprio sistema di test personalizzato. Un sistema di test automatizzato personalizzato \u00e8 stato creato nel nostro progetto, e di questo parler\u00f2 nella mia presentazione. <\/p>\n<p><img decoding=\"async\" alt=\"Unit test nei DB \u2014 come facciamo noi in Sportmaster, parte prima\" src=\"\/wp-content\/uploads\/2019\/08\/fee34f7214fb2075ee50fa0f4af14a44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Testiamo la fedelt\u00e0<\/h2>\n<p>\nIniziamo a parlare del progetto in cui abbiamo implementato il sistema di test automatizzato. Il nostro progetto \u00e8 un sistema di fedelt\u00e0 di Sportmaster (tra l'altro, ne abbiamo gi\u00e0 parlato in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/453252\/\">questo post<\/a><\/noindex>).<\/p>\n<p>Se la vostra azienda \u00e8 abbastanza grande, il vostro sistema di fedelt\u00e0 avr\u00e0 tre caratteristiche standard: <\/p>\n<ul>\n<li>Il vostro sistema sar\u00e0 ad alta capacit\u00e0 di carico<\/li>\n<li>Il vostro sistema conterr\u00e0 processi computazionali complessi<\/li>\n<li>Il vostro sistema sar\u00e0 attivamente sviluppato. <\/li>\n<\/ul>\n<p>\nProcediamo con ordine\u2026 Complessivamente, se consideriamo tutti i marchi di Sportmaster, abbiamo pi\u00f9 di 1000 negozi sul territorio di Russia, Ucraina, Cina, Kazakistan e Bielorussia. In questi negozi si effettuano circa 300.000 acquisti ogni giorno. Questo significa che ogni secondo nel nostro sistema entra da 3 a 4 scontrini. Naturalmente, il nostro sistema di fedelt\u00e0 \u00e8 ad alta capacit\u00e0 di carico. E poich\u00e9 \u00e8 usato attivamente, dobbiamo fornire i pi\u00f9 alti standard di qualit\u00e0, poich\u00e9 qualsiasi errore nel software comporta grandi perdite economiche, reputazionali e altro. <\/p>\n<p>Contemporaneamente, in Sportmaster operano pi\u00f9 di cento diverse promozioni. Le promozioni sono le pi\u00f9 varie: ci sono quelle sui prodotti, quelle legate ai giorni della settimana, quelle collegate a negozi specifici, ci sono promozioni sul valore dello scontrino e sul numero di prodotti. Insomma, non \u00e8 affatto banale. I clienti hanno bonus, ci sono codici promozionali utilizzati durante gli acquisti. Tutto ci\u00f2 porta al fatto che il calcolo di qualsiasi ordine \u00e8 un compito piuttosto complesso. <\/p>\n<p>L'algoritmo che gestisce l'elaborazione degli ordini \u00e8 davvero terribile e complesso. Qualsiasi modifica a questo algoritmo \u00e8 un rischio piuttosto elevato. Anche le pi\u00f9 insignificanti variazioni apparenti possono portare a effetti abbastanza imprevedibili. Ecco perch\u00e9 tali processi computazionali complessi, specialmente quelli che implementano funzionalit\u00e0 critiche, sono i migliori candidati per l'automazione. Controllare manualmente decine di casi simili richiede molto tempo. E poich\u00e9 il punto di ingresso nel processo rimane invariato, descrivendolo una volta \u00e8 possibile generare rapidamente test automatici e avere fiducia nel funzionamento della funzionalit\u00e0.<\/p>\n<p>Poich\u00e9 il nostro sistema viene utilizzato attivamente, le aziende si aspettano da voi qualcosa di nuovo, di essere al passo con i tempi e di essere orientati al cliente. Nel nostro sistema di fidelizzazione, le versioni vengono rilasciate ogni due mesi. Quindi, ogni due mesi dobbiamo eseguire un regresso completo dell'intero sistema. Inoltre, come in qualsiasi IT moderno, lo sviluppo non passa immediatamente dal programmatore alla produzione. Nasce nel contesto dello sviluppatore, poi passa successivamente attraverso l'ambiente di test, il rilascio, l'accettazione e solo dopo arriva in produzione. Almeno negli ambienti di test e rilascio, \u00e8 necessario eseguire un regresso completo dell'intero sistema. <\/p>\n<p>Le propriet\u00e0 descritte sono standard per praticamente qualsiasi sistema di fidelizzazione. Parliamo ora delle peculiarit\u00e0 del nostro progetto.<\/p>\n<p>Dal punto di vista tecnologico, il 90% della logica del nostro sistema di fidelizzazione \u00e8 server-side e realizzata su Oracle. C'\u00e8 un client basato su Delphi che svolge la funzione di amministratore APM. Sono disponibili dei web service per applicazioni esterne (ad esempio, il sito web). Pertanto, \u00e8 logico che, se sviluppiamo un sistema di test automatizzati, lo faremo su Oracle.<\/p>\n<p>Il sistema di fidelizzazione di Sportmaster esiste da oltre 7 anni ed \u00e8 stato sviluppato da singoli programmatori... Il numero medio di sviluppatori nel nostro progetto in questi 7 anni \u00e8 stato di 3-4 persone. Ma nell'ultimo anno il nostro team \u00e8 cresciuto notevolmente, e ora 10 persone lavorano al progetto. Ci\u00f2 significa che nel progetto arrivano persone che non conoscono le attivit\u00e0 tipiche, i processi, l'architettura. E c'\u00e8 un rischio maggiore che ci possano sfuggire degli errori.<\/p>\n<p>Il progetto \u00e8 caratterizzato dall'assenza di tester dedicati come unit\u00e0 statutarie. Ci sono indubbiamente test, ma sono condotti da analisti, oltre alle loro altre principali responsabilit\u00e0: comunicare con i clienti aziendali, gli utenti, elaborare i requisiti per il sistema e cos\u00ec via... Nonostante i test vengano effettuati in modo molto qualitativo (\u00e8 opportuno menzionarlo, poich\u00e9 potrebbe capitare che questo report venga visto da qualche analista), l'efficacia della specializzazione e della concentrazione su un unico compito non \u00e8 mai stata smentita.<\/p>\n<p>Tenendo conto di quanto detto, per migliorare la qualit\u00e0 del prodotto fornito e ridurre i tempi di sviluppo, l'idea di automatizzare i test nel progetto sembra molto logica. In diverse fasi dell'esistenza del sistema di fidelizzazione, singoli sviluppatori hanno fatto sforzi per coprire il proprio codice con test unitari. In generale, si \u00e8 trattato di un processo piuttosto frammentato, dove ciascuno ha utilizzato la propria architettura e metodi. I risultati finali per i test unitari erano comuni: i test venivano sviluppati, utilizzati per un certo periodo, archiviati in una repository di versioni, ma a un certo punto smettevano di essere eseguiti e venivano dimenticati. Questo accadeva principalmente perch\u00e9 i test erano pi\u00f9 legati a chi li aveva eseguiti piuttosto che al progetto.<\/p>\n<h2>A darci una mano arriva utPLSQL<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit test nei DB \u2014 come facciamo noi in Sportmaster, parte prima\" src=\"\/wp-content\/uploads\/2019\/08\/f21dfcb085aace687566dc51cb9b5613.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSai qualcosa su Steven Feuerstein? <\/p>\n<p>Questo \u00e8 un esperto che ha dedicato gran parte della sua carriera a lavorare con Oracle e PL\/SQL, scrivendo un numero significativo di opere su questo argomento. Uno dei suoi libri pi\u00f9 noti si intitola: \u00abOracle PL\/SQL. Per professionisti\u00bb. \u00c8 a Stephen che si deve lo sviluppo della soluzione utPLSQL, che sta per Unit Testing framework per Oracle PL\/SQL. La soluzione utPLSQL \u00e8 stata creata nel 2016, ma continua a essere attivamente sviluppata con nuove versioni. Al momento della relazione, l'ultima versione risale al 24 marzo 2019.<br \/>\nChe cos'\u00e8 allora? \u00c8 un progetto open source a s\u00e9 stante. Occupando un paio di megabyte, inclusi esempi e documentazione, rappresenta fisicamente uno schema separato nel database ORACLE con un insieme di pacchetti e tabelle per organizzare il unit testing. L'installazione richiede solo pochi secondi. La caratteristica distintiva di utPLSQL \u00e8 la sua semplicit\u00e0 d'uso. <br \/>\nIn termini generali, utPLSQL \u00e8 un meccanismo per eseguire unit test, dove per unit test si intendono le normali procedure di pacchetti Oracle, organizzate in base a determinate regole. Oltre all'esecuzione, utPLSQL conserva un registro di tutte le esecuzioni di test e ha anche un sistema interno di reportistica.<\/p>\n<p>Vediamo un esempio di come appare il codice di un unit test implementato secondo questo metodo.<\/p>\n<p><img decoding=\"async\" alt=\"Unit test nei DB \u2014 come facciamo noi in Sportmaster, parte prima\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuindi, sullo schermo abbiamo il codice di una tipica specifica di pacchetto con unit test. Quali sono i requisiti obbligatori? Il pacchetto deve avere il prefisso \u00abutp_\u00bb. Lo stesso prefisso deve avere tutte le procedure di test. Nel pacchetto devono essere presenti due procedure standard: \u00abutp_setup\u00bb e \u00abutp_teardown\u00bb. La prima procedura viene chiamata prima di ogni unit test, la seconda \u2014 dopo l'esecuzione.<\/p>\n<p>\u00abutp_setup\u00bb, in genere, prepara il nostro sistema per l'esecuzione dell'unit test, ad esempio, creando dati di test. \u00abutp_teardown\u00bb \u2014 al contrario, ripristina tutto alle impostazioni iniziali e annulla i risultati dell'esecuzione.<\/p>\n<p>Ecco un esempio del pi\u00f9 semplice test unitario, che verifica la normalizzazione del numero di telefono fornito dal cliente al formato standard della nostra sistema di fidelizzazione. Non esistono standard obbligatori su come scrivere procedure con test unitari. Di solito viene chiamato un metodo del sistema testato e il risultato restituito da questo metodo viene confrontato con quello atteso. \u00c8 importante che il confronto tra il risultato atteso e quello ottenuto avvenga attraverso i metodi standard di utPLSQL.<\/p>\n<p>In un test unitario, possono esserci un numero qualsiasi di controlli. Come si pu\u00f2 vedere dall'esempio, facciamo quattro chiamate successive al metodo testato per la normalizzazione del numero di telefono e dopo ciascuna chiamata valutiamo il risultato. Quando si sviluppa un test unitario, \u00e8 necessario tenere presente che ci sono controlli che non influenzano in alcun modo il sistema, mentre dopo alcuni \u00e8 necessario tornare allo stato iniziale del sistema. <br \/>\nAd esempio, nel test unitario presentato formattiamo semplicemente il numero di telefono in ingresso, il che non influisce in alcun modo sul sistema di fidelizzazione. <\/p>\n<p>E se scriviamo test unitari per il metodo di creazione di un nuovo cliente, dopo ogni controllo verr\u00e0 creato un nuovo cliente nel sistema, il che pu\u00f2 influenzare l'esecuzione dei test successivi.<\/p>\n<p><img decoding=\"async\" alt=\"Unit test nei DB \u2014 come facciamo noi in Sportmaster, parte prima\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEcco come vengono eseguiti i test unitari. Sono ammesse due modalit\u00e0 di esecuzione: esecuzione di tutti i test unitari di un pacchetto specifico o esecuzione di un test unitario specifico in un pacchetto specifico.<\/p>\n<p><img decoding=\"async\" alt=\"Unit test nei DB \u2014 come facciamo noi in Sportmaster, parte prima\" src=\"\/wp-content\/uploads\/2019\/08\/46628b60eb0fe0d20df822ddca914947.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEcco come appare l'esempio del sistema di reportistica interna. In base ai risultati del test unitario, utPLSQL genera un piccolo rapporto. In questo vediamo il risultato di ciascun controllo specifico e il risultato complessivo dell'esecuzione del test unitario. <\/p>\n<h2>6 regole per i test automatici<\/h2>\n<p>\nPrima di iniziare a creare un nuovo sistema di test automatizzati per il sistema di fidelizzazione, abbiamo definito insieme alla direzione i principi a cui i nostri futuri test automatici dovranno aderire.<\/p>\n<p><img decoding=\"async\" alt=\"Unit test nei DB \u2014 come facciamo noi in Sportmaster, parte prima\" src=\"\/wp-content\/uploads\/2019\/08\/84be59663203abb373e7074b9a6cd4e4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>I test automatici devono essere efficaci e portare vantaggi. Abbiamo sviluppatori straordinari, di cui \u00e8 necessario parlare, poich\u00e9 qualcuno di loro sicuramente legger\u00e0 questa relazione, e scrivono codice eccellente. Ma anche il loro codice notevole non \u00e8 perfetto e ha, ha e avr\u00e0 errori. I test automatici devono essere in grado di individuare questi errori. Se non \u00e8 cos\u00ec, allora stiamo scrivendo test automatici scadenti, oppure siamo entrati in un'area morta, che in linea di principio non viene elaborata. In entrambi i casi stiamo facendo qualcosa di sbagliato, e il nostro approccio \u00e8 semplicemente privo di senso.<\/li>\n<li>I test automatici devono essere utilizzati. \u00c8 insensato spendere un sacco di tempo e sforzi per scrivere un prodotto software, assemblare il suo repository e dimenticarlo. I test devono essere eseguiti, e devono essere eseguiti il pi\u00f9 frequentemente possibile.<\/li>\n<li>I test automatici devono funzionare in modo stabile. Indipendentemente dall'ora del giorno, dallo stand di esecuzione e da altre impostazioni del sistema, i lanci dei test devono portare sempre allo stesso risultato. Di solito, ci\u00f2 \u00e8 garantito dal fatto che i test automatici lavorano con dati di test speciali con impostazioni di sistema definite.<\/li>\n<li>I test automatici devono operare con una velocit\u00e0 accettabile per il tuo progetto. Questo tempo \u00e8 determinato individualmente per ogni sistema. Alcuni possono permettersi di lavorare per l'intera giornata, mentre per altri \u00e8 critico rimanere nei secondi. Quali standard di velocit\u00e0 abbiamo raggiunto nel nostro progetto, ne parler\u00f2 pi\u00f9 avanti.<\/li>\n<li>Lo sviluppo dei test automatici deve essere flessibile. \u00c8 indesiderabile rinunciare a verificare un qualche funzionalit\u00e0 semplicemente perch\u00e9 non l'abbiamo mai fatto o per altre convinzioni. utPLSQL non impone limiti allo sviluppo, e Oracle in linea di principio consente di realizzare le cose pi\u00f9 diverse. La maggior parte dei problemi ha una soluzione, la questione \u00e8 solo di tempo e sforzi spesi.<\/li>\n<li>Distribuibilit\u00e0. Abbiamo diversi stand dove \u00e8 necessario eseguire i test. In ciascuno degli stand pu\u00f2 essere aggiornato un dump con i dati in qualsiasi momento. \u00c8 necessario gestire il progetto con test automatici in modo da poter effettuare senza problemi la sua installazione totale o parziale.<\/li>\n<\/ol>\n<p>E nel secondo post tra un paio di giorni parler\u00f2 di cosa abbiamo fatto e quali risultati abbiamo raggiunto.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041f\u043e\u043d\u043e\u043c\u0430\u0440\u0435\u043d\u043a\u043e \u0438 \u044f \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c\u0435\u044e 10-\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT-\u0441\u0444\u0435\u0440\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 4 \u0433\u043e\u0434\u0430, \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u044f \u0437\u043d\u0430\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0421\u0423\u0411\u0414. \u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u044f \u0441\u043e\u0441\u0442\u043e\u044e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0433\u043e\u0434\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28136,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37495","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\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041f\u043e\u043d\u043e\u043c\u0430\u0440\u0435\u043d\u043a\u043e \u0438 \u044f \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c\u0435\u044e 10-\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT-\u0441\u0444\u0435\u0440\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.\" \/>\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-pervaya\" \/>\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 \u043f\u0435\u0440\u0432\u0430\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041f\u043e\u043d\u043e\u043c\u0430\u0440\u0435\u043d\u043a\u043e \u0438 \u044f \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c\u0435\u044e 10-\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT-\u0441\u0444\u0435\u0440\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.\" \/>\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-pervaya\" \/>\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:17:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:57+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\udd47Test unitari nei DBMS \u2014 come lo facciamo in Sportmaster, parte prima | ProHoster","description":"Ciao, Habr! Mi chiamo Maksim Ponomarenko e sono uno sviluppatore in Sportmaster. Ho dieci anni di esperienza nel settore IT. Ho iniziato la mia carriera nel campo del collaudo manuale, per poi passare allo sviluppo di database.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","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 \u043f\u0435\u0440\u0432\u0430\u044f | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041f\u043e\u043d\u043e\u043c\u0430\u0440\u0435\u043d\u043a\u043e \u0438 \u044f \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c\u0435\u044e 10-\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT-\u0441\u0444\u0435\u0440\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","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:17:57+00:00","article:modified_time":"2019-10-31T19:17:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37495","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:06:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:25:27","updated":"2026-01-23 18:06: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\/37495","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=37495"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/37495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/28136"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=37495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=37495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=37495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}