{"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\/es\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","title":{"rendered":"Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00a1Hola, Habr!<\/p>\n<p>Me llamo Maxim Ponomarenko y soy desarrollador en Sportmaster. Tengo 10 a\u00f1os de experiencia en el sector de TI. Comenc\u00e9 mi carrera en el \u00e1rea de pruebas manuales y luego me cambi\u00e9 al desarrollo de bases de datos. En los \u00faltimos 4 a\u00f1os, acumulando conocimientos adquiridos en pruebas y desarrollo, me dedico a la automatizaci\u00f3n de pruebas a nivel de base de datos.<\/p>\n<p>He estado en el equipo de Sportmaster un poco m\u00e1s de un a\u00f1o y en uno de los grandes proyectos estoy trabajando en el desarrollo de pruebas automatizadas. En abril, mis compa\u00f1eros de Sportmaster Lab y yo presentamos en una conferencia en Krasnodar, mi charla se titulaba \u00abPruebas unitarias en bases de datos\u00bb, y ahora quiero compartirla con ustedes. Habr\u00e1 mucho texto, por lo que he decidido dividir la presentaci\u00f3n en dos publicaciones. En la primera hablaremos sobre las pruebas autom\u00e1ticas y las pruebas en general, y en la segunda me detendr\u00e9 m\u00e1s en nuestro sistema de pruebas unitarias y los resultados de su aplicaci\u00f3n.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\"><img decoding=\"async\" alt=\"Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Primero, un poco de teor\u00eda aburrida. \u00bfQu\u00e9 es la prueba autom\u00e1tica? Es una prueba que se realiza mediante herramientas program\u00e1ticas, y en la TI moderna se utiliza cada vez m\u00e1s en el desarrollo de software. Esto se debe a que las empresas crecen, sus sistemas de informaci\u00f3n crecen y, por lo tanto, tambi\u00e9n aumenta la cantidad de funcionalidad que necesita ser probada. Realizar pruebas manuales se vuelve cada vez m\u00e1s costoso.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nTrabaj\u00e9 en una gran compa\u00f1\u00eda cuyos lanzamientos se realizan cada dos meses. Al mismo tiempo, se dedicaba un mes entero para que un equipo de diez probadores verificara manualmente la funcionalidad. Gracias a la implementaci\u00f3n de la automatizaci\u00f3n, un peque\u00f1o equipo de desarrolladores logr\u00f3 reducir el tiempo de prueba a 2 semanas en un a\u00f1o y medio. No solo aumentamos la velocidad de las pruebas, sino que tambi\u00e9n mejoramos su calidad. Las pruebas autom\u00e1ticas se ejecutan regularmente y siempre realizan todo el curso de verificaciones programadas, lo que significa que eliminamos el factor humano. <\/p>\n<p>En la TI moderna es caracter\u00edstico que se requiera del desarrollador no solo escribir el c\u00f3digo del producto, sino tambi\u00e9n escribir pruebas unitarias que verifiquen dicho c\u00f3digo. <\/p>\n<p>\u00bfPero qu\u00e9 hacer si su sistema se basa principalmente en la l\u00f3gica del servidor? No existe una soluci\u00f3n universal ni mejores pr\u00e1cticas en el mercado. Por lo general, las empresas abordan este problema creando su propio sistema de pruebas personalizado. Aqu\u00ed hay un sistema automatizado de pruebas personalizado que se cre\u00f3 en nuestro proyecto y del cual hablar\u00e9 en mi presentaci\u00f3n. <\/p>\n<p><img decoding=\"async\" alt=\"Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno\" src=\"\/wp-content\/uploads\/2019\/08\/fee34f7214fb2075ee50fa0f4af14a44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Probando la lealtad<\/h2>\n<p>\nPrimero hablemos del proyecto donde implementamos el sistema de pruebas automatizado. Nuestro proyecto es el sistema de lealtad de Sportmaster (por cierto, ya hemos escrito sobre \u00e9l en <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/453252\/\">esta publicaci\u00f3n<\/a><\/noindex>).<\/p>\n<p>Si su empresa es lo suficientemente grande, su sistema de lealtad tendr\u00e1 tres propiedades est\u00e1ndar: <\/p>\n<ul>\n<li>Su sistema ser\u00e1 de alta carga<\/li>\n<li>Su sistema contendr\u00e1 procesos computacionales complejos<\/li>\n<li>Su sistema ser\u00e1 sometido a mejoras de manera activa. <\/li>\n<\/ul>\n<p>\nVamos por partes... En total, si consideramos todas las marcas de Sportmaster, tenemos m\u00e1s de 1000 tiendas en Rusia, Ucrania, China, Kazajist\u00e1n y Bielorrusia. En estas tiendas, se realizan alrededor de 300,000 compras diariamente. Es decir, cada segundo llegan a nuestro sistema de 3 a 4 tickets. Naturalmente, nuestro sistema de lealtad est\u00e1 sometido a alta carga. Y debido a que se utiliza de manera activa, debemos proporcionar los m\u00e1s altos est\u00e1ndares de calidad, ya que cualquier error en el software conlleva grandes p\u00e9rdidas financieras, de reputaci\u00f3n y otros. <\/p>\n<p>Al mismo tiempo, en Sportmaster se llevan a cabo m\u00e1s de cien promociones diferentes. Las promociones son muy diversas: hay promociones de productos, otras relacionadas con d\u00edas espec\u00edficos de la semana, algunas atadas a tiendas espec\u00edficas, otras basadas en el monto de la compra y otras por la cantidad de productos. En resumen, es bastante complejo. Los clientes tienen bonificaciones, hay c\u00f3digos promocionales que se utilizan al comprar. Todo esto hace que el c\u00e1lculo de cualquier pedido sea una tarea bastante no trivial. <\/p>\n<p>El algoritmo que implementa el procesamiento de pedidos es realmente horrible y complejo. Cualquier cambio en este algoritmo es bastante arriesgado. Aparentemente, los cambios que parecen insignificantes pueden llevar a efectos bastante impredecibles. Y, de hecho, esos procesos computacionales complejos, especialmente aquellos que implementan funcionalidades cr\u00edticas, son los mejores candidatos para la automatizaci\u00f3n. Verificar manualmente decenas de casos similares resulta muy costoso en tiempo. Y puesto que el punto de entrada al proceso permanece inalterado, al describirlo una vez, podemos r\u00e1pidamente generar pruebas autom\u00e1ticas y estar seguros del funcionamiento de la funcionalidad.<\/p>\n<p>Dado que nuestra sistema es utilizado activamente, el negocio querr\u00e1 algo nuevo de su parte, mantenerse al d\u00eda y ser orientado al cliente. En nuestro sistema de lealtad, los lanzamientos ocurren cada dos meses. Esto significa que cada dos meses necesitamos realizar una regresi\u00f3n completa de todo el sistema. Adem\u00e1s, como en cualquier IT moderna, el desarrollo no llega directamente del desarrollador a producci\u00f3n. Se origina en el entorno del desarrollador, luego pasa secuencialmente por el entorno de pruebas, el de lanzamiento, el de aceptaci\u00f3n y solo luego llega a producci\u00f3n. Al menos en los entornos de prueba y de lanzamiento necesitamos realizar una regresi\u00f3n completa de todo el sistema. <\/p>\n<p>Las propiedades descritas son est\u00e1ndar para pr\u00e1cticamente cualquier sistema de lealtad. Hablemos de las particularidades de nuestro proyecto.<\/p>\n<p>Tecnol\u00f3gicamente, el 90% de la l\u00f3gica de nuestro sistema de lealtad es del lado del servidor y est\u00e1 implementada en Oracle. Hay un cliente desarrollado en Delphi que funciona como APM-administrador. Existen servicios web para aplicaciones externas (por ejemplo, el sitio web). Por lo tanto, es bastante l\u00f3gico que si vamos a implementar un sistema de pruebas automatizadas, lo hagamos en Oracle.<\/p>\n<p>El sistema de lealtad de Sportmaster ha estado en funcionamiento durante m\u00e1s de 7 a\u00f1os y fue creado por desarrolladores individuales... El n\u00famero promedio de desarrolladores en nuestro proyecto durante estos 7 a\u00f1os ha sido de 3-4 personas. Sin embargo, en el \u00faltimo a\u00f1o, nuestro equipo ha crecido considerablemente y ahora est\u00e1n trabajando 10 personas en el proyecto. Esto significa que hay personas que se unen al proyecto sin estar familiarizadas con las tareas, procesos y arquitectura t\u00edpicos. Existe un riesgo elevado de que podamos pasar por alto errores.<\/p>\n<p>El proyecto se caracteriza por la ausencia de testers dedicados como personal fijo. Sin duda, existe la prueba, pero los analistas se encargan de ella, adem\u00e1s de sus otras responsabilidades principales: interactuar con los clientes de negocios, usuarios, procesar los requisitos del sistema, etc. A pesar de que las pruebas se realizan con gran calidad (esto es especialmente relevante mencionarlo, ya que uno de los analistas podr\u00eda ver este informe), la efectividad de la especializaci\u00f3n y concentraci\u00f3n en una sola tarea no se puede obviar.<\/p>\n<p>Teniendo en cuenta lo anterior, para mejorar la calidad del producto entregado y reducir los plazos de desarrollo, la idea de automatizar las pruebas en el proyecto parece bastante l\u00f3gica. En diferentes etapas de existencia del sistema de lealtad, algunos desarrolladores han puesto esfuerzos para cubrir su c\u00f3digo con pruebas unitarias. En general, fue un proceso bastante fragmentado, donde cada uno utilizaba su arquitectura y m\u00e9todos. Los resultados finales eran comunes para las pruebas unitarias: se desarrollaban pruebas, se utilizaban por un tiempo, se almacenaban en un repositorio de versiones, pero en alg\u00fan momento dejaban de ejecutarse y se olvidaban. En primer lugar, esto suced\u00eda porque las pruebas estaban m\u00e1s ligadas a un ejecutor espec\u00edfico que al proyecto.<\/p>\n<h2>Aqu\u00ed entra utPLSQL<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno\" src=\"\/wp-content\/uploads\/2019\/08\/f21dfcb085aace687566dc51cb9b5613.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00bfSabes algo sobre Steven Feuerstein? <\/p>\n<p>Este es un tipo inteligente que ha dedicado gran parte de su carrera a trabajar con Oracle y PL\/SQL, y ha escrito una cantidad bastante considerable de trabajos sobre este tema. Uno de sus libros m\u00e1s conocidos se llama: \u00abOracle PL\/SQL. Para Profesionales\u00bb. Steven es el creador de la soluci\u00f3n utPLSQL, que significa Unit Testing framework for Oracle PL\/SQL. La soluci\u00f3n utPLSQL fue creada en 2016, pero se sigue trabajando activamente en ella y se est\u00e1n lanzando nuevas versiones. En el momento de la presentaci\u00f3n, la \u00faltima versi\u00f3n data del 24 de marzo de 2019.<br \/>\n\u00bfQu\u00e9 es esto? Es un proyecto de c\u00f3digo abierto independiente. Ocupa un par de megabytes, incluidos ejemplos y documentaci\u00f3n. Representa f\u00edsicamente un esquema independiente en la base de datos ORACLE con un conjunto de paquetes y tablas para organizar pruebas unitarias. La instalaci\u00f3n toma apenas unos segundos. Una caracter\u00edstica distintiva de utPLSQL es su simplicidad de uso. <br \/>\nEn t\u00e9rminos generales, utPLSQL es un mecanismo para ejecutar pruebas unitarias, donde una prueba unitaria se entiende como procedimientos de paquete Oracle est\u00e1ndar, cuya organizaci\u00f3n cumple con ciertas normas. Adem\u00e1s de ejecutar las pruebas en utPLSQL, se almacena un registro de todas tus ejecuciones de prueba, as\u00ed como un sistema interno de informes.<\/p>\n<p>Veamos un ejemplo de c\u00f3mo se ve el c\u00f3digo de una prueba unitaria implementada seg\u00fan esta metodolog\u00eda.<\/p>\n<p><img decoding=\"async\" alt=\"Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs\u00ed que en la pantalla se muestra el c\u00f3digo de una especificaci\u00f3n t\u00edpica del paquete con pruebas unitarias. \u00bfCu\u00e1les son los requisitos obligatorios? El paquete debe tener el prefijo \u00abutp_\u00bb. Del mismo modo, todas las funciones de prueba deben tener este prefijo. En el paquete deben existir obligatoriamente dos procedimientos est\u00e1ndar: \u00abutp_setup\u00bb y \u00abutp_teardown\u00bb. El primer procedimiento se llama al reiniciar cada prueba unitaria, mientras que el segundo se ejecuta al finalizar.<\/p>\n<p>\u00abutp_setup\u00bb prepara por lo general nuestro sistema para ejecutar la prueba unitaria, por ejemplo, creando datos de prueba. \u00abutp_teardown\u00bb \u2014por el contrario\u2014 devuelve todo a la configuraci\u00f3n original y restablece los resultados de la ejecuci\u00f3n.<\/p>\n<p>Este es un ejemplo de la unidad de prueba m\u00e1s simple, que verifica la normalizaci\u00f3n del n\u00famero de tel\u00e9fono ingresado por el cliente al formato est\u00e1ndar de nuestro sistema de lealtad. No hay est\u00e1ndares obligatorios sobre c\u00f3mo escribir procedimientos con pruebas unitarias. Por lo general, se llama a alg\u00fan m\u00e9todo del sistema que se est\u00e1 probando y el resultado devuelto por este m\u00e9todo se compara con el est\u00e1ndar. Es importante que la comparaci\u00f3n entre el resultado est\u00e1ndar y el obtenido se realice a trav\u00e9s de los m\u00e9todos est\u00e1ndar de utPLSQL.<\/p>\n<p>En una prueba unitaria puede haber cualquier cantidad de verificaciones. Como se puede ver en el ejemplo, hacemos cuatro llamadas secuenciales al m\u00e9todo que estamos probando para normalizar el n\u00famero de tel\u00e9fono y despu\u00e9s de cada llamada evaluamos el resultado. Al desarrollar una prueba unitaria, hay que tener en cuenta que existen verificaciones que no afectan al sistema de ninguna manera, y despu\u00e9s de algunas es necesario volver al estado inicial del sistema. <br \/>\nPor ejemplo, en la prueba unitaria presentada simplemente estamos formateando el n\u00famero de tel\u00e9fono ingresado, lo que no afecta de ninguna manera al sistema de lealtad. <\/p>\n<p>Pero si estamos escribiendo pruebas unitarias para el m\u00e9todo de creaci\u00f3n de un nuevo cliente, despu\u00e9s de cada verificaci\u00f3n se crear\u00e1 un nuevo cliente en el sistema, lo que puede influir en la ejecuci\u00f3n posterior de la prueba.<\/p>\n<p><img decoding=\"async\" alt=\"Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs\u00ed es como se ejecutan las pruebas unitarias. Se permiten dos variantes de ejecuci\u00f3n: ejecutar todas las pruebas unitarias de un paquete espec\u00edfico o ejecutar una prueba unitaria espec\u00edfica en un paquete espec\u00edfico.<\/p>\n<p><img decoding=\"async\" alt=\"Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno\" src=\"\/wp-content\/uploads\/2019\/08\/46628b60eb0fe0d20df822ddca914947.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs\u00ed es como se ve un ejemplo del sistema de informes interno. A partir de los resultados del trabajo de la prueba unitaria, utPLSQL genera un peque\u00f1o informe. En \u00e9l vemos el resultado de cada verificaci\u00f3n espec\u00edfica y el resultado general de la ejecuci\u00f3n de la prueba unitaria. <\/p>\n<h2>6 reglas para pruebas autom\u00e1ticas<\/h2>\n<p>\nAntes de comenzar a crear un nuevo sistema de pruebas automatizadas para el sistema de lealtad, junto con la direcci\u00f3n definimos los principios a los que nuestras futuras pruebas autom\u00e1ticas deben adherirse.<\/p>\n<p><img decoding=\"async\" alt=\"Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno\" src=\"\/wp-content\/uploads\/2019\/08\/84be59663203abb373e7074b9a6cd4e4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>Las pruebas autom\u00e1ticas deben ser efectivas y deben ser \u00fatiles. Tenemos desarrolladores maravillosos, de los cuales definitivamente hay que hablar, ya que alguno de ellos seguramente ver\u00e1 este informe, y ellos escriben un c\u00f3digo excelente. Pero incluso su excelente c\u00f3digo no es perfecto y conten\u00eda, contiene y contendr\u00e1 errores. Las pruebas autom\u00e1ticas deben encontrar esos errores. Si no es as\u00ed, o estamos escribiendo pruebas autom\u00e1ticas deficientes, o hemos llegado a un \u00e1rea muerta que, en principio, no se est\u00e1 trabajando. En ambos casos, estamos haciendo algo mal y nuestro enfoque es simplemente sin sentido.<\/li>\n<li>Las pruebas autom\u00e1ticas deben ser utilizadas. No tiene sentido gastar una gran cantidad de tiempo y esfuerzo en escribir un producto de software, ensamblar su repositorio y olvidar sobre \u00e9l. Las pruebas deben ejecutarse, y ejecutarse con la mayor regularidad posible.<\/li>\n<li>Las pruebas autom\u00e1ticas deben funcionar de manera estable. Independientemente de la hora del d\u00eda, el entorno de ejecuci\u00f3n y otros ajustes del sistema, las ejecuciones de las pruebas deben dar siempre el mismo resultado. Generalmente, esto se garantiza porque las pruebas autom\u00e1ticas funcionan con datos de prueba especiales con configuraciones del sistema fijas.<\/li>\n<li>Las pruebas autom\u00e1ticas deben funcionar a una velocidad aceptable para su proyecto. Este tiempo se determina individualmente para cada sistema. Algunos pueden permitirse trabajar todo el d\u00eda, mientras que otros deben cumplir plazos en segundos. M\u00e1s adelante, comentar\u00e9 qu\u00e9 est\u00e1ndares de velocidad hemos alcanzado en nuestro proyecto.<\/li>\n<li>El desarrollo de pruebas autom\u00e1ticas debe ser flexible. No es deseable renunciar a verificar alguna funcionalidad simplemente porque nunca lo hemos hecho as\u00ed o por otras convicciones. utPLSQL no impone ninguna restricci\u00f3n en el desarrollo, mientras que Oracle, en principio, permite implementar una variedad de cosas. La mayor\u00eda de las tareas tiene soluci\u00f3n; la cuesti\u00f3n es el tiempo y el esfuerzo invertido.<\/li>\n<li>Despliegue. Tenemos varios entornos donde es necesario ejecutar las pruebas. En cualquier momento, se puede actualizar un volcado de datos en cada uno de los entornos. Hay que gestionar el proyecto con pruebas autom\u00e1ticas de tal manera que se pueda realizar su instalaci\u00f3n completa o parcial sin problemas.<\/li>\n<\/ol>\n<p>Y en la segunda publicaci\u00f3n en un par de d\u00edas, contar\u00e9 lo que hemos hecho y qu\u00e9 resultados hemos logrado.<br \/>\n<br \/>Fuente: <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.2 - 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\/es\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Pruebas unitarias en bases de datos \u2014 c\u00f3mo lo hacemos en Sportmaster, parte uno | ProHoster","description":"\u00a1Hola, Habr! Me llamo Maxim Ponomarenko y soy desarrollador en Sportmaster. Tengo 10 a\u00f1os de experiencia en el sector IT. Comenc\u00e9 mi carrera en el \u00e1rea de pruebas manuales, luego me pas\u00e9 al desarrollo de bases de datos.","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/37495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=37495"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/37495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/28136"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=37495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=37495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=37495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}