{"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\/en\/blog\/news\/testmace-bystryj-start","title":{"rendered":"TestMace. Quick Start","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"TestMace. Quick Start\" src=\"\/wp-content\/uploads\/2019\/12\/ca19545f1cc06814a69a6a3e6d9f3a5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hello everyone. We are gradually stepping out of the shadows and continuing our series of articles about our product. After <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/458372\/\">the previous<\/a><\/noindex> the overview article, we received a lot of feedback (mostly positive), suggestions, and bug reports. Today we will show you <noindex><a rel=\"nofollow\" href=\"https:\/\/client.testmace.com\">TestMace<\/a><\/noindex> the application in action, allowing you to fully appreciate some features of our app. For a more complete immersion, I recommend checking our documentation at <noindex><a rel=\"nofollow\" href=\"http:\/\/docs-ru.testmace.com\">http:\/\/docs-ru.testmace.com<\/a><\/noindex>. So, let's go! <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"ustanovka\">Installation<\/h1>\n<p><\/p>\n<p>Let's start with the basics. The application is available and can be tested on three platforms \u2014 Linux, Windows, and MacOS. You can download the installer for your desired OS from <noindex><a rel=\"nofollow\" href=\"https:\/\/client.testmace.com\">our website<\/a><\/noindex>. For Linux users, there is an option to install <noindex><a rel=\"nofollow\" href=\"https:\/\/snapcraft.io\/testmace\">the snap package<\/a><\/noindex>. We hope to soon add it to the Microsoft Store and App Store (but do we really need that? What do you think?).<\/p>\n<p><\/p>\n<h1 id=\"podopytnyy-scenariy\">Test Scenario<\/h1>\n<p><\/p>\n<p>As a test case, we have chosen the following standard scenario:<\/p>\n<p><\/p>\n<ul>\n<li>let's log in: user \u2014 admin, password \u2014 password<\/li>\n<li>let's add a new record<\/li>\n<li>let's check the correct addition of the record<\/li>\n<\/ul>\n<p><\/p>\n<p>We will be testing on <noindex><a rel=\"nofollow\" href=\"https:\/\/testmace-quick-start.herokuapp.com\/\">https:\/\/testmace-quick-start.herokuapp.com\/<\/a><\/noindex>. This is a regular <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/typicode\/json-server\">json-server<\/a><\/noindex>, which is perfectly suited for testing such applications. We have only added token authorization to all routes of the json-server and created a login method to obtain that token. We will proceed step by step, gradually improving our project.<\/p>\n<p><\/p>\n<h2 id=\"sozdanie-proekta-i-popytka-sozdat-suschnost-bez-avtorizacii\">Creating a Project and Attempting to Create an Entity Without Authorization<\/h2>\n<p><\/p>\n<p>First, let\u2019s create a new project (<strong>File<\/strong>-&gt;<strong>New project<\/strong>). If you are launching the application for the first time, a new project will open automatically. First, let's try to make a request to create a new record (perhaps creating records is available without authorization). In the context menu of the Project node, select the items <strong>Add node<\/strong> -&gt; <strong>RequestStep<\/strong>. We will set the name of the node to <strong>create-post<\/strong>. As a result, a new node will be created in the tree and the tab for this node will open. We\u2019ll set the following request parameters:<\/p>\n<p><\/p>\n<ul>\n<li>Request type: 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>Request body: json with the value <code>{\"title\": \"New testmace quick start post\"}<\/code><br \/>\nIf you did everything correctly, the interface will look as follows:<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Quick Start\" src=\"\/wp-content\/uploads\/2019\/12\/a5c81dc4977dd73a4975643bf8ced3da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>However, if we try to execute the request, the server will return a 401 code, and without authorization, we won't get anywhere on that server. Well, that\u2019s to be expected).<\/p>\n<p><\/p>\n<h2 id=\"dobavlyaem-zapros-na-avtorizaciyu\">Adding an Authorization Request<\/h2>\n<p><\/p>\n<p>As mentioned, we have a POST endpoint <code>\/login<\/code>, which accepts a json body in the following format: <code>{\"username\": \"\", \"password\": \"\"}<\/code>, where <code>username<\/code> and <code>password<\/code> (again, from the introductory section) have values <code>admin<\/code> and <code>password<\/code> accordingly. In response, this endpoint returns JSON of the following format <code>{\"token\": \"\"}<\/code>. We'll use it for authentication. Let's create <strong>RequestStep<\/strong> a node named <strong>login<\/strong>, with <strong>Project<\/strong> as its parent node. Drag and drop this node in the tree above the node <strong>create-post<\/strong>. We'll set the following parameters for the newly created request:<\/p>\n<p><\/p>\n<ul>\n<li>Request type: 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>Request body: json with the value <code>{\"username\": \"admin\", \"password\": \"password\"}<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>We will execute the request and receive a 200 status code with the token in the response. Something like this:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Quick Start\" 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\">Refactoring: removing domain duplication<\/h2>\n<p><\/p>\n<p>Currently, the requests are not linked into a single scenario. But that's not the only downside. If we look closely, we can notice that at least the domain is duplicated in both requests. Not good. It's time to refactor this part of the future scenario, and variables will help us with this.<\/p>\n<p><\/p>\n<p>In the first approximation, variables serve the same role as in other similar tools and programming languages \u2014 eliminating duplication, enhancing readability, etc. You can read more about variables in <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/user-variables\">our documentation<\/a><\/noindex>. In this case, we will need user-defined variables. <\/p>\n<p><\/p>\n<p>Let's define a variable at the Project level for the node <code>domain,<\/code> with the value <code>https:\/\/testmace-quick-start.herokuapp.com<\/code>. To do this, we need to<\/p>\n<p><\/p>\n<ul>\n<li>Open the tab for this node and click the calculator icon at the top right<\/li>\n<li>Click on <strong>+ ADD VARIABLE<\/strong><\/li>\n<li>Enter the name and value of the variable<br \/>\nIn our case, the dialog with the added variable will look like this:<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Quick Start\" src=\"\/wp-content\/uploads\/2019\/12\/071ac6dca2c5a49b78b11719fae5f650.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OK. Now, due to inheritance, we can use this variable in descendants of any level of nesting. In our case, these are the nodes <strong>login<\/strong> and <strong>create-post<\/strong>. To use the variable in the text field, you need to write <code>${}<\/code>. For example, the login URL becomes <code>${domain}\/login<\/code>, consequently for <strong>create-post<\/strong> the node, the URL will look like <code>${domain}\/posts<\/code>.<\/p>\n<p><\/p>\n<p>Thus, adhering to the DRY principle, we slightly improved the scenario.<\/p>\n<p><\/p>\n<h2 id=\"sohranyaem-token-v-peremennuyu\">Let's save the token in a variable<\/h2>\n<p><\/p>\n<p>Since we're on the topic of variables, let's expand on this a bit. At this point, in the case of a successful login, we receive an authorization token from the server, which we'll need in subsequent requests. Let's save this token in a variable. Since the value of the variable will be determined at runtime, we will use a special mechanism for this \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/user-variables\/dynamic-variables\">dynamic variables<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>First, let's execute the login request. In the tab <strong>Parsed<\/strong> To view the response, hover over the token and in the context menu (which can be accessed by right-clicking or pressing the button &#8230;), select the option. <strong>Assign to variable<\/strong>. A dialog with the following fields will appear:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Path<\/strong> \u2014 which part of the response is taken (in our case it is <code>body.token<\/code>)<\/li>\n<li><strong>Current value<\/strong> \u2014 what value lies along the Path (in our case this is the token value)<\/li>\n<li><strong>Variable name<\/strong> \u2014 the name of the variable where <strong>Current value<\/strong> it will be saved. In our case, this will be <code>the access token that you will see in the console. Copy it and paste it on the page, then click<\/code><\/li>\n<li><strong>Node<\/strong> \u2014 in which ancestor the variable will be created <strong>Variable name<\/strong>. We will select Project<\/li>\n<\/ul>\n<p><\/p>\n<p>The filled dialog looks as follows:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Quick Start\" src=\"\/wp-content\/uploads\/2019\/12\/f524934dd1a4cb238afb6666135b360b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Now, each time the node is executed <strong>login<\/strong> the dynamic variable <code>the access token that you will see in the console. Copy it and paste it on the page, then click<\/code> will be updated with the new value from the response. And this variable will be stored in <strong>Project<\/strong> the node and will be available to descendants due to inheritance.<\/p>\n<p><\/p>\n<p>To access dynamic variables, you need to use <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/variables\">the built-in variable<\/a><\/noindex> <code>$dynamicVar<\/code>. For example, to reach the saved token, you need to call <code>${$dynamicVar.token}<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"prokidyvaem-avtorizacionnyy-token-v-zaprosy\">Passing the authorization token in requests<\/h2>\n<p><\/p>\n<p>In the previous steps, we obtained the authorization token, and all we need to do is add a header <code>Authorization<\/code> with the value <code>Bearer<\/code> to all requests requiring authorization, including in <strong>create-post<\/strong>. There are several ways to do this:<\/p>\n<p><\/p>\n<ol>\n<li>Manually copy the token and add the authorization header to the desired requests. This method works, but its application is limited to requests of the type &#171;created and discarded&#187;. It is not suitable for executing scripts multiple times.<\/li>\n<li>Utilize the <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/work-with\/authorization\">authorization<\/a><\/noindex>.<\/li>\n<li>Use <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/other\/default-http-headers\">default headers<\/a><\/noindex><\/li>\n<\/ol>\n<p><\/p>\n<p>Using the second method seems obvious, but in the context of this article, such an approach... is uninteresting. Well, really: the authorization mechanism is more or less familiar to you from other tools (even though we have things like <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/work-with\/authorization#inherit-from-parent\">authorization inheritance<\/a><\/noindex>) and is unlikely to raise questions. <\/p>\n<p><\/p>\n<p>The default headers are another matter! In brief, default headers are inherited from ancestors HTTP headers that are added to a request by default unless explicitly disabled. Using this function, for example, you can implement custom authorization or simply avoid duplication in scenarios. We'll apply this feature to pass the token in headers.<\/p>\n<p><\/p>\n<p>Previously, we prudently saved the token in a dynamic variable <code>$dynamicVar.token<\/code> at the Project node level. The following steps remain:<\/p>\n<p><\/p>\n<ol>\n<li>Define the default header <code>Authorization<\/code> with the value <code>Bearer ${$dynamicVar.token}<\/code> at the Project node level. To do this, in the Project node interface, you need to open the dialog for default headers (button <strong>Headers<\/strong> in the upper right corner) and add the corresponding header. The dialog with filled values will look as follows:<br \/>\n<img decoding=\"async\" alt=\"TestMace. Quick Start\" src=\"\/wp-content\/uploads\/2019\/12\/9abd888cbf96e53b633e8f0fd3389297.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Disable this header from the login request. This is understandable: at the time of login, we do not yet have a token, and we will establish it with this request. Therefore, in the interface of the login request, on the tab <strong>Headers<\/strong> in the area <strong>Inherited<\/strong> we will uncheck the Authorization header. <\/li>\n<\/ol>\n<p><\/p>\n<p>That's it. Now the authorization header will be added to all requests that are descendants of the Project node, except for the login node. Thus, at this stage, we already have a script ready, and we just need to run it. The script can be started by selecting the item <strong>Run<\/strong> in the context menu of the Project node. <\/p>\n<p><\/p>\n<h2 id=\"proveryaem-korrektnost-sozdaniya-posta\">Verifying the post creation correctness<\/h2>\n<p><\/p>\n<p>At this stage, our script can log in, and using the authorization token, create a post. However, we need to ensure that the newly created post has the correct name. Essentially, the following steps remain:<\/p>\n<p><\/p>\n<ul>\n<li>Send a request to get the post by id, <\/li>\n<li>Check that the name returned from the server matches the name provided during post creation<\/li>\n<\/ul>\n<p><\/p>\n<p>Let's consider the first step. Since the id value is determined during the script execution, we need to create a dynamic variable (let's call it <code>postId<\/code>) from the node <strong>create-post<\/strong> at the Project node level. We already know how to do this; just refer to the section <strong>Let's save the token in a variable<\/strong>. The only thing left is to create a request to get the post by this id. For this, we will create a RequestStep <strong>get-post<\/strong> with the following parameters:<\/p>\n<p><\/p>\n<ul>\n<li>Request type: GET<\/li>\n<li>URL: ${domain}\/posts\/${$dynamicVar.postId}<\/li>\n<\/ul>\n<p><\/p>\n<p>To implement the second step, we need to familiarize ourselves with the <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/node-types\/assertion\">Assertion<\/a><\/noindex> node. The Assertion node \u2014 this is a node that allows writing checks on certain requests. Each Assertion node can contain several statements (checks). You can read more about all types of assertions in our <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/node-types\/assertion\">the documentation<\/a><\/noindex>. We will use <code>Compare<\/code> assertion with the operator <code>equal<\/code>. There are several ways to create assertions:<\/p>\n<p><\/p>\n<ol>\n<li>Long. Manually create an Assertion node from the context menu of the RequestStep node. In the created Assertion node, add the desired assertion and fill in the fields.<\/li>\n<li>Fast. Create an Assertion node along with the assertion from the RequestStep node using the context menu<\/li>\n<\/ol>\n<p><\/p>\n<p>Let's use the second method. Here's how it will look for our case.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Quick Start\" src=\"\/wp-content\/uploads\/2019\/12\/7f1d81669cb4c10db5f0afa3bf04eddf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For those who didn't understand, here's what happens:<\/p>\n<p><\/p>\n<ol>\n<li>Make a request in the node <strong>get-post<\/strong><\/li>\n<li>In the tab <strong>Parsed<\/strong> right-click to open the context menu and select <strong>Create assertion<\/strong> -&gt; <strong>Compare<\/strong> -&gt; <strong>Equal<\/strong><\/li>\n<\/ol>\n<p><\/p>\n<p>Congratulations, we've created our first test! Simple, isn't it? Now you can run the script completely and enjoy the result. Just a little bit left to refactor and extract <code>title<\/code> into a separate variable. But we'll leave that for you as homework)<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Conclusion<\/h1>\n<p><\/p>\n<p>In this guide, we've created a complete script while also reviewing some features of our product. Of course, we didn't use all the functionality, and in the following articles, we'll conduct a detailed review of TestMace's capabilities. Stay tuned for updates!<\/p>\n<p><\/p>\n<p>P.S. For those who are too lazy to reproduce all the steps, we've kindly prepared <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/TestMace\/testmace-quick-start-project\">repository<\/a><\/noindex> with the project from the article. You can open it via <strong>File<\/strong> -&gt; <strong>Open project<\/strong> and select the Project folder.<\/p>\n<p>Source: <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\/en\/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=\"en_US\" \/>\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\/en\/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. Quick Start | ProHoster","description":"Hello everyone.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/news\/testmace-bystryj-start","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/54167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=54167"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/54167\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=54167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=54167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=54167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}