{"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\/pt\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","title":{"rendered":"Testes unit\u00e1rios em SGBD \u2014 como fazemos isso na Sportmaster, parte um","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1, Habr!<\/p>\n<p>Meu nome \u00e9 Maxim Ponomarenko e sou desenvolvedor na Sportmaster. Tenho 10 anos de experi\u00eancia na \u00e1rea de TI. Comecei minha carreira em testes manuais, depois mudei para desenvolvimento de bancos de dados. Nos \u00faltimos 4 anos, acumulando conhecimentos adquiridos em testes e desenvolvimento, tenho trabalhado na automatiza\u00e7\u00e3o de testes a n\u00edvel de SGBD.<\/p>\n<p>Fa\u00e7o parte da equipe da Sportmaster h\u00e1 pouco mais de um ano e em um dos grandes projetos estou desenvolvendo testes automatizados. Em abril, eu e a equipe do Sportmaster Lab apresentamos em uma confer\u00eancia em Krasnodar, minha palestra se chamava \"Testes Unit\u00e1rios em SGBDs\", e agora quero compartilh\u00e1-la com voc\u00eas. Haver\u00e1 muito texto, ent\u00e3o decidi dividir a palestra em dois posts. No primeiro, falaremos sobre autotestes e testes em geral, e no segundo, vou me aprofundar em nosso sistema de testes unit\u00e1rios e nos resultados de sua aplica\u00e7\u00e3o.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\"><img decoding=\"async\" alt=\"Testes unit\u00e1rios em SGBD \u2014 como fazemos isso na Sportmaster, parte um\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Come\u00e7ando com um pouco de teoria chata. O que \u00e9 teste autom\u00e1tico? \u00c9 um teste realizado por meios de software, e na moderna TI est\u00e1 cada vez mais sendo utilizado no desenvolvimento de software. Isso se deve ao fato de que as empresas est\u00e3o crescendo, seus sistemas de informa\u00e7\u00e3o est\u00e3o se expandindo e, consequentemente, o volume de funcionalidades que precisam ser testadas tamb\u00e9m aumenta. Realizar testes manuais se torna cada vez mais custoso.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nTrabalhei em uma grande empresa cujos lan\u00e7amentos ocorrem a cada dois meses. Nesse processo, um m\u00eas inteiro era dedicado a que uma dezena de testadores verificasse funcionalidade manualmente. Gra\u00e7as \u00e0 automa\u00e7\u00e3o implementada por uma pequena equipe de desenvolvedores, conseguimos reduzir o tempo de teste para 2 semanas em um ano e meio. N\u00e3o apenas aumentamos a velocidade do teste, mas tamb\u00e9m melhoramos sua qualidade. Os testes autom\u00e1ticos s\u00e3o executados regularmente e sempre realizam todo o conjunto de verifica\u00e7\u00f5es programadas, ou seja, eliminamos o fator humano. <\/p>\n<p>Para a TI moderna, \u00e9 caracter\u00edstico que de um desenvolvedor se exija n\u00e3o apenas escrever o c\u00f3digo do produto, mas tamb\u00e9m escrever testes unit\u00e1rios que validem esse c\u00f3digo. <\/p>\n<p>Mas o que fazer se o seu sistema se baseia principalmente na l\u00f3gica de servidor? N\u00e3o existe uma solu\u00e7\u00e3o universal ou melhores pr\u00e1ticas consolidadas no mercado. Normalmente, as empresas resolvem esse problema criando seu pr\u00f3prio sistema de testes sob medida. Este tipo de sistema de testes automatizados foi criado em nosso projeto e vou falar sobre ele em minha apresenta\u00e7\u00e3o. <\/p>\n<p><img decoding=\"async\" alt=\"Testes unit\u00e1rios em SGBD \u2014 como fazemos isso na Sportmaster, parte um\" src=\"\/wp-content\/uploads\/2019\/08\/fee34f7214fb2075ee50fa0f4af14a44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Testando a lealdade<\/h2>\n<p>\nPara come\u00e7armos, vamos falar sobre o projeto em que implementamos o sistema de testes automatizados. Nosso projeto \u00e9 o sistema de fidelidade da Sportmaster (ali\u00e1s, j\u00e1 escrevemos sobre isso em <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/453252\/\">este post<\/a><\/noindex>).<\/p>\n<p>Se a sua empresa \u00e9 grande o suficiente, seu sistema de fidelidade ter\u00e1 tr\u00eas propriedades padr\u00e3o: <\/p>\n<ul>\n<li>Seu sistema ser\u00e1 de alta carga<\/li>\n<li>Seu sistema ter\u00e1 processos computacionais complexos<\/li>\n<li>Seu sistema ser\u00e1 ativamente aprimorado. <\/li>\n<\/ul>\n<p>\nVamos por partes... No total, considerando todas as marcas da Sportmaster, temos mais de 1000 lojas na R\u00fassia, Ucr\u00e2nia, China, Cazaquist\u00e3o e Bielorr\u00fassia. Nessas lojas, cerca de 300.000 compras ocorrem diariamente. Ou seja, a cada segundo, 3-4 recibos entram em nosso sistema. Naturalmente, nosso sistema de fidelidade \u00e9 de alta carga. E como ele \u00e9 usado ativamente, devemos garantir os mais altos padr\u00f5es de qualidade, pois qualquer erro no software pode resultar em grandes perdas financeiras, de reputa\u00e7\u00e3o e outras. <\/p>\n<p>Ao mesmo tempo, mais de cem promo\u00e7\u00f5es diferentes est\u00e3o em opera\u00e7\u00e3o na Sportmaster. As promo\u00e7\u00f5es s\u00e3o diversas: h\u00e1 as relacionadas a produtos, as vinculadas ao dia da semana, as espec\u00edficas de uma loja, as que dependem do valor da compra, e promo\u00e7\u00f5es relacionadas \u00e0 quantidade de itens. Enfim, \u00e9 consider\u00e1vel. Os clientes t\u00eam b\u00f4nus e c\u00f3digos promocionais que s\u00e3o usados nas compras. Tudo isso torna o c\u00e1lculo de qualquer pedido uma tarefa bastante n\u00e3o trivial. <\/p>\n<p>O algoritmo que implementa o processamento de pedidos \u00e9 realmente horr\u00edvel e complexo. E qualquer altera\u00e7\u00e3o nesse algoritmo \u00e9 uma tarefa bastante arriscada. \u00c0s vezes, mudan\u00e7as que parecem insignificantes podem levar a efeitos bem imprevis\u00edveis. E esses processos computacionais complexos, especialmente aqueles que realizam funcionalidades cr\u00edticas, s\u00e3o os melhores candidatos \u00e0 automa\u00e7\u00e3o. Verificar manualmente dezenas de casos semelhantes consome muito tempo. E como o ponto de entrada no processo permanece inalterado, ao descrev\u00ea-lo uma vez, \u00e9 poss\u00edvel rapidamente gerar testes autom\u00e1ticos e ter confian\u00e7a no funcionamento da funcionalidade.<\/p>\n<p>Como nosso sistema \u00e9 amplamente utilizado, os neg\u00f3cios desejar\u00e3o algo novo de voc\u00ea, mantendo-se atualizados e centrados no cliente. Em nosso sistema de fidelidade, os lan\u00e7amentos ocorrem a cada dois meses. Portanto, a cada dois meses, precisamos realizar um teste de regress\u00e3o completo em todo o sistema. E claro, como em qualquer TI moderna, o desenvolvimento n\u00e3o vai direto do desenvolvedor para a produ\u00e7\u00e3o. Ele se inicia no ambiente do desenvolvedor, em seguida, passa sequencialmente pelo ambiente de teste, de lan\u00e7amento, de aceita\u00e7\u00e3o e s\u00f3 ent\u00e3o chega \u00e0 produ\u00e7\u00e3o. No m\u00ednimo, nos ambientes de teste e de lan\u00e7amento, precisamos realizar um teste de regress\u00e3o completo em todo o sistema. <\/p>\n<p>As propriedades descritas s\u00e3o padr\u00e3o para praticamente qualquer sistema de fidelidade. Vamos discutir as particularidades do nosso projeto.<\/p>\n<p>Tecnologicamente, 90% da l\u00f3gica do nosso sistema de fidelidade \u00e9 baseada em servidor e implementada no Oracle. Existe um cliente em Delphi que desempenha a fun\u00e7\u00e3o de administrador ARMs. Tamb\u00e9m temos servi\u00e7os web expostos para aplica\u00e7\u00f5es externas (como um site). Portanto, faz bastante sentido que, se formos desenvolver um sistema de testes automatizados, faremos isso no Oracle.<\/p>\n<p>O sistema de fidelidade da Sportmaster existe h\u00e1 mais de 7 anos e foi desenvolvido por uma equipe de especialistas... O n\u00famero m\u00e9dio de desenvolvedores em nosso projeto durante esses 7 anos foi de 3 a 4 pessoas. No entanto, no \u00faltimo ano, nossa equipe cresceu muito, e agora 10 pessoas est\u00e3o trabalhando no projeto. Isso significa que novos integrantes est\u00e3o entrando, os quais n\u00e3o est\u00e3o familiarizados com as tarefas, processos e arquitetura t\u00edpicos. E h\u00e1 um risco elevado de que possamos deixar passar erros.<\/p>\n<p>O projeto caracteriza-se pela aus\u00eancia de testadores dedicados como funcion\u00e1rios fixos. Testes, sem d\u00favida, s\u00e3o realizados, mas os analistas se encarregam dos testes al\u00e9m de suas outras fun\u00e7\u00f5es principais: interagir com os clientes de neg\u00f3cios, usu\u00e1rios, elucida\u00e7\u00e3o de requisitos do sistema, etc. e tal... Apesar do fato de que os testes s\u00e3o realizados com alta qualidade (\u00e9 importante mencionar isso, j\u00e1 que algum analista pode acabar vendo este relat\u00f3rio), a efic\u00e1cia da especializa\u00e7\u00e3o e do foco em uma \u00fanica tarefa n\u00e3o deve ser ignorada.<\/p>\n<p>Considerando tudo isso, para aumentar a qualidade do produto entregue e reduzir os prazos de desenvolvimento, a ideia de automatizar os testes no projeto parece bastante l\u00f3gica. Em diferentes est\u00e1gios da exist\u00eancia do sistema de fidelidade, alguns desenvolvedores fizeram esfor\u00e7os para cobrir seu c\u00f3digo com testes unit\u00e1rios. Este foi, de modo geral, um processo bastante fragmentado, onde cada um utilizava sua pr\u00f3pria arquitetura e m\u00e9todos. O que era comum para os testes unit\u00e1rios eram os resultados finais: os testes eram elaborados, utilizados por um tempo, armazenados em um reposit\u00f3rio versionado de arquivos, mas em algum momento paravam de ser executados e eram esquecidos. Isso ocorria principalmente porque os testes estavam mais ligados a um executor espec\u00edfico do que ao projeto.<\/p>\n<h2>utPLSQL vem ao nosso aux\u00edlio.<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Testes unit\u00e1rios em SGBD \u2014 como fazemos isso na Sportmaster, parte um\" src=\"\/wp-content\/uploads\/2019\/08\/f21dfcb085aace687566dc51cb9b5613.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVoc\u00ea sabe algo sobre Steven Feuerstein? <\/p>\n<p>Este \u00e9 um cara inteligente, que dedicou uma parte significativa de sua carreira ao trabalho com Oracle e PL\/SQL, escrevendo uma quantidade consider\u00e1vel de trabalhos sobre o tema. Um de seus livros mais conhecidos chama-se \"Oracle PL\/SQL. Para Profissionais\". Stephen \u00e9 o criador da solu\u00e7\u00e3o utPLSQL, que significa Unit Testing framework for Oracle PL\/SQL. A solu\u00e7\u00e3o utPLSQL foi criada em 2016, mas continua a ser desenvolvida ativamente, com novas vers\u00f5es lan\u00e7adas. No momento da apresenta\u00e7\u00e3o, a vers\u00e3o mais recente datava de 24 de mar\u00e7o de 2019.<br \/>\nMas o que \u00e9 isso? \u00c9 um projeto de c\u00f3digo aberto separado. Pesa alguns megabytes, incluindo exemplos e documenta\u00e7\u00e3o. Fisicamente, representa um esquema separado no banco de dados ORACLE com um conjunto de pacotes e tabelas para facilitar a organiza\u00e7\u00e3o de testes de unidade. A instala\u00e7\u00e3o leva apenas alguns segundos. Uma caracter\u00edstica distintiva do utPLSQL \u00e9 a facilidade de uso. <br \/>\nGlobalmente, o utPLSQL representa um mecanismo para execu\u00e7\u00e3o de testes de unidade, onde um teste de unidade refere-se a procedimentos padr\u00e3o de pacotes Oracle, cuja organiza\u00e7\u00e3o corresponde a algumas regras. Al\u00e9m da execu\u00e7\u00e3o, o utPLSQL mant\u00e9m um registro de todos os seus testes realizados, al\u00e9m de contar com um sistema interno de relat\u00f3rios.<\/p>\n<p>Vamos analisar um exemplo de como o c\u00f3digo de um teste de unidade implementado segundo esta metodologia se parece.<\/p>\n<p><img decoding=\"async\" alt=\"Testes unit\u00e1rios em SGBD \u2014 como fazemos isso na Sportmaster, parte um\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAssim, a tela exibe o c\u00f3digo de uma especifica\u00e7\u00e3o t\u00edpica de pacote com testes de unidade. Quais s\u00e3o os requisitos obrigat\u00f3rios? O pacote deve ter o prefixo \"utp_\". Todas as procedures de teste tamb\u00e9m devem ter o mesmo prefixo. O pacote deve conter obrigatoriamente duas procedures padr\u00e3o: \"utp_setup\" e \"utp_teardown\". A primeira procedure \u00e9 chamada antes de cada teste de unidade, enquanto a segunda \u00e9 chamada ap\u00f3s a execu\u00e7\u00e3o.<\/p>\n<p>\"utp_setup\", como regra, prepara nosso sistema para a execu\u00e7\u00e3o do teste de unidade, por exemplo, criando dados de teste. \"utp_teardown\" \u2014 por outro lado, reverte tudo para as configura\u00e7\u00f5es iniciais e limpa os resultados da execu\u00e7\u00e3o.<\/p>\n<p>Aqui est\u00e1 um exemplo do teste unit\u00e1rio mais simples, que verifica a normaliza\u00e7\u00e3o do n\u00famero de telefone do cliente para o padr\u00e3o da nossa sistema de fidelidade. N\u00e3o existem padr\u00f5es obrigat\u00f3rios sobre como escrever procedimentos com testes unit\u00e1rios. Geralmente, um m\u00e9todo do sistema testado \u00e9 chamado, e o resultado retornado por esse m\u00e9todo \u00e9 comparado com o valor de refer\u00eancia. \u00c9 importante que a compara\u00e7\u00e3o entre o resultado esperado e o obtido seja feita atrav\u00e9s de m\u00e9todos padr\u00e3o do utPLSQL.<\/p>\n<p>Um teste unit\u00e1rio pode conter qualquer n\u00famero de verifica\u00e7\u00f5es. Como mostrado no exemplo, fazemos quatro chamadas sequenciais ao m\u00e9todo testado de normaliza\u00e7\u00e3o do n\u00famero de telefone e, ap\u00f3s cada chamada, avaliamos o resultado. Ao desenvolver o teste unit\u00e1rio, \u00e9 necess\u00e1rio considerar que existem verifica\u00e7\u00f5es que n\u00e3o afetam o sistema, enquanto outras requerem um retorno ao estado original do sistema. <br \/>\nPor exemplo, no teste unit\u00e1rio apresentado, simplesmente formatamos o n\u00famero de telefone de entrada, o que n\u00e3o afeta o sistema de fidelidade. <\/p>\n<p>Se estivermos escrevendo testes unit\u00e1rios para o m\u00e9todo de cria\u00e7\u00e3o de um novo cliente, ap\u00f3s cada verifica\u00e7\u00e3o um novo cliente ser\u00e1 criado no sistema, o que pode impactar a execu\u00e7\u00e3o subsequente do teste.<\/p>\n<p><img decoding=\"async\" alt=\"Testes unit\u00e1rios em SGBD \u2014 como fazemos isso na Sportmaster, parte um\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAssim \u00e9 como os testes unit\u00e1rios s\u00e3o executados. Existem duas formas aceit\u00e1veis de execu\u00e7\u00e3o: executar todos os testes unit\u00e1rios de um pacote espec\u00edfico ou executar um teste unit\u00e1rio espec\u00edfico em um pacote espec\u00edfico.<\/p>\n<p><img decoding=\"async\" alt=\"Testes unit\u00e1rios em SGBD \u2014 como fazemos isso na Sportmaster, parte um\" src=\"\/wp-content\/uploads\/2019\/08\/46628b60eb0fe0d20df822ddca914947.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqui est\u00e1 um exemplo do sistema interno de relat\u00f3rios. Com base nos resultados do teste unit\u00e1rio, o utPLSQL gera um pequeno relat\u00f3rio. Nele, vemos o resultado de cada verifica\u00e7\u00e3o espec\u00edfica e o resultado geral da execu\u00e7\u00e3o do teste unit\u00e1rio. <\/p>\n<h2>6 regras dos testes automatizados<\/h2>\n<p>\nAntes de come\u00e7ar a criar um novo sistema de testes automatizados para o sistema de fidelidade, em conjunto com a dire\u00e7\u00e3o, definimos os princ\u00edpios que nossos futuros testes automatizados devem seguir.<\/p>\n<p><img decoding=\"async\" alt=\"Testes unit\u00e1rios em SGBD \u2014 como fazemos isso na Sportmaster, parte um\" src=\"\/wp-content\/uploads\/2019\/08\/84be59663203abb373e7074b9a6cd4e4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>Os testes automatizados devem ser eficazes e trazer benef\u00edcios. Temos desenvolvedores incr\u00edveis, sobre os quais vale a pena falar, j\u00e1 que alguns deles certamente ver\u00e3o este relat\u00f3rio e est\u00e3o escrevendo um c\u00f3digo excepcional. Mas mesmo o c\u00f3digo incr\u00edvel deles n\u00e3o \u00e9 perfeito e continha, cont\u00e9m e conter\u00e1 erros. Os testes automatizados precisam encontrar esses erros. Se n\u00e3o o fizerem, ou estamos escrevendo testes automatizados ruins, ou chegamos a uma \u00e1rea estagnada que, em princ\u00edpio, n\u00e3o est\u00e1 sendo desenvolvida. Em ambos os casos, estamos fazendo algo errado e nossa abordagem \u00e9 simplesmente sem sentido.<\/li>\n<li>Os testes automatizados devem ser utilizados. \u00c9 sem sentido gastar muito tempo e esfor\u00e7o escrevendo um produto de software, organizando seu reposit\u00f3rio e depois esquecendo dele. Os testes devem ser executados e devem ser executados com a maior regularidade poss\u00edvel.<\/li>\n<li>Os testes automatizados devem funcionar de forma est\u00e1vel. Independentemente da hora do dia, do ambiente de execu\u00e7\u00e3o e de outras configura\u00e7\u00f5es do sistema, as execu\u00e7\u00f5es dos testes devem levar aos mesmos resultados. Geralmente, isso \u00e9 garantido pelo fato de que os testes automatizados trabalham com dados de teste especiais com configura\u00e7\u00f5es do sistema fixas.<\/li>\n<li>Os testes automatizados devem operar a uma velocidade aceit\u00e1vel para o seu projeto. Esse tempo \u00e9 definido individualmente para cada sistema. Algu\u00e9m pode se dar ao luxo de trabalhar o dia todo, enquanto para outro pode ser cr\u00edtico concluir em segundos. Que normas de velocidade alcan\u00e7amos em nosso projeto, contarei mais adiante.<\/li>\n<li>O desenvolvimento de testes automatizados deve ser flex\u00edvel. N\u00e3o \u00e9 desej\u00e1vel renunciar \u00e0 verifica\u00e7\u00e3o de qualquer funcionalidade simplesmente porque ainda n\u00e3o fizemos isso ou por outras cren\u00e7as. O utPLSQL n\u00e3o imp\u00f5e restri\u00e7\u00f5es ao desenvolvimento, e a Oracle, em princ\u00edpio, permite implementar as mais diversas coisas. A maioria das tarefas tem solu\u00e7\u00e3o; a quest\u00e3o \u00e9 apenas de tempo e esfor\u00e7o investido.<\/li>\n<li>Desdobrabilidade. Temos v\u00e1rios ambientes onde os testes precisam ser executados. Em cada um desses ambientes, o dump de dados pode ser atualizado a qualquer momento. \u00c9 necess\u00e1rio gerenciar o projeto de testes automatizados de forma que possamos realizar sua instala\u00e7\u00e3o total ou parcial sem problemas.<\/li>\n<\/ol>\n<p>E no segundo post em alguns dias, contarei o que fizemos e quais resultados alcan\u00e7amos.<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.3 - 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\/pt\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Testes de unidade em SGBD \u2014 como fazemos isso na Sportmaster, parte um | ProHoster","description":"Ol\u00e1, Habr! Meu nome \u00e9 Maxim Ponomarenko e sou desenvolvedor na Sportmaster. Tenho 10 anos de experi\u00eancia na \u00e1rea de TI. Comecei minha carreira em testes manuais e depois fiz a transi\u00e7\u00e3o para o desenvolvimento de bancos de dados.","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/37495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=37495"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/37495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/28136"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=37495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=37495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=37495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}