{"id":54167,"date":"2019-12-19T00:00:00","date_gmt":"2019-12-18T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/testmace-bystryj-start"},"modified":"2020-02-18T14:02:08","modified_gmt":"2020-02-18T11:02:08","slug":"testmace-bystryj-start","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/news\/testmace-bystryj-start","title":{"rendered":"TestMace. Inicio r\u00e1pido","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"TestMace. Inicio r\u00e1pido\" src=\"\/wp-content\/uploads\/2019\/12\/ca19545f1cc06814a69a6a3e6d9f3a5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hola a todos. Poco a poco estamos saliendo de las sombras y continuamos con nuestra serie de art\u00edculos sobre nuestro producto. Despu\u00e9s de <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/458372\/\">la anterior<\/a><\/noindex> el art\u00edculo de presentaci\u00f3n, recibimos numerosos comentarios (en su mayor\u00eda positivos), sugerencias e informes de errores. Hoy mostraremos <noindex><a rel=\"nofollow\" href=\"https:\/\/client.testmace.com\">TestMace<\/a><\/noindex> en acci\u00f3n y ustedes podr\u00e1n apreciar algunas caracter\u00edsticas de nuestra aplicaci\u00f3n. Para una inmersi\u00f3n m\u00e1s completa, recomiendo consultar nuestra documentaci\u00f3n en <noindex><a rel=\"nofollow\" href=\"http:\/\/docs-ru.testmace.com\">http:\/\/docs-ru.testmace.com<\/a><\/noindex>. \u00a1Vamos all\u00e1! <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"ustanovka\">Instalaci\u00f3n<\/h1>\n<p><\/p>\n<p>Comencemos con lo b\u00e1sico. La aplicaci\u00f3n est\u00e1 disponible y realmente se puede probar en tres plataformas: Linux, Windows, MacOS. Puedes descargar el instalador para el sistema operativo que te interese desde <noindex><a rel=\"nofollow\" href=\"https:\/\/client.testmace.com\">nuestro sitio web<\/a><\/noindex>. Para los usuarios de Linux, hay una opci\u00f3n de instalaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/snapcraft.io\/testmace\">del paquete snap<\/a><\/noindex>. Esperamos que pronto tengamos una versi\u00f3n en Microsoft Store y App Store (\u00bfes necesario? \u00bfQu\u00e9 opinas?).<\/p>\n<p><\/p>\n<h1 id=\"podopytnyy-scenariy\">Escenario de prueba<\/h1>\n<p><\/p>\n<p>Elegimos el siguiente escenario est\u00e1ndar como prueba:<\/p>\n<p><\/p>\n<ul>\n<li>inicia sesi\u00f3n: usuario \u2014 admin, contrase\u00f1a \u2014 password<\/li>\n<li>agregaremos un nuevo registro<\/li>\n<li>verificaremos la correcta adici\u00f3n del registro<\/li>\n<\/ul>\n<p><\/p>\n<p>Realizaremos las pruebas en <noindex><a rel=\"nofollow\" href=\"https:\/\/testmace-quick-start.herokuapp.com\/\">https:\/\/testmace-quick-start.herokuapp.com\/<\/a><\/noindex>. Este es un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/typicode\/json-server\">json-server<\/a><\/noindex>, perfecto para probar este tipo de aplicaciones. Solo hemos agregado autorizaci\u00f3n por token a todas las rutas del json-server y hemos creado el m\u00e9todo de inicio de sesi\u00f3n para obtener dicho token. Avanzaremos de manera met\u00f3dica, mejorando nuestro proyecto gradualmente.<\/p>\n<p><\/p>\n<h2 id=\"sozdanie-proekta-i-popytka-sozdat-suschnost-bez-avtorizacii\">Creaci\u00f3n del proyecto e intento de crear una entidad sin autorizaci\u00f3n<\/h2>\n<p><\/p>\n<p>Primero crearemos un nuevo proyecto (<strong>Archivo<\/strong>-&gt;<strong>Nuevo proyecto<\/strong>). Si est\u00e1s ejecutando la aplicaci\u00f3n por primera vez, el nuevo proyecto se abrir\u00e1 autom\u00e1ticamente. Para comenzar, intentemos hacer una solicitud para crear un nuevo registro (quiz\u00e1s la creaci\u00f3n de registros est\u00e9 disponible sin autorizaci\u00f3n). Selecciona en el men\u00fa contextual del nodo Project las opciones <strong>Agregar nodo<\/strong> -&gt; <strong>RequestStep<\/strong>. Como nombre del nodo, estableceremos <strong>crear-publicaci\u00f3n<\/strong>. Esto resultar\u00e1 en un nuevo nodo creado en el \u00e1rbol y se abrir\u00e1 la pesta\u00f1a de este nodo. Estableceremos los siguientes par\u00e1metros de solicitud:<\/p>\n<p><\/p>\n<ul>\n<li>Tipo de solicitud: POST<\/li>\n<li>url: <noindex><a rel=\"nofollow\" href=\"https:\/\/testmace-quick-start.herokuapp.com\/posts\">https:\/\/testmace-quick-start.herokuapp.com\/posts<\/a><\/noindex><\/li>\n<li>Cuerpo de la solicitud: json con el valor <code>{\"title\": \"Nueva publicaci\u00f3n de inicio r\u00e1pido testmace\"}<\/code><br \/>\nSi lo has hecho todo correctamente, la interfaz deber\u00eda verse de la siguiente manera:<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Inicio r\u00e1pido\" src=\"\/wp-content\/uploads\/2019\/12\/a5c81dc4977dd73a4975643bf8ced3da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sin embargo, si intentamos realizar la solicitud, el servidor devolver\u00e1 el c\u00f3digo 401 y sin autorizaci\u00f3n no tendremos acceso a nada en este servidor. Bueno, es algo predecible).<\/p>\n<p><\/p>\n<h2 id=\"dobavlyaem-zapros-na-avtorizaciyu\">Agregamos la solicitud de autorizaci\u00f3n<\/h2>\n<p><\/p>\n<p>Como se mencion\u00f3 anteriormente, tenemos un endpoint POST <code>\/login<\/code>, que acepta como cuerpo de solicitud un json de este tipo: <code>{\"username\": \"\", \"password\": \"\"}<\/code>, donde <code>username<\/code> y <code>password<\/code> (de nuevo, de la introducci\u00f3n anterior) tienen valores <code>admin<\/code> y <code>password<\/code> correspondientemente. En respuesta, este endpoint devuelve un json del tipo <code>{\"token\": \"\"}<\/code>. Lo utilizaremos para la autorizaci\u00f3n. Crearemos <strong>RequestStep<\/strong> un nodo llamado <strong>login<\/strong>, con como predecesor <strong>Proyecto<\/strong> el nodo. Con la funci\u00f3n de arrastrar y soltar, mueve este nodo en el \u00e1rbol por encima del nodo <strong>crear-publicaci\u00f3n<\/strong>. Asignaremos los siguientes par\u00e1metros a la nueva solicitud:<\/p>\n<p><\/p>\n<ul>\n<li>Tipo de solicitud: POST<\/li>\n<li>url: <noindex><a rel=\"nofollow\" href=\"https:\/\/testmace-quick-start.herokuapp.com\/login\">https:\/\/testmace-quick-start.herokuapp.com\/login<\/a><\/noindex><\/li>\n<li>Cuerpo de la solicitud: json con el valor <code>{\"username\": \"admin\", \"password\": \"password\"}<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Ejecutamos la solicitud y recibimos un c\u00f3digo doscientos con el token en la respuesta. Algo as\u00ed:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Inicio r\u00e1pido\" src=\"\/wp-content\/uploads\/2019\/12\/222b2a0b965b4c1135b5b62c0b7424ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"refaktoring-ubiraem-dublirovanie-domena\">Refactorizaci\u00f3n: eliminamos la duplicaci\u00f3n del dominio<\/h2>\n<p><\/p>\n<p>Por ahora, las solicitudes no est\u00e1n conectadas en un \u00fanico escenario. Pero este no es el \u00fanico inconveniente. Si lo miramos de cerca, podemos notar que al menos el dominio se repite en ambas solicitudes. No es lo ideal. Es hora de refactorizar esta parte del futuro escenario y para ello nos ayudar\u00e1n las variables.<\/p>\n<p><\/p>\n<p>En un primer acercamiento, las variables cumplen el mismo papel que en otras herramientas y lenguajes de programaci\u00f3n similares: eliminar la duplicaci\u00f3n, aumentar la legibilidad, etc. Para m\u00e1s informaci\u00f3n sobre las variables, puedes leer en <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/user-variables\">nuestra documentaci\u00f3n<\/a><\/noindex>. En este caso necesitaremos variables de usuario. <\/p>\n<p><\/p>\n<p>Definimos a nivel de Proyecto la variable del nodo <code>dominio<\/code> con el valor <code>https:\/\/testmace-quick-start.herokuapp.com<\/code>. Para esto es necesario<\/p>\n<p><\/p>\n<ul>\n<li>Abrir la pesta\u00f1a con este nodo y hacer clic en el \u00edcono de calculadora en la parte superior derecha<\/li>\n<li>Hacer clic en <strong>+ A\u00d1ADIR VARIABLE<\/strong><\/li>\n<li>Ingresar el nombre y el valor de la variable<br \/>\nEn nuestro caso, el di\u00e1logo con la variable a\u00f1adida se ver\u00e1 de la siguiente manera:<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Inicio r\u00e1pido\" src=\"\/wp-content\/uploads\/2019\/12\/071ac6dca2c5a49b78b11719fae5f650.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OK. Ahora gracias a la herencia podemos usar esta variable en descendientes de cualquier nivel de profundidad. En nuestro caso, estos son los nodos <strong>login<\/strong> y <strong>crear-publicaci\u00f3n<\/strong>. Para usar la variable en el campo de texto, es necesario escribir <code>${}<\/code>. Por ejemplo, la url para iniciar sesi\u00f3n se transforma en <code>${domain}\/login<\/code>, y para <strong>crear-publicaci\u00f3n<\/strong> el nodo, la url se ver\u00e1 como <code>${domain}\/posts<\/code>.<\/p>\n<p><\/p>\n<p>As\u00ed, siguiendo el principio DRY, hemos mejorado un poco el escenario.<\/p>\n<p><\/p>\n<h2 id=\"sohranyaem-token-v-peremennuyu\">Guardamos el token en una variable<\/h2>\n<p><\/p>\n<p>Ya que hemos tocado el tema de las variables, ampliemos un poco este concepto. En este momento, en caso de un inicio de sesi\u00f3n exitoso, recibimos del servidor un token de autorizaci\u00f3n que necesitaremos en las solicitudes posteriores. Guardemos este token en una variable. Dado que el valor de la variable se definir\u00e1 durante la ejecuci\u00f3n del escenario, utilizamos para ello un mecanismo especial \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/user-variables\/dynamic-variables\">variables din\u00e1micas<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Para empezar, realizaremos una solicitud de inicio de sesi\u00f3n. En la pesta\u00f1a <strong>Analizado<\/strong> Para ver la respuesta, pasa el cursor sobre el token y en el men\u00fa contextual (que se activa haciendo clic derecho o pulsando el bot\u00f3n &#8230;) selecciona la opci\u00f3n <strong>Asignar a variable<\/strong>. Aparecer\u00e1 un cuadro de di\u00e1logo con los siguientes campos:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Path<\/strong> \u2014 qu\u00e9 fragmento de la respuesta se toma (en nuestro caso es <code>body.token<\/code>)<\/li>\n<li><strong>Valor actual<\/strong> \u2014 qu\u00e9 valor se encuentra en la ruta Path (en nuestro caso es el valor del token)<\/li>\n<li><strong>Nombre de la variable<\/strong> \u2014 el nombre de la variable en la que <strong>Valor actual<\/strong> se guardar\u00e1. En nuestro caso ser\u00e1 <code>token<\/code><\/li>\n<li><strong>Nodo<\/strong> \u2014 en cu\u00e1l de los ancestros se crear\u00e1 la variable <strong>Nombre de la variable<\/strong>. Seleccionaremos Proyecto<\/li>\n<\/ul>\n<p><\/p>\n<p>El cuadro de di\u00e1logo completado se ve de la siguiente manera:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Inicio r\u00e1pido\" src=\"\/wp-content\/uploads\/2019\/12\/f524934dd1a4cb238afb6666135b360b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahora, cada vez que se ejecute el nodo <strong>login<\/strong> la variable din\u00e1mica <code>token<\/code> se actualizar\u00e1 con el nuevo valor de la respuesta. Y esta variable se almacenar\u00e1 en <strong>Proyecto<\/strong> el nodo y, gracias a la herencia, estar\u00e1 disponible para los descendientes.<\/p>\n<p><\/p>\n<p>Para acceder a las variables din\u00e1micas, es necesario usar <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/variables\">la variable incorporada<\/a><\/noindex> <code>$dynamicVar<\/code>. Por ejemplo, para acceder al token guardado, se debe llamar a <code>${$dynamicVar.token}<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"prokidyvaem-avtorizacionnyy-token-v-zaprosy\">Transmitimos el token de autorizaci\u00f3n en las solicitudes<\/h2>\n<p><\/p>\n<p>En los pasos anteriores, obtuvimos el token de autorizaci\u00f3n y todo lo que tenemos que hacer es agregar el encabezado <code>Authorization.<\/code> con el valor <code>Bearer<\/code> en todas las solicitudes que requieran autorizaci\u00f3n, incluidas las que <strong>crear-publicaci\u00f3n<\/strong>. Para esto hay varias formas:<\/p>\n<p><\/p>\n<ol>\n<li>Copia manualmente el token y a\u00f1ade el encabezado de autorizaci\u00f3n a las solicitudes que necesites. Este m\u00e9todo funciona, pero su aplicaci\u00f3n se limita solo a solicitudes del tipo &#171;hice y desech\u00e9&#187;. No es adecuado para la ejecuci\u00f3n repetida de scripts.<\/li>\n<li>Utilizar la funcionalidad de <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/work-with\/authorization\">autorizaci\u00f3n<\/a><\/noindex>.<\/li>\n<li>Usar <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/other\/default-http-headers\">encabezados por defecto<\/a><\/noindex><\/li>\n<\/ol>\n<p><\/p>\n<p>El uso del segundo m\u00e9todo parece obvio, sin embargo, en el contexto de este art\u00edculo, este enfoque... no es interesante. Bueno, en realidad: el mecanismo de autorizaciones es m\u00e1s o menos familiar para usted de otras herramientas (aunque tengamos cosas como <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/work-with\/authorization#inherit-from-parent\">herencia de autorizaciones<\/a><\/noindex>) y probablemente no plantear\u00e1 preguntas. <\/p>\n<p><\/p>\n<p>\u00a1Lo que importa son los encabezados por defecto! En pocas palabras, los encabezados por defecto son encabezados HTTP heredados de los ancestros que se agregan autom\u00e1ticamente a la solicitud, a menos que se desactiven expl\u00edcitamente. Con esta funcionalidad, se puede, por ejemplo, implementar una autorizaci\u00f3n personalizada o simplemente evitar la duplicaci\u00f3n en los escenarios. Aplicaremos esta funcionalidad para transmitir el token en los encabezados.<\/p>\n<p><\/p>\n<p>Anteriormente, guardamos con anticipaci\u00f3n el token en una variable din\u00e1mica <code>$dynamicVar.token<\/code> a nivel del nodo del Proyecto. Lo que queda por hacer es lo siguiente:<\/p>\n<p><\/p>\n<ol>\n<li>Definir el encabezado predeterminado <code>Authorization.<\/code> con el valor <code>Bearer ${$dynamicVar.token}<\/code> a nivel del nodo del Proyecto. Para esto, en la interfaz del nodo del Proyecto, es necesario abrir el di\u00e1logo con los encabezados predeterminados (bot\u00f3n <strong>Headers<\/strong> en la esquina superior derecha) y agregar el encabezado correspondiente. El di\u00e1logo con los valores completados se ver\u00e1 de la siguiente manera:<br \/>\n<img decoding=\"async\" alt=\"TestMace. Inicio r\u00e1pido\" src=\"\/wp-content\/uploads\/2019\/12\/9abd888cbf96e53b633e8f0fd3389297.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Desactivar este encabezado de la solicitud de inicio de sesi\u00f3n. Es comprensible: en el momento del inicio de sesi\u00f3n a\u00fan no tenemos el token y con esta solicitud de hecho lo estableceremos. Por lo tanto, en la interfaz de la solicitud de inicio de sesi\u00f3n en la pesta\u00f1a <strong>Headers<\/strong> en el \u00e1rea <strong>Inherited<\/strong> desmarcaremos la opci\u00f3n del encabezado de Autorizaci\u00f3n. <\/li>\n<\/ol>\n<p><\/p>\n<p>Eso es todo. Ahora el encabezado de autorizaci\u00f3n se a\u00f1adir\u00e1 a todas las solicitudes que sean descendientes del nodo del Proyecto, excepto del nodo de inicio de sesi\u00f3n. As\u00ed que, en esta etapa, ya tenemos el escenario listo y solo queda ejecutarlo. Para ejecutar el escenario, se puede elegir la opci\u00f3n <strong>Ejecutar<\/strong> en el men\u00fa contextual del nodo del Proyecto. <\/p>\n<p><\/p>\n<h2 id=\"proveryaem-korrektnost-sozdaniya-posta\">Verificamos la correcta creaci\u00f3n de la publicaci\u00f3n<\/h2>\n<p><\/p>\n<p>En esta etapa, nuestro escenario puede iniciar sesi\u00f3n y, utilizando el token de autorizaci\u00f3n, crear una publicaci\u00f3n. Sin embargo, necesitamos asegurarnos de que la nueva publicaci\u00f3n tenga el nombre correcto. Es decir, en esencia, queda hacer lo siguiente:<\/p>\n<p><\/p>\n<ul>\n<li>Enviar una solicitud para obtener la publicaci\u00f3n por id, <\/li>\n<li>Verificar que el nombre recibido del servidor coincide con el nombre proporcionado al crear la publicaci\u00f3n<\/li>\n<\/ul>\n<p><\/p>\n<p>Veamos el primer paso. Dado que el valor de id se determina durante la ejecuci\u00f3n del script, es necesario crear una variable din\u00e1mica (llam\u00e9mosla <code>postId<\/code>) del nodo <strong>crear-publicaci\u00f3n<\/strong> a nivel del nodo del Proyecto. C\u00f3mo hacerlo ya lo sabemos, solo es necesario acceder a la secci\u00f3n <strong>Guardamos el token en una variable<\/strong>. Solo queda crear una solicitud para obtener la publicaci\u00f3n por este id. Para esto, crearemos un RequestStep <strong>get-post<\/strong> con los siguientes par\u00e1metros:<\/p>\n<p><\/p>\n<ul>\n<li>Tipo de solicitud: GET<\/li>\n<li>URL: ${domain}\/posts\/${$dynamicVar.postId}<\/li>\n<\/ul>\n<p><\/p>\n<p>Para realizar el segundo paso, necesitamos familiarizarnos con <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/node-types\/assertion\">Assertion<\/a><\/noindex> el nodo. El nodo Assertion es un nodo que permite escribir verificaciones sobre ciertas solicitudes. Cada nodo Assertion puede contener m\u00faltiples afirmaciones (verificaciones). Puede leer m\u00e1s sobre todos los tipos de assertions en nuestra <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/node-types\/assertion\">la documentaci\u00f3n<\/a><\/noindex>. Vamos a utilizar <code>Compare<\/code> assertion con el operador <code>equal<\/code>. Hay varias formas de crear assertions:<\/p>\n<p><\/p>\n<ol>\n<li>Lento. Crear manualmente un nodo de Afirmaci\u00f3n desde el men\u00fa contextual del nodo RequestStep. En el nodo de Afirmaci\u00f3n creado, agregar la afirmaci\u00f3n deseada y completar los campos.<\/li>\n<li>R\u00e1pido. Crear un nodo de Afirmaci\u00f3n junto con la afirmaci\u00f3n de la respuesta del nodo RequestStep usando el men\u00fa contextual.<\/li>\n<\/ol>\n<p><\/p>\n<p>Utilizaremos el segundo m\u00e9todo. As\u00ed es como se ver\u00e1 para nuestro caso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Inicio r\u00e1pido\" src=\"\/wp-content\/uploads\/2019\/12\/7f1d81669cb4c10db5f0afa3bf04eddf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para aquellos que no entendieron, aqu\u00ed est\u00e1 lo que sucede:<\/p>\n<p><\/p>\n<ol>\n<li>Hacer una solicitud en el nodo <strong>get-post<\/strong><\/li>\n<li>En la pesta\u00f1a <strong>Analizado<\/strong> en la respuesta, invocar el men\u00fa contextual y seleccionar <strong>Crear afirmaci\u00f3n<\/strong> -&gt; <strong>Compare<\/strong> -&gt; <strong>Igual<\/strong><\/li>\n<\/ol>\n<p><\/p>\n<p>\u00a1Felicidades, hemos creado nuestra primera prueba! Sencillo, \u00bfverdad? Ahora puedes ejecutar el guion completo y disfrutar del resultado. Solo queda refactorizar un poco y extraerlo <code>title<\/code> a una variable separada. Pero dejaremos eso como tarea para ustedes)<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Conclusi\u00f3n<\/h1>\n<p><\/p>\n<p>En esta gu\u00eda, hemos creado un guion completo y adem\u00e1s hemos revisado algunas caracter\u00edsticas de nuestro producto. Por supuesto, no hemos utilizado todas las funcionalidades, y en los pr\u00f3ximos art\u00edculos haremos un an\u00e1lisis detallado de las capacidades de TestMace. \u00a1Mantente atento a las actualizaciones!<\/p>\n<p><\/p>\n<p>P.S. Para aquellos que prefieren no reproducir todos los pasos, amablemente hemos grabado <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/TestMace\/testmace-quick-start-project\">principal<\/a><\/noindex> con el proyecto del art\u00edculo. Se puede abrir usando <strong>Archivo<\/strong> -&gt; <strong>Abrir proyecto<\/strong> y seleccionar la carpeta Proyecto.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/458964\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u041c\u044b \u043f\u043e\u0442\u0438\u0445\u043e\u043d\u044c\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0442\u0435\u043d\u0438 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043e\u0431\u0437\u043e\u0440\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0437\u044b\u0432\u043e\u0432 (\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445), \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 bug \u0440\u0435\u043f\u043e\u0440\u0442\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c TestMace \u0432 \u0434\u0435\u043b\u0435 \u0438 \u0432\u044b \u043f\u043e \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0443 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0438\u0448\u043a\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-54167","post","type-post","status-publish","format-standard","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\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\/news\/testmace-bystryj-start\" \/>\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\udd47TestMace. \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/news\/testmace-bystryj-start\" \/>\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-12-18T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:08+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\udd47TestMace. Inicio r\u00e1pido | ProHoster","description":"Hola a todos.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/news\/testmace-bystryj-start","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\udd47TestMace. \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/es\/blog\/news\/testmace-bystryj-start","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-12-18T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54167","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-24 10:17:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:10:34","updated":"2026-01-24 10:17: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\/54167","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=54167"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/54167\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=54167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=54167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=54167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}