<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dmitrii Snytkin</title>
    <description>The latest articles on DEV Community by Dmitrii Snytkin (@dimansny).</description>
    <link>https://dev.to/dimansny</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F261967%2F1a29f982-f596-4962-87e7-45398ad133de.jpg</url>
      <title>DEV Community: Dmitrii Snytkin</title>
      <link>https://dev.to/dimansny</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dimansny"/>
    <language>en</language>
    <item>
      <title>JS Community reacts to George Floyd's Death</title>
      <dc:creator>Dmitrii Snytkin</dc:creator>
      <pubDate>Fri, 05 Jun 2020 15:44:28 +0000</pubDate>
      <link>https://dev.to/dimansny/js-community-reacts-to-george-floyd-s-death-2nbj</link>
      <guid>https://dev.to/dimansny/js-community-reacts-to-george-floyd-s-death-2nbj</guid>
      <description>&lt;p&gt;The killing by Minnesota police of George Floyd grabbed the media's attention recently. Nobody can be indifferent to this heinous crime, and the JS community have also reacted to the incident.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Happened
&lt;/h1&gt;

&lt;p&gt;The article would be incomplete without a brief description of the event.&lt;/p&gt;

&lt;p&gt;George Floyd a black man, died on May 25, 2020, after Derek Chauvin, a white police officer from Minneapolis, knelt on Floyd's neck for 8 minutes and 46 seconds while Floyd was handcuffed face down in the street. Two other officers, Thomas Lane and J Alexander Kueng, further restrained Floyd and the fourth officer, Tou Thao, prevented onlookers from intervening. The incident occurred after Floyd had been arrested on suspicion of passing a counterfeit twenty-dollar bill buying cigarettes at a nearby market. Several witnesses took videos of the incident. The videos that showed Floyd repeatedly saying, "I can't breathe", rapidly spread across social networks and media. All four officers were fired the day after the incident.&lt;/p&gt;

&lt;p&gt;We are proud that the JS community leaders have spoken with one voice in this regard and supported the anti-racism movement. Their support is not just bare words. The  &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;react.js&lt;/a&gt;, &lt;a href="https://expressjs.com/ru/" rel="noopener noreferrer"&gt;express.js&lt;/a&gt;, &lt;a href="https://www.electronjs.org/" rel="noopener noreferrer"&gt;electron.js&lt;/a&gt;, and many other communities have asked their users to support organizations and movements which aim to tackle racial inequality. For instance, &lt;a href="https://support.eji.org/give/153413#!/donation/checkout" rel="noopener noreferrer"&gt;the Equal Justice Initiative&lt;/a&gt;. It is a non-profit organization that is committed to challenging racial and economic injustice and that provides legal representation to prisoners who may have been wrongly convicted of crimes, poor prisoners without effective representation, and others who may have been denied a fair trial.&lt;/p&gt;

&lt;p&gt;Below you may see how some of JS community leaders reacted to this crime.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;You can see the Black Lives Matter banner on the official TypeScript home page, and the futuristic city turned from bright blue colors to black. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp4ht448mr12q4ou40dia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp4ht448mr12q4ou40dia.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React.js&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The React.js community couldn't ignore the event and added &lt;a href="https://support.eji.org/give/153413/#!/donation/checkout" rel="noopener noreferrer"&gt;the Support the Equal Justice Initiative&lt;/a&gt; banner to the home page. In addition to the official community response, many developers from the React Core Team also expressed their support. In particular, they staged a virtual walkout Monday over CEO Mark Zuckerberg's decision not to take action on a series of &lt;a href="https://edition.cnn.com/2020/06/02/success/facebook-walkout-employee-protests-work-transformed/index.html" rel="noopener noreferrer"&gt;controversial posts&lt;/a&gt; from President Donald Trump last week. Dan Abramov twitted:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7caefku52jbr1lmqjyzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7caefku52jbr1lmqjyzg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://angular.io/" rel="noopener noreferrer"&gt;Angular&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;As a gesture of solidarity, the Angular official website is now using a dark color scheme and has the #BlackLivesMatter banner at the top:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvwx3x94ex79pjqef8nnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvwx3x94ex79pjqef8nnv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The official Twitter account of Angular posted:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmramy0de4u07eswpb8ib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmramy0de4u07eswpb8ib.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://babeljs.io/" rel="noopener noreferrer"&gt;Babel&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Babel has gone further: on June 3 the official site was shut down and the following message was shown to all users:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjfu8vuslq77odwqcv2kv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjfu8vuslq77odwqcv2kv.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The message contains donation links.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.electronjs.org/" rel="noopener noreferrer"&gt;Electron&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The Electron home page displays the post with the signatures of the Electron community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6vcu36yfgzmupujynnlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6vcu36yfgzmupujynnlo.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In addition to some words of support, there are also the donation links to support the movement and Floyd's family.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://testmace.com/" rel="noopener noreferrer"&gt;TestMace&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Our team stands in solidarity with the rest of the JS community and takes unprecedented measures - the light theme is temporary unavailable in the application, and the #BlackLivesMatter banner will appear at the top of the screen after running the app. Current users would also have to use a dark theme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxg3t5hhxxd2aw1bqdr9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxg3t5hhxxd2aw1bqdr9c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;As you see, the big players of the JS community couldn't be silent and explicitly supported the movement. We are convinced that it is our responsibility, too. In this case, to be silent means to be complicit. To be silent today is to endanger yourself and your family tomorrow. TestMace wishes to express its deep sorrow to George Floyd's family and stands against racial inequality and police brutality. &lt;/p&gt;

&lt;p&gt;Let us know about other companies’ support campaigns in the comments below.&lt;/p&gt;

</description>
      <category>blacklivesmatter</category>
      <category>javascript</category>
      <category>react</category>
      <category>angular</category>
    </item>
    <item>
      <title>What’s new in TestMace part 1. Cloud synchronization, new interface and many more</title>
      <dc:creator>Dmitrii Snytkin</dc:creator>
      <pubDate>Wed, 03 Jun 2020 12:07:04 +0000</pubDate>
      <link>https://dev.to/dimansny/what-s-new-in-testmace-part-1-cloud-synchronization-new-interface-and-many-more-aoj</link>
      <guid>https://dev.to/dimansny/what-s-new-in-testmace-part-1-cloud-synchronization-new-interface-and-many-more-aoj</guid>
      <description>&lt;p&gt;Hello there! After another long break, TestMace is finally coming out of the shadows to tell you the news about our project.&lt;/p&gt;

&lt;p&gt;In case you've forgotten or haven't read &lt;a href="https://dev.to/dimansny/we-built-an-ide-to-work-with-api-design-here-s-what-we-did-5dhe"&gt;the article&lt;/a&gt;, TestMace is an IDE for API design. The main purpose of our tool is to cover all possible API interaction cases, such as creating requests, combining them in scenarios (without any code), API description (instead of using swagger and other similar tools), writing tests (no code as well), and so on. The files are wrapped in projects and have a human-readable format. This allows to store projects in version control systems and then use your favorite tools and approaches. This is how it is in a few words. The work to be done is enormous, and at the moment we're still in the beginning of our way. TestMace is ready to help you solve real problems though. Its features allow it to join the lines of the most popular competitors. Since the previous article we've got so many things to tell you, thus we'll divide this information into 2 parts. Let's go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beta testing has finished. 💫
&lt;/h2&gt;

&lt;p&gt;As you might have already noticed, the last release hasn't been labeled as a beta one, meaning we have introduced a stable release of our product. From one version to another together with our users we've been doing our best to make our product as much reliable as possible. Currently TestMace is a tried and tested solution, which can be safely used for solving everyday tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  New Interface 👻
&lt;/h2&gt;

&lt;p&gt;At the early stages of development, we focused on implementing as many features as possible, paying less attention to interface design. As a result, some users complained of the interface being nonintuitive, while others claimed it to be quite messy (colors, indentations, extra components). After our product hunt release, we were also informed about some UI and UX shortcomings. That's why we've decided to radically redesign the existing interface and focus on beautiful features implementation. And you can already check out our work.&lt;/p&gt;

&lt;p&gt;The first thing you're going to notice after running TestMace is its new interface. The changes are quite significant: the standard theme has been improved, and each control has been redesigned. However, if you take a closer look at the interface, you'll see that the structure of interface blocks is the same, so you won't have to get used to it again. The only exception is Folder and Project nodes tabs (that look the same anyway): in order to achieve more compact design, the tab panel is divided into 2 parts: in the left part there is a list of children, while in the right part - the node's settings. You can see the new interface in the picture below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---nSobEYZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/crvrex6d161lk8wxa3ai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---nSobEYZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/crvrex6d161lk8wxa3ai.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've added prompts everywhere else and made the interface much friendlier. Otherwise everything is quite the same, so the migration process shouldn't be painful at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Light Theme 🔆
&lt;/h2&gt;

&lt;p&gt;Dark application theme is definitely the latest trend. On the one hand, a dark theme interface looks stylish, on the other hand, in the everyday routine it is easier to work with (both views are subjective though). After all, no doubt the dark theme is a number-one solution for our IDE developers. That's why it's quite obvious, the dark theme was implemented first.&lt;/p&gt;

&lt;p&gt;However, we've been getting so many requests for a light theme version recently that we couldn't resist. Now you have a light theme option in the stable 1.0.0 release. Here's how it looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4q_k6AK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dkz5vsunyuefjsnipzvi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4q_k6AK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dkz5vsunyuefjsnipzvi.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Paid Subscriptions 💵
&lt;/h2&gt;

&lt;p&gt;One of the main features to present is a paid version of our app. We're certain, paid subscriptions would help us make our product more stable and powerful. Still we intend to keep our prices reasonable so that anyone could afford it. We'll be continuously improving the free version of TestMace without limitations on use cases. &lt;/p&gt;

&lt;p&gt;If you visit our site, you'll see 4 plans: basic, individual, team, and enterprise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jGjHfkWZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t5lhetkgbuim2si9ddj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jGjHfkWZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t5lhetkgbuim2si9ddj7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first plan is a plain free version, that you've used before. The Enterprise plan is for teams and organizations wanting to get a customized solution. The Individual plan allows individual users to get access to TestMace's advanced features. The Professional plan deserves special attention though.&lt;/p&gt;

&lt;p&gt;It's quite simple. Apart from users, you've got teams in the system. Teams are like organizations in Github, for example. You buy a subscription for the whole team. The price depends on the number of users and the chosen period (a month or a year). As compared to the Individual plan, you've got a cloud synchronization feature inside the team. There are no other differences.&lt;/p&gt;

&lt;p&gt;There is a dashboard (&lt;a href="http://dashboard.testmace.com/"&gt;http://dashboard.testmace.com&lt;/a&gt;), that you can use to manage your projects and subscriptions.&lt;/p&gt;

&lt;p&gt;The most important, paid version users will get as a bonus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud synchronization (for 1 user or for a team depending on the plan chosen);&lt;/li&gt;
&lt;li&gt;Light theme;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/assertion-node"&gt;Extended assertions set&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Advanced autocomplete for variables and functions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are a few new node types that will also be available in the paid version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gRPC;&lt;/li&gt;
&lt;li&gt;Websocket.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isn't it cool? Moreover, we offer a trial period for you to try all these wonderful features. It has some differences in comparison with other products' trial periods, such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The trial period is not for the whole application, but for each feature separately. For instance, you don't need gRPC, and its trial doesn't start, until you decide to try it. It allows you to fully appreciate all features and stay tuned with the pro-features updates.&lt;/li&gt;
&lt;li&gt;The trial period is divided into 3 parts: 15 days for unlogged users, 15 days for authorized users and 30 days for paid subscription users. You can get a 60-days trial in total. This is an opportunity to try our features even without logging in our application.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cloud Synchronization ☁️
&lt;/h2&gt;

&lt;p&gt;In TestMace teamwork has always been a top priority to us. This is not only a convenient format for storing your projects in version control systems but also a &lt;a href="https://docs-ru.testmace.com/cli/cli"&gt;cli&lt;/a&gt; for running them in CI/CD and a &lt;a href="https://docs-ru.testmace.com/other/import/shared"&gt;scenarios sharing&lt;/a&gt; ability. Cloud synchronization is one more step towards easier teamwork with API. As stated above, cloud synchronization is a paid feature. However, we've kept it free for individual users.&lt;/p&gt;

&lt;p&gt;To be able to use this feature, you'll need to do the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in the &lt;a href="http://dashboard.testmace.com"&gt;control panel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a team&lt;/li&gt;
&lt;li&gt;Create a project for this team&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you're going to need to log in the app and choose the project you've just created. Please note that synchronization process is not performed on the fly. To save the changes, click the Sync button on the top of the toolbar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U6cvnafJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0egzbl5fomiwo39a79lm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U6cvnafJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0egzbl5fomiwo39a79lm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You also can migrate existing projects to the cloud. Just click the Save in the cloud button and chose the team which you can save this project for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launching the Product on ProductHunt 🚀
&lt;/h2&gt;

&lt;p&gt;Launching a product on Product Hunt is a key milestone for every startup. This site is like a springboard, that can provide a big number of users, useful contacts, and therefore understanding of your future plans. Getting ready for launch is a time-consuming process: you need to find a hunter and influencers, think about getting more users on the launch day (ask regular users for support in particular), create promo materials, etc. Each case is unique.&lt;/p&gt;

&lt;p&gt;We started with reading articles about other people's experiences, but they very often contradict each other. &lt;a href="https://blog.producthunt.com/how-to-launch-on-product-hunt-7c1843e06399"&gt;This official Product Hunt team post&lt;/a&gt; was one of the main sources for us.&lt;/p&gt;

&lt;p&gt;As a result, we focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making a nice profile: find the right tags, name, and description and create an attractive animated logo.&lt;/li&gt;
&lt;li&gt;Writing the first comment from developers, where we introduced our team and stated our goals and plans.&lt;/li&gt;
&lt;li&gt;Creating makers' accounts and providing some information about them.&lt;/li&gt;
&lt;li&gt;Introducing a special offer - LTD Professional version license for 5 people.&lt;/li&gt;
&lt;li&gt;Creating a promo-video. This is a very important step, since having an appealing but limited special offer you will always find someone who'd buy your product before actually trying it. Those people will be caught by your promo materials: a video, product description, and landing page.&lt;/li&gt;
&lt;li&gt;Creating a roadmap and placing it on the product's site.&lt;/li&gt;
&lt;li&gt;Using the Product Hunt Ship service to pre-launch our product. When you create a page on this site, your product appears on the main Product Hunt page from time to time, and you can get new followers. The fact is that you get people who are interested in your product and have a PH account. On the launch day you can use Ship's built-in services to do a mass mailing to ask your followers to support the project. Just don't use the word "Upvote"! Every single user should decide whether they like it or not on their own.&lt;/li&gt;
&lt;li&gt;Creating a landing page: we put there a banner with our special offer info and the 'Featured on ProductHunt' button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We started preparations one and a half month before the launch. We didn't look for a hunter, we decided to do it ourselves. On the launch day we got unexpected news: a few days prior to that a random hunter had published our project! The publication was too raw, it got a very small number of feedbacks and likes and was almost left unnoticed. We immediately contacted the PH support to publish our product again. The PH team approved our request and after a while we were given permission to make a publication the next day, having the previous page deleted.&lt;/p&gt;

&lt;p&gt;As a result, we had: one sleepless night, 300+ upvotes, our product on the main page for 1 day, LTD licenses sold, a lot of useful feedback, and several hundreds of new users. Our product wasn't in the first 5 places in the end, but for most of the day we were on the 1st place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion ⚡
&lt;/h2&gt;

&lt;p&gt;In this article we've covered some important details of TestMace, which are not directly connected with its features, but make things easier. In addition to that, we've covered such important steps for our project as paid subscriptions introducing, first stable version release, and launching the product on Product Hunt.&lt;/p&gt;

&lt;p&gt;In the next article we're going to shed light on new nodes and improvements. Stay tuned!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>startup</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why TestMace is better than Postman</title>
      <dc:creator>Dmitrii Snytkin</dc:creator>
      <pubDate>Wed, 18 Dec 2019 11:03:07 +0000</pubDate>
      <link>https://dev.to/dimansny/why-testmace-is-better-than-postman-2412</link>
      <guid>https://dev.to/dimansny/why-testmace-is-better-than-postman-2412</guid>
      <description>&lt;p&gt;Hello, this is &lt;a href="http://testmace.com"&gt;Testmace&lt;/a&gt;! You might have known about us from &lt;a href="https://dev.to/dimansny/getting-started-with-api-testing-by-using-testmace-3no"&gt;our&lt;/a&gt; &lt;a href="https://dev.to/dimansny/we-built-an-ide-to-work-with-api-design-here-s-what-we-did-5dhe"&gt;previous&lt;/a&gt; &lt;a href="https://dev.to/dimansny/why-testmace-has-chosen-electron-p0k"&gt;articles&lt;/a&gt;. For those who have just joined us: we're working on Testmace - an IDE for API design. How are you different from &lt;a href="https://www.getpostman.com/"&gt;Postman&lt;/a&gt;? This is the most frequently asked question while comparing TestMace to other similar products. It feels like the time we gave a detailed answer to it. You can see all benefits of our product down below.&lt;/p&gt;

&lt;h1&gt;
  
  
  Nodes
&lt;/h1&gt;

&lt;p&gt;If you use Postman, you must be aware that the interface of a request has all necessary features. You can see scripts, tests, and requests there. It makes things easier for new users, but in more complex scenarios this approach isn't flexible enough. What if you need to create a few requests and aggregate them? What if you want to run a script without creating a request or multiple logically separated scripts? At least you would definitely like to separate tests from basic utility scripts. Moreover, the all-features-in-one-node approach is unscalable since the interface quickly becomes too heavy.&lt;/p&gt;

&lt;p&gt;TestMace initially separates features among nodes of different type. You want to send a request? A &lt;a href="https://docs.testmace.com/node-types/request-step"&gt;request step&lt;/a&gt; node is here for you. You'd like to write a script? Use a &lt;a href="https://docs.testmace.com/node-types/script"&gt;script&lt;/a&gt; node for that. Need tests? An &lt;a href="https://docs.testmace.com/node-types/assertion-node"&gt;assertion&lt;/a&gt; node, here you go. By the way, you can also wrap it all in a &lt;a href="https://docs.testmace.com/node-types/folder"&gt;folder&lt;/a&gt; node or easily combine some of the nodes. This approach is not only more flexible, but also according to the single responsibility principle it allows to use only those features that are needed for a specific task. Obviously, you don't need scripts and tests for sending a request.&lt;/p&gt;

&lt;h1&gt;
  
  
  Human-Readable Format of Projects
&lt;/h1&gt;

&lt;p&gt;There is an important conceptual distinction between TestMace and Postman regarding data storage format. Postman stores requests somewhere in your local storage. In case you want to share your requests with other users, you're going to have to use built-in synchronization. In fact, this is a quite common approach, which has its own shortcomings. And what about data security? Some companies' privacy policy might not allow to share personal data with third parties. We believe, TestMace can offer a better solution here, and it's called "human-readable project format".&lt;/p&gt;

&lt;p&gt;First, TestMace has such entity as Project. The application itself was developed with ability to store projects in version control systems in mind: the project tree almost completely reflects the file structure, for storing files we use the YAML format (no extra brackets and commas), and every node's file representation is given in the documentation in detail. In most cases, you won't need to refer to it though, because of logical field names.&lt;/p&gt;

&lt;p&gt;How can you benefit from it? You can alter your team workflow in a very flexible way, using all common approaches for that. For instance, developers can save the project files in the same repository as backend. As for branches, apart from changing the code base, a developer can also correct existing request scenarios and tests. After committing changes in your repository (git, svn, mercurial, whatever you like more) your favorite CI runs our console utility - &lt;a href="https://www.npmjs.com/package/@testmace/cli"&gt;testmace-cli&lt;/a&gt;, and the report received (which may, for example, be in the junit format, that is also supported by testmace-cli) is sent to the corresponding system. Thus, the abovementioned data security problem is not a problem anymore.&lt;/p&gt;

&lt;p&gt;As you see, TestMace does not impose its ecosystem and paradigm. It easily adapts to already working processes instead.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dynamic Variables
&lt;/h1&gt;

&lt;p&gt;TectMace follows the no-code concept: if a problem can be solved without coding, we’re trying to give you this opportunity. Well, working with variables usually does not require you to write code.&lt;/p&gt;

&lt;p&gt;For example, we've received a response from the server and want to store a part of it into a variable. In Postman we'd write something like this in a test script (which is kind of weird):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;responseBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;postman&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Our opinion is that writing a script for such simple and frequently used scenario looks excessive. With TestMace you can do assign a response part to a variable using graphical user interface. Just look at how simple it is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LJLBKktC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m9f56j3v1rt0k8zhfr3y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LJLBKktC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m9f56j3v1rt0k8zhfr3y.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This dynamic variable will now be updated after every new request. Surely, you may argue that postman's approach is more flexible and allows to not only make an assignment, but also do data pre-processing. Let's modify the previous example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;responseBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;postman&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CryptoJS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MD5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;TestMace has a &lt;a href="https://docs.testmace.com/node-types/script"&gt;script&lt;/a&gt; node for this scenario. To do the same in TestMace, we need to send a request and create a script node, using the following code for a script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;tm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setDynamicVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MD5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As you see, nodes combination works well in this case. For this simple scenario you can just assign the &lt;code&gt;${crypto.MD5($response.data)}&lt;/code&gt; expression to the variable you create using the graphical user interface.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creating Tests via GUI
&lt;/h1&gt;

&lt;p&gt;Postman allows to create tests by writing scripts (in JavaScript). Seems like this approach has no downsides: almost unlimited flexibility, ready-to-go solutions, etc.&lt;/p&gt;

&lt;p&gt;But life is life and in reality, QA engineers often don't have any programming skills, but they would like to be helpful. In this case, TestMace suggests you follow the no-code concept and create simple tests via GUI without writing scripts at all. Let's create a test that verifies if some values are equal. This is how it looks like in TestMace:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3EnpF1dB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hoxs6yqu4z9v6tb4o10j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3EnpF1dB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hoxs6yqu4z9v6tb4o10j.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, you still have an option to &lt;a href="https://docs.testmace.com/node-types/assertion-node/script"&gt;write your tests&lt;/a&gt; on your own. There are the same libraries as in a script node and &lt;a href="https://www.chaijs.com/"&gt;chai&lt;/a&gt; for writing tests.&lt;/p&gt;

&lt;h1&gt;
  
  
  Running Existing Scenario via Link (Link Node)
&lt;/h1&gt;

&lt;p&gt;Quite often you may need to run some request or even a request scenario several times in different parts of the project. For example, a custom multi-step authorization, setup environment, etc. In terms of programming languages, we need to have some functions, that can be reused in different parts of the application. There is the &lt;a href="https://docs.testmace.com/node-types/link"&gt;link&lt;/a&gt; node type in TestMace for this purpose. It's very simple to use it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;create a request or scenario;&lt;/li&gt;
&lt;li&gt;create a link node;&lt;/li&gt;
&lt;li&gt;set a link to the request or scenario created in step 1.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In more complex case, you can specify which dynamic variables should be passed to the above-the-link level. Sounds confusing? Imagine you've created a Folder node named &lt;strong&gt;create-post&lt;/strong&gt; and assigned it to the &lt;code&gt;postId&lt;/code&gt; variable. Now in the &lt;strong&gt;create-post-link&lt;/strong&gt; node you can explicitly assign the parent of &lt;strong&gt;create-post-link&lt;/strong&gt; to &lt;code&gt;postId&lt;/code&gt;. This mechanism (again, in terms of programming) can be used for returning the result from a function. Great! DRY in action, and no changes in the code. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PJnja3DM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/rbdm5p14v7bnknn3212m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PJnja3DM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/rbdm5p14v7bnknn3212m.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
As for Postman, a feature request on reusing &lt;a href="https://github.com/postmanlabs/postman-app-support/issues/1535"&gt;requests has been there from 2015&lt;/a&gt;, and it seems there are some implications, that they are &lt;a href="https://github.com/postmanlabs/postman-app-support/issues/1535#issuecomment-280305898"&gt;working&lt;/a&gt; on it. Now you can change the execution flow in Postman, that, in theory, allows to achieve this behavior, but this is rather a dirty hack, than a working approach.&lt;/p&gt;

&lt;h1&gt;
  
  
  Other Differences
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;More control over variables scope. The smallest scope where you can define a variable in Postman is the collection scope. TestMace allows to define variables for any request or folder. Postman's Share collection allows to export only collections, while in Testmace sharing works for any node&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TestMace supports &lt;a href="https://docs.testmace.com/other-features/default-http-headers"&gt;inheritable headers&lt;/a&gt;, that by default may be inserted into child requests. Postman has an &lt;a href="https://github.com/postmanlabs/postman-app-support/issues/1947"&gt;issue&lt;/a&gt; on that, and it's already closed, but the solution is... &lt;a href="https://github.com/postmanlabs/postman-app-support/issues/1947#issuecomment-292741840"&gt;to use scripts&lt;/a&gt;. In TestMace everything is configured via GUI and there is an option to disable headers inheritance in certain children&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Undo/Redo. This works not only while editing nodes, but also while moving, removing, renaming and other actions, that change the project structure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The files you attach to your requests are a part of the project and are stored together with other project files and synchronize well (as compared to Postman), so you don’t have to choose all necessary files manually every time and share their archives with your colleagues anymore&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Features In Progress
&lt;/h1&gt;

&lt;p&gt;We couldn't resist the temptation to spill the beans on our next releases, especially on these new powerful features, that are being tested at the moment. So, here they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Functions
&lt;/h2&gt;

&lt;p&gt;As you know, for values generation Postman has so-called dynamic variables. &lt;a href="https://learning.getpostman.com/docs/postman/variables-and-environments/variables-list/"&gt;The list of those variables&lt;/a&gt; is very impressive, and the great majority of functions are used to generate fake values. For example, to generate a random email, you should write:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{{$randomEmail}}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Since these are variables (even if they are dynamic), they can't be used as functions - they aren't parametrizable, so you wouldn't be able to get a hash of a string.&lt;/p&gt;

&lt;p&gt;We're planning to add "real" functions to TestMace. You will be able to access a variable and call a function inside &lt;code&gt;${}&lt;/code&gt;. To generate a fake email, you'll just have to write:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;${faker.internet.email()}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is a function, and you may notice that you can call a method of the object now. Instead of a long flat list of dynamic variables we have a set of logically grouped objects.&lt;/p&gt;

&lt;p&gt;And how to calculate a hash of a string? Easy!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;${crypto.MD5($dynamicVar.data)}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;See, you can even pass variables as parameters! At this point, you may suspect something wrong...&lt;/p&gt;

&lt;h2&gt;
  
  
  Using JavaScript in Expressions
&lt;/h2&gt;

&lt;p&gt;... That's right! When we were thinking on functions requirements, we suddenly realized, that we should allow users to use valid JavaScript in their expressions. So now you can write something like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;${1 + '' + crypto.MD5('asdf')}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Do it right in edit fields, no scripts required!&lt;/p&gt;

&lt;p&gt;As for Postman, you can only use variables, and if you try to write an expression of some kind, the validator would give a warning and refuse to execute it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GVjmdS9o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fno7ov8ux2kr04zqlcqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GVjmdS9o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fno7ov8ux2kr04zqlcqp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Autocompletion
&lt;/h2&gt;

&lt;p&gt;For now, TestMace is equipped with a standard autocomplete feature:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KXKwKptu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m0z5ubb6qxg3uino5noe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KXKwKptu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m0z5ubb6qxg3uino5noe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you see, there is a possible line together with what it refers to. This mechanism works only for expressions in &lt;code&gt;${}&lt;/code&gt; braces.&lt;/p&gt;

&lt;p&gt;Note the visual markers for variable types (e.g. string, number, array, etc). You can also switch between several autocompletion modes (for instance, you can choose variables or headers autocompletion). This isn't the main thing though! First, the autocomplete feature works even for expressions (wherever it's possible). This is how it looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wkUCXkgf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wq726azm5377y3v3mtaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wkUCXkgf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wq726azm5377y3v3mtaf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second, it is now available in scripts, too. Just look at it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B-rfRUmD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/d4kdzzzq8x3dok1kld0a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B-rfRUmD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/d4kdzzzq8x3dok1kld0a.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's no point to compare it with Postman. There you'll find only autocompletion of static variables lists, headers and their values. I may have forgotten something. It doesn't work for scripts :(&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;In October we celebrated a year of working on our product. We were able to do a lot of things and, at some point, catch our competitors. Anyway, our goal is to create a really powerful tool for API development. There's still much work to be done. Here's our rough plan for the following year: &lt;a href="https://testmace.com/roadmap/"&gt;https://testmace.com/roadmap/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Your feedback will allow us to work harder on new features, and your support empowers us and makes us believe we're being helpful. Today is a very important day for our project. Today we post TestMace on &lt;a href="https://www.producthunt.com/posts/testmace"&gt;ProductHunt&lt;/a&gt;. We ask you to support our product, it's very important for us. Oh yes, we have an appealing limited-time offer for you on our PH page!&lt;/p&gt;

&lt;p&gt;Also TestMace team has a cool offer for our followers:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tBHKePhF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jn6f9u0et73ql2564prx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tBHKePhF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jn6f9u0et73ql2564prx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read more on our site &lt;a href="https://testmace.com"&gt;testmace.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>startup</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Getting Started with API Testing by Using TestMace</title>
      <dc:creator>Dmitrii Snytkin</dc:creator>
      <pubDate>Mon, 02 Dec 2019 12:15:54 +0000</pubDate>
      <link>https://dev.to/dimansny/getting-started-with-api-testing-by-using-testmace-3no</link>
      <guid>https://dev.to/dimansny/getting-started-with-api-testing-by-using-testmace-3no</guid>
      <description>&lt;p&gt;Hello there! We're coming out of the shadows and continuing the series of articles about our product. We've got so many feedbacks (mainly positive), suggestions, and bug reports after publishing our &lt;a href="https://dev.to/dimansny/we-built-an-ide-to-work-with-api-design-here-s-what-we-did-5dhe"&gt;last&lt;/a&gt; overview article. Today you'll see &lt;a href="https://client.testmace.com/" rel="noopener noreferrer"&gt;TestMace&lt;/a&gt; in action and try out some features of our application.&lt;/p&gt;

&lt;p&gt;For more information be sure to look over its documentation - &lt;a href="http://docs.testmace.com" rel="noopener noreferrer"&gt;http://docs.testmace.com&lt;/a&gt;. Let's go!&lt;/p&gt;

&lt;h1&gt;
  
  
  Installation
&lt;/h1&gt;

&lt;p&gt;We'll start with some basic things. Our application is available and is being tested on three platforms: Linux, Windows, MacOS. You can download an installer for particular OS from &lt;a href="https://client.testmace.com/" rel="noopener noreferrer"&gt;our site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Linuxoids can install a &lt;a href="https://snapcraft.io/testmace" rel="noopener noreferrer"&gt;snap package&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We're really hoping to get our hands on Microsoft Store and App Store (should we?).&lt;/p&gt;

&lt;h1&gt;
  
  
  Experimental Scenario
&lt;/h1&gt;

&lt;p&gt;For our little experiment we have the following standard scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;log in:  user - &lt;strong&gt;admin&lt;/strong&gt;, password - &lt;strong&gt;password&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;add a new record;&lt;/li&gt;
&lt;li&gt;check if the record was added correctly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll be using the &lt;a href="https://testmace-quick-start.herokuapp.com/" rel="noopener noreferrer"&gt;https://testmace-quick-start.herokuapp.com&lt;/a&gt; url. It's a plain &lt;a href="https://github.com/typicode/json-server" rel="noopener noreferrer"&gt;json server&lt;/a&gt;, perfectly suitable for testing this kind of applications. All we've done is token authorization for all json server routes and the login method for getting this very token.&lt;/p&gt;

&lt;p&gt;We'll move step by step, improving our project.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creating a project and trying to create an entity without authorization
&lt;/h1&gt;

&lt;p&gt;Let's start with creating a new project (&lt;strong&gt;File&lt;/strong&gt;-&amp;gt;&lt;strong&gt;New project&lt;/strong&gt;). If TestMace is launched the first time, it'll be done automatically. Let's issue a request for creating a new post (in case if it is possible without authorization). In the Project node context menu select &lt;strong&gt;Add node&lt;/strong&gt; -&amp;gt; &lt;strong&gt;&lt;a href="https://docs.testmace.com/node-types/request-step" rel="noopener noreferrer"&gt;RequestStep&lt;/a&gt;&lt;/strong&gt;.&lt;br&gt;
Name it &lt;strong&gt;create-post&lt;/strong&gt;. You'll see a new node in the project tree and it's tab will be shown.&lt;/p&gt;

&lt;p&gt;Set the following request parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request type: &lt;strong&gt;POST&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;url: &lt;a href="https://testmace-quick-start.herokuapp.com" rel="noopener noreferrer"&gt;https://testmace-quick-start.herokuapp.com&lt;/a&gt; posts&lt;/li&gt;
&lt;li&gt;Request body: &lt;strong&gt;json&lt;/strong&gt; with the &lt;code&gt;{"title": "New testmace quick start post"}&lt;/code&gt; value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you do it right, you'll see the following interface:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fm1j0uqepdsri9idj9279.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fm1j0uqepdsri9idj9279.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, if you send this request, the server will return the 401 code, and you won't be able to do anything with the server without authorization. Just as expected.&lt;/p&gt;

&lt;h1&gt;
  
  
  Adding an authorization request
&lt;/h1&gt;

&lt;p&gt;As mentioned before, we've got a POST endpoint &lt;strong&gt;/login&lt;/strong&gt;, that takes the following json as the request body: &lt;code&gt;{"username": "&amp;lt;username&amp;gt;", "password": "&amp;lt;password&amp;gt;"}&lt;/code&gt;, where &lt;strong&gt;username&lt;/strong&gt; and &lt;strong&gt;password&lt;/strong&gt; have the &lt;strong&gt;admin&lt;/strong&gt; and &lt;strong&gt;password&lt;/strong&gt; values respectively. This endpoint returns the following json as a response: &lt;code&gt;{"token": "&amp;lt;token&amp;gt;"}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's use it for authorization. Create a &lt;a href="https://docs.testmace.com/node-types/request-step" rel="noopener noreferrer"&gt;RequestStep&lt;/a&gt; node named &lt;strong&gt;login&lt;/strong&gt; with the &lt;a href="https://docs.testmace.com/node-types/project" rel="noopener noreferrer"&gt;Project&lt;/a&gt; node being its parent. Drag and drop this node above the &lt;strong&gt;create-post&lt;/strong&gt; node in the tree.&lt;br&gt;
Set the following parameters for the newly added node:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request type: &lt;strong&gt;POST&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;url: &lt;a href="https://testmace-quick-start.herokuapp.com/login" rel="noopener noreferrer"&gt;https://testmace-quick-start.herokuapp.com/login&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Request body: &lt;strong&gt;json&lt;/strong&gt; with the &lt;code&gt;{"username": "admin", "password": "password"}&lt;/code&gt; value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you send the request, you'll get the 200 code with the token as a response:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuu4s7dlu5j4i79uf9mo6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuu4s7dlu5j4i79uf9mo6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Refactoring: removing domain duplication
&lt;/h1&gt;

&lt;p&gt;Our requests are not grouped in one scenario yet. But that is not the only problem here. If you look at them closer, you'll see that the domain is duplicated in both requests. That's not good. It's time to refactor this part of our future scenario with the help of variables.&lt;/p&gt;

&lt;p&gt;Variables in TestMace roughly do all the same things as in other similar tools and languages - deduplication, improving readability, etc.&lt;/p&gt;

&lt;p&gt;Refer to &lt;a href="https://docs.testmace.com/variables/user-variables" rel="noopener noreferrer"&gt;our documentation&lt;/a&gt; to read more about variables. This time we'll need user-defined variables.&lt;/p&gt;

&lt;p&gt;Define the &lt;code&gt;domain&lt;/code&gt; &lt;a href="https://docs.testmace.com/variables/user-variables" rel="noopener noreferrer"&gt;variable&lt;/a&gt; with the value &lt;code&gt;https://testmace-quick-start.herokuapp.com&lt;/code&gt; at the Project node level. To do that, you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the Project node tab and click on the calculator icon at the top right of the window;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;+ADD VARIABLE&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Enter the name and value for this variable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our case, the variable dialog will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F87w32zy334wrcqc38lxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F87w32zy334wrcqc38lxd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OK. Now we can inherit this variable in children of any nesting level and in the &lt;strong&gt;login&lt;/strong&gt; and &lt;strong&gt;create-post&lt;/strong&gt; nodes in particular. To use the variable in the text box, you should write &lt;code&gt;${&amp;lt;variable_name&amp;gt;}&lt;/code&gt;. For example, the url for &lt;strong&gt;login&lt;/strong&gt; will be written as &lt;code&gt;${domain}/login&lt;/code&gt;, and the url for the &lt;strong&gt;create-post&lt;/strong&gt; node - &lt;code&gt;${domain}/posts&lt;/code&gt;.&lt;br&gt;
By doing so, we've followed the DRY principle and improved our little scenario.&lt;/p&gt;

&lt;h1&gt;
  
  
  Storing the token in a variable
&lt;/h1&gt;

&lt;p&gt;While we're on the subject of variables, let's go a bit further. If the login is successful, we get an authorization token from the server, that we're going to need in future requests. Let's save this token into a variable. Since the variable value is defined while running a scenario, we'll use a special mechanism called &lt;a href="https://docs.testmace.com/variables/user-variables/dynamic-variables" rel="noopener noreferrer"&gt;dynamic variables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First, let's send the login request. In the &lt;strong&gt;Parsed&lt;/strong&gt; tab of the response point to the token in the context menu and select &lt;strong&gt;Assign to variable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You'll see a dialog with the following fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Path&lt;/strong&gt; - the part of a request taken (&lt;code&gt;body.token&lt;/code&gt; in our case);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current value&lt;/strong&gt; - the value at the specified path (the token value);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variable name&lt;/strong&gt; — the name of the variable where our &lt;strong&gt;Current value&lt;/strong&gt; will be stored. (&lt;code&gt;token&lt;/code&gt; in our case).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node&lt;/strong&gt; — the parent node where the &lt;strong&gt;Variable name&lt;/strong&gt; will be created. Choose &lt;strong&gt;Project&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dialog with complete fields should be the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fukpmukn6nkjmi0q7m4fx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fukpmukn6nkjmi0q7m4fx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, every time the &lt;strong&gt;login&lt;/strong&gt; node runs, the &lt;code&gt;token&lt;/code&gt; variable is updated with the value from the response. This variable will be stored in the &lt;strong&gt;Project&lt;/strong&gt; node and will be available in child nodes, thanks to inheritance mechanism.&lt;/p&gt;

&lt;p&gt;To access dynamic variables, use the &lt;a href="https://docs.testmace.com/variables/variables" rel="noopener noreferrer"&gt;default variable&lt;/a&gt; &lt;code&gt;$dynamicVar&lt;/code&gt;. For instance, to get to the saved token you should write &lt;code&gt;${$dynamicVar.token}&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Passing the authorization token into requests
&lt;/h1&gt;

&lt;p&gt;Previously we've received an authorization token and now we only need to add the &lt;strong&gt;Authorization&lt;/strong&gt; header with the &lt;code&gt;Bearer &amp;lt;tokenValue&amp;gt;&lt;/code&gt; value to every request where authorization is needed, including the &lt;strong&gt;create-post&lt;/strong&gt; request.&lt;/p&gt;

&lt;p&gt;There are a few ways to do that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To copy the token and add the authorization header to every request manually. This works just fine, but is limited to fire-and-forget requests and not suitable for scenarios;&lt;/li&gt;
&lt;li&gt;To use &lt;a href="https://docs.testmace.com/working-with-project/authorization" rel="noopener noreferrer"&gt;authorization&lt;/a&gt; feature.&lt;/li&gt;
&lt;li&gt;To use &lt;a href="https://docs.testmace.com/other-features/default-http-headers" rel="noopener noreferrer"&gt;default headers&lt;/a&gt;.
The second approach seems to be just what we need, but in terms of this article it's of no interest. Seriously, you should be more or less familiar with the authorization mechanism from other tools and shouldn't have any trouble with it (even though we have such things as &lt;a href="https://docs.testmace.com/work-with/authorization#inherit-from-parent" rel="noopener noreferrer"&gt;authorization inheritance&lt;/a&gt; in TestMace).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using default headers is much more exotic. Long story short, default headers are inherited HTTP headers that are by default added to requests if you don't turn it off explicitly. With the help of this feature you can, for example, implement custom authorization or get rid of duplications in your scenarios. Let's use this feature to pass the token through the headers.&lt;/p&gt;

&lt;p&gt;Earlier we've saved the token into the &lt;code&gt;$dynamicVar.token&lt;/code&gt; dynamic variable at the &lt;strong&gt;Project&lt;/strong&gt; node level. Now we have to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the Authorization default header with the &lt;code&gt;Bearer ${$dynamicVar.token}&lt;/code&gt; value at the &lt;strong&gt;Project&lt;/strong&gt; node level. To do that, open the default headers dialog (select the &lt;strong&gt;Headers&lt;/strong&gt; button at the top right of the screen) and add the corresponding header. This is how the dialog with the filled fields should look like:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8k4yuyk9bqy9l4suzcgv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8k4yuyk9bqy9l4suzcgv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Disable this header in the &lt;strong&gt;login&lt;/strong&gt; request. Sure thing: at the moment of logging in we don't have a token, we'll set it with this particular request. Thus, uncheck the &lt;strong&gt;Authorization&lt;/strong&gt; checkbox in the &lt;strong&gt;Headers&lt;/strong&gt; tab in the &lt;strong&gt;Inherited&lt;/strong&gt; area.
That's it. The authorization header will now be added to all &lt;strong&gt;Project&lt;/strong&gt; node children, except for the &lt;strong&gt;login&lt;/strong&gt; node. Seems, the scenario is ready, and we only need to run it. To do that, select &lt;strong&gt;Run&lt;/strong&gt; in the &lt;strong&gt;Project&lt;/strong&gt; node context menu.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Checking if the post was made correctly
&lt;/h1&gt;

&lt;p&gt;So far, our scenario can log in and create a post using an authorization token. But we have to make sure that the created post has the correct name.&lt;/p&gt;

&lt;p&gt;So here's what we need to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send a request to get the post via its id;&lt;/li&gt;
&lt;li&gt;Check if the name received from the server corresponds to the name used while creating the post.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's discuss the first step. Since the id value is defined while running the script, we need to create a dynamic variable (let's name it &lt;code&gt;postID&lt;/code&gt;) in the &lt;strong&gt;create-post&lt;/strong&gt; node at the &lt;strong&gt;Project&lt;/strong&gt; node level.&lt;/p&gt;

&lt;p&gt;You already know how to to that, just go to the &lt;strong&gt;Storing the token in a variable&lt;/strong&gt; section. All we have left is sending a request for getting the post by its id.&lt;br&gt;
Create a RequestStep node named &lt;strong&gt;get-post&lt;/strong&gt; with the following parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request type: &lt;strong&gt;GET&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;${domain}/posts/${$dynamicVar.postId}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To go further, you need to take a closer look at &lt;a href="https://docs.testmace.com/node-types/assertion-node" rel="noopener noreferrer"&gt;Assertion&lt;/a&gt; nodes. An Assertion node is a node that allows to create tests for specific requests. Each Assertion node may contain several assertions (tests). To learn more about supported assertions you can refer to our &lt;a href="https://docs.testmace.com/node-types/assertion-node" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. We'll use a Compare assertion with the equal operator.&lt;/p&gt;

&lt;p&gt;There are two ways of creation assertions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Long. Do it manually from the RequestStep node context menu. In the created Assertion node add the desired assertion and fill in the fields.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quick. Create an Assertion node along with the desired assertion from the RequestStep node response using the context menu.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's stick with the second one. Here's how it'll look like for our example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fq7nsu1uaghn1f278cmn7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fq7nsu1uaghn1f278cmn7.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, you do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a request in the &lt;strong&gt;get-post&lt;/strong&gt; node.&lt;/li&gt;
&lt;li&gt;Open the context menu in the &lt;strong&gt;Parsed&lt;/strong&gt; tab and select &lt;strong&gt;Create assertion&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Compare&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Equal&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wow, we've just created our first test! Simple as that! Now you can run the full scenario and enjoy the result. You can make it even more beautiful if you put &lt;code&gt;title&lt;/code&gt; into a separate variable though.&lt;br&gt;
We leave it to you as an exercise :)&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;In this guide we created a full-blown scenario and tried some features of our product as well.&lt;/p&gt;

&lt;p&gt;Of course, these were just a few of them, and we're going to make a full review of all TestMace features next time. So watch out for updates in our blog!&lt;/p&gt;

&lt;p&gt;P.S. If you feel lazy to follow the steps described in the article, we've have a &lt;a href="https://github.com/TestMace/testmace-quick-start-project" rel="noopener noreferrer"&gt;repository&lt;/a&gt; with this project just for you. Select &lt;strong&gt;File&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Open project&lt;/strong&gt; and choose the &lt;strong&gt;Project&lt;/strong&gt; folder.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>codequality</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why TestMace has chosen Electron</title>
      <dc:creator>Dmitrii Snytkin</dc:creator>
      <pubDate>Tue, 12 Nov 2019 10:40:10 +0000</pubDate>
      <link>https://dev.to/dimansny/why-testmace-has-chosen-electron-p0k</link>
      <guid>https://dev.to/dimansny/why-testmace-has-chosen-electron-p0k</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/dimansny/we-built-an-ide-to-work-with-api-design-here-s-what-we-did-5dhe"&gt;last article&lt;/a&gt; we made a short introduction of our product. Today I’d like to tell you why we chose Electron for building our application.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why Desktop
&lt;/h1&gt;

&lt;p&gt;The web has been growing rapidly for the past 10-15 years. We stumble upon new tools for creating more functional and complex web applications every now and then. There even exist specific programming languages for web development that virtually  have no ready solutions for other fields. In our everyday life we have already partially replaced Microsoft Office and Thunderbird with Google Docs and Gmail interface.&lt;/p&gt;

&lt;p&gt;However the web can’t yet completely drive desktop out for a number of reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low web applications responsiveness. It may be caused by either client-server synchronization or poor Internet connection or single-threaded JavaScript or simply your resource hungry browser if your machine is not powerful enough. It should be noted that the problems mentioned above are to be solved, it’s just a matter of time. Web workers, in particular, are already &lt;a href="https://caniuse.com/#search=webworker"&gt;supported&lt;/a&gt; by all modern browsers that partially deal with the multithreading problem, and features like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer"&gt;SharedArrayBuffer&lt;/a&gt; allow to reduce memory copy overhead between the main thread and workers.&lt;/li&gt;
&lt;li&gt;Accessing local system resources. There are certain application classes (file managers, tweakers, daemons, and services) that can’t be implemented as web-applications (at least at the current state of their development).&lt;/li&gt;
&lt;li&gt;Restricted browser features. For instance, networking is restricted to sending http-request and web-sockets connection only. Lower-level things like tcp, upd-requests are unavailable.&lt;/li&gt;
&lt;li&gt;Intentional browser restrictions in terms of security. CORS, working with cookies, headers restrictions.&lt;/li&gt;
&lt;li&gt;Limited set of languages and approaches. Unlike web-applications, which are only written in Javascript, for desktop applications it is allowed to use any language up to assembler to achieve efficient use of system resources with the help of multithreading and low-level instructions. One should note that the situation is being improved  – say hello to transpilers from some languages to JavaScript. Moreover, compilation to WebAssembly allows to transfer your code from other languages (C++, C#, Rust, etc.) and often to enjoy significant performance improvement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, we can conclude that due to the above mentioned reasons TestMace should be a typical desktop application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We need to get access to the file system to work with projects.&lt;/li&gt;
&lt;li&gt;Fetch restrictions do not allow us to get full control over configuring and sending requests.&lt;/li&gt;
&lt;li&gt;We might need low-level optimizations to improve performance in the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Choosing a Tech Stack
&lt;/h1&gt;

&lt;p&gt;As we decided that our application should be a desktop one, we still need to choose the language and technologies we are going to use to implement it. As for the programming language, requirements are the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It should be statically typed.&lt;/li&gt;
&lt;li&gt;It should have huge and mature ecosystem: there should be both tried and tested libraries and IDE and other tools’ support.&lt;/li&gt;
&lt;li&gt;The majority of the team members must be familiar with the language.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is quite important. As a startup, we are interested in a fast product launch (in half a year), taking full advantage of internal team resources. Learning a new language and its ecosystem makes planning less predictable and may lead to certain mistakes in decision-making.&lt;/p&gt;

&lt;p&gt;Nevertheless, the requirements don’t seem so strict, and some languages as C#, TypeScript, Go meet them. We’ll be choosing technologies taking into account if there are implementations in these languages.&lt;/p&gt;

&lt;p&gt;It is way more exciting to choose software for user interface design. Requirements are the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It should be multiplatform (Windows, Linux, MacOS)&lt;/li&gt;
&lt;li&gt;A full set of build-in and external components&lt;/li&gt;
&lt;li&gt;Customizable components&lt;/li&gt;
&lt;li&gt;Markdown for interface description&lt;/li&gt;
&lt;li&gt;Good support&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now let’s look at some solutions that meet the requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qt (QML)
&lt;/h2&gt;

&lt;p&gt;Qt is a powerful toolkit for creating multiplatform applications. The latest versions of this framework contain Qt Quick component for writing apps using the declarative markup language QML. QT in general and QML in particular – are battle-tested solutions, that are used in almost all software development fields – from embedded systems to operating system shells.&lt;/p&gt;

&lt;p&gt;The main programming language of Qt is C++ (JavaScript can be used in QML). But still there are bindings to Qt and QML for other languages (here is for C#). However, only integration with python is officially &lt;a href="https://wiki.qt.io/Language_Bindings"&gt;supported&lt;/a&gt;. Everything else is just a third party’s implementation. And surely you won’t base your application on the library, that was developed by a small team of enthusiasts in their spare time.&lt;/p&gt;

&lt;p&gt;There also is &lt;a href="https://github.com/BrigJS/brig"&gt;Brig&lt;/a&gt; – NodeJS bindings for QML. What is so special about the project is its &lt;a href="https://www.youtube.com/watch?v=D6CnZfK723M"&gt;impressive demo&lt;/a&gt;. Yet, as it often happens with open source projects, developers do not pay due attention to their product, so it is also out of the game.&lt;/p&gt;

&lt;h2&gt;
  
  
  GTK
&lt;/h2&gt;

&lt;p&gt;This is a user interface design library, that initially was a part of the GIMP project and then became a separate project. There is the &lt;a href="https://glade.gnome.org/"&gt;Glade&lt;/a&gt; instrument for nice and easy UI development. The main language for GTK development is C, there are bindings for &lt;a href="https://www.gtk.org/language-bindings.php"&gt;all popular languages&lt;/a&gt; though. Besides, MonoDevelop – one of the most powerful IDE for C# development – was created with the help of &lt;a href="https://github.com/mono/gtk-sharp"&gt;C# bindings&lt;/a&gt;. Unfortunately, going deeper we see that the GTK# project got dusty – the last commit was in February, 2018, then – January, 2017 and 2016. One commit a year. It’s nothing, given the main GTK repository is being actively developed. So close…&lt;/p&gt;

&lt;h2&gt;
  
  
  Electron
&lt;/h2&gt;

&lt;p&gt;There has been so much fuss about this framework. Some like it for opportunity to transfer parts of their web-applications to desktop, others – hate it for being so resource hungry. Both sides make sense. Electron uses Node.js and Chromium’s rendering library under the hood. Basically, you create a typical web-application and wrap it into an executable file, and every application comes with its own version of Node.js and Chrome.&lt;/p&gt;

&lt;p&gt;There is only one major disadvantage – high (compared to other technologies) memory usage: a blank project takes 100-200 MB. Some would consider that to be a reason against the apps like that (hello, Skype). But let’s analyze the market. &lt;a href="https://electronjs.org/apps"&gt;A lot of&lt;/a&gt; popular applications are built using Electron (Slack, Skype, Discord, VSCode, Atom, Postman, Insomnia, etc.). Many of them are standards in their fields or are conquering users’ hearts (VSCode and Insomnia, for instance). People just use the tools that are good at solving their everyday tasks and ignore some side effects. On the other side, machines are getting more and more powerful (at least, RAM &lt;a href="https://techtalk.pcpitstop.com/2016/10/05/average-pc-memory-ram-continues-climb/"&gt;continues to climb&lt;/a&gt;), and less clients complain that “Chrome eats all RAM.” In summary, we reckon high memory usage will be quite irrelevant if the product can do the job well enough.&lt;/p&gt;

&lt;p&gt;The advantages of Electron are quite obvious:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Some things from the web-application can be reused.&lt;/li&gt;
&lt;li&gt;It is easier to find professionals in this sphere.&lt;/li&gt;
&lt;li&gt;A proven workflow ‘designer – layout designer – developer’ with plenty of useful tools for every stage.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Another benefit of ours is that the team has substantial experience in front-end development.&lt;/p&gt;

&lt;p&gt;We eventually decided to go for Electron as the main tool to develop our project. That also means we had to choose the TypeScript language for our application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;One of the main goals of the startup is the fast product launch, and, of course, we’d like to minimize the costs. This review was aimed at finding the tool that would help us in that. We believe, Electron is the best choice here. It’s been 1 year since we’ve started working on the project, and Electron still has no rivals. It seems we’re getting serious here 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  💥 Bonus 💥
&lt;/h2&gt;

&lt;p&gt;Also we’re glad to give you 👉 special 50% exclusive offer 👈 for TestMace professional version which includes a built in cloud synchronization for you team! The promo code is: &lt;code&gt;ELECTRON_BETTER&lt;/code&gt;. Promo code is valid for only two days! Have time to try the full power of professional tool for working with API! 💪&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>startup</category>
      <category>showdev</category>
    </item>
    <item>
      <title>We Built an IDE to work with API Design. Here's What We Did</title>
      <dc:creator>Dmitrii Snytkin</dc:creator>
      <pubDate>Thu, 07 Nov 2019 09:44:47 +0000</pubDate>
      <link>https://dev.to/dimansny/we-built-an-ide-to-work-with-api-design-here-s-what-we-did-5dhe</link>
      <guid>https://dev.to/dimansny/we-built-an-ide-to-work-with-api-design-here-s-what-we-did-5dhe</guid>
      <description>&lt;p&gt;Hello there! Today is the day when we’re ready to present to the IT community &lt;a href="http://testmace.com/"&gt;TestMace&lt;/a&gt;, our IDE for API design. Some of you may know about it from the previous article. However, we haven’t yet provided you with an overall review of our tool, so here you go.&lt;/p&gt;

&lt;h1&gt;
  
  
  Motivation
&lt;/h1&gt;

&lt;p&gt;We’d like to start by telling you the story on how we ended up with this feeling of creating our own advanced API tool at the first place. Here’s the list of features we suppose every IDE for API design should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating and sending requests and scenarios (request chains);&lt;/li&gt;
&lt;li&gt;writing different kinds of tests;&lt;/li&gt;
&lt;li&gt;test generation;&lt;/li&gt;
&lt;li&gt;working with API description, including importing fromSwagger, OpenAPI, WADL, etc.;&lt;/li&gt;
&lt;li&gt;mocking requests;&lt;/li&gt;
&lt;li&gt;great support of one or several scripting languages and integration with the most popular libraries;&lt;/li&gt;
&lt;li&gt;and so on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Follow your preferences to complete the list. Apart from IDE, it is also quite important to create a specific infrastructure like cloud synchronization, CLI tools, online monitoring service, etc. After all, the latest trends are about not only powerful features, but also a nice interface.&lt;/p&gt;

&lt;p&gt;Who will benefit from it? Apparently, those who are in any way connected with API development and testing, developers and testers in particular. While developers are often limited to sending single requests and running simple scenarios, in their main tool testers are going to need something more advanced, including powerful features for writing tests and ability to run them in CI.&lt;/p&gt;

&lt;p&gt;Having all that in mind, we started designing our product. Let’s look at what we have achieved so far.&lt;/p&gt;

&lt;h1&gt;
  
  
  Quick Start
&lt;/h1&gt;

&lt;p&gt;Let’s start with simply looking at our app. You can download it from &lt;a href="https://testmace.com/"&gt;our site&lt;/a&gt;. For now, all 3 main platforms are supported – Windows, Linux, and MacOS. Download the app, install it and run. Running it the first time, you’ll see this window:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A5-X1fzU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/t0d2ubx4r5z6x5gtqovf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A5-X1fzU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/t0d2ubx4r5z6x5gtqovf.png" alt="main window"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the + button in the top of content area to create your first request. The request tab should look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0fVvCWpM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/j61t2vvfa872p9vckw5q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0fVvCWpM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/j61t2vvfa872p9vckw5q.png" alt="request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s take a closer look at it. The request interface resembles popular rest clients interface, which makes migration from that kind of tools easier. Let’s send our first request to &lt;a href="https://next.json-generator.com/api/json/get/NJv-NT-U8"&gt;https://next.json-generator.com/api/json/get/NJv-NT-U8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NyckZELV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6piyu1ujkwifmgnnbwb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NyckZELV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6piyu1ujkwifmgnnbwb2.png" alt="response"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apparently, the response panel has nothing to surprise us with. But still you have to know, that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The response body represents a tree, that makes it more informative and allows to add some curious features described down below.&lt;/li&gt;
&lt;li&gt;There is the Assertions tab, that has a list of tests for this particular request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see, our tool can be used as a well-organized rest client. But sending requests is not what we’re here for. Now let’s talk about the main features and concepts of TestMace.&lt;/p&gt;

&lt;h1&gt;
  
  
  TestMace’s Main Features and Concepts
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Node
&lt;/h2&gt;

&lt;p&gt;TestMace’s workflow is distributed into different node types. The previous example illustrates how &lt;a href="https://docs.testmace.com/node-types/request-step"&gt;RequestStep&lt;/a&gt; node works. Some other node types are now available in the app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/request-step"&gt;RequestStep&lt;/a&gt;. This is a node that you use to create a request. It can have only one &lt;a href="https://docs.testmace.com/node-types/assertion-node"&gt;Assertion&lt;/a&gt; node as a child element.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/assertion-node"&gt;Assertion&lt;/a&gt;. This one is used for writing tests. It can be a child node only for a &lt;a href="https://docs.testmace.com/node-types/request-step"&gt;RequestStep&lt;/a&gt; node.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/folder"&gt;Folder&lt;/a&gt;. It allows to group &lt;a href="https://docs.testmace.com/node-types/folder"&gt;Folder&lt;/a&gt; and &lt;a href="https://docs.testmace.com/node-types/request-step"&gt;RequestStep&lt;/a&gt; nodes under it.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/project"&gt;Project&lt;/a&gt;. This is a root node, that is created automatically when you start a new project. It is functionally identical to a Folder node.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/link"&gt;Link&lt;/a&gt;. This is a link to Folder or RequestStep nodes. It allows to reuse requests and scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find nodes in scratches (a bottom left panel for quick creating one-time requests) and in project (a top left panel), that I’m going to show you next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project
&lt;/h2&gt;

&lt;p&gt;After running the app, you can see a Project line at the top left of the screen. That is the project tree root. When you run your project, a temporary project is created, and the path to it depends on your operating system. You can change it whenever you want.&lt;/p&gt;

&lt;p&gt;The main purpose of the project is to give you an ability to save your drafts in the file system, synchronize it via the version control system, run scenarios in CI, review changes, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variables
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.testmace.com/variables/user-variables"&gt;Variables&lt;/a&gt; is one of the core mechanisms of our app. Those of you who work with TestMace-like tools might already have it in mind. Variables is a way of saving shared data and communication between nodes. &lt;/p&gt;

&lt;p&gt;Environment variables in Postman and Insomnia are a great example of this. But we have gone beyond all that. In TestMace you can define your variables at the node level. Any node. There is also a mechanism of inheritance variables from parents and overriding variables in child elements. In addition, there are several default variables, which names start with $. Here are some of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$prevStep&lt;/code&gt; – a reference to the previous node variables;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$nextStep&lt;/code&gt; – a reference to the next node variables;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$parent&lt;/code&gt; – a reference to the parent node variables;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$response&lt;/code&gt; – a server response;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$env&lt;/code&gt; – current environment variables;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$dynamicVar&lt;/code&gt; – dynamic variables, that are being created during scenario or request run.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$env&lt;/code&gt; are basically just the Project node variables, but the variables set is different for every environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can access a variable using &lt;code&gt;${variable_name}&lt;/code&gt;. The value of that variable might contain another variable or even an expression. For instance, an url variable value may be the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://${host}:${port}/${endpoint}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It should be mentioned, that you can assign variables while running scripts. For example, quite often it is important to save authorization data (a token or full header) that come from the server after a successful login. TestMace allows you to store that data in parent’s dynamic variables. To avoid collision with existing static variables, dynamic variables have been placed in a separate object – &lt;code&gt;$dynamicVar&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenarios
&lt;/h2&gt;

&lt;p&gt;Taking advantage of the features stated above, you can run request scenarios. For example, create an &lt;strong&gt;entity&lt;/strong&gt; -&amp;gt; &lt;strong&gt;request an entity&lt;/strong&gt; -&amp;gt; &lt;strong&gt;delete an entity&lt;/strong&gt;. In this case, you can use a Folder node to group several RequestStep nodes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autocomplete Feature and Expression Value Highlighting
&lt;/h2&gt;

&lt;p&gt;To make working with variables more convenient, we added an autocomplete feature and variables’ values highlighting, that shows you what value each variable has. A picture paints a thousand words here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3I30KVXf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jzqa6wkxhchv08mcswzw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3I30KVXf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jzqa6wkxhchv08mcswzw.gif" alt="autocomplete"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that not only variables, but also such things as headers, some headers’ values (like Cotent-Type), protocols are autocompleted. With development of our product, the list is regularly updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Undo/Redo
&lt;/h2&gt;

&lt;p&gt;Ability to undo/redo changes is a practically useful feature, yet not every tool comes with it (including API tools). We’re here to change it!  Undo/redo works within the whole project, which allows you to undo not only changes to a particular node, but also its creating, deleting, moving and so on. The most critical operations need to be confirmed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Tests
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.testmace.com/node-types/assertion-node"&gt;Assertion node&lt;/a&gt; takes care of creating tests. One of the major features here is creating tests without programming using build-in editors.&lt;/p&gt;

&lt;p&gt;An assertion node is a number of assertions, each of which has its own type. There are several types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/assertion-node/untitled"&gt;Compare values&lt;/a&gt; – it simply compares two values. We have several comparison operators: &lt;code&gt;equal to&lt;/code&gt;, &lt;code&gt;not equal to&lt;/code&gt;, &lt;code&gt;greater than&lt;/code&gt;, &lt;code&gt;greater than or equal to&lt;/code&gt;, &lt;code&gt;less than&lt;/code&gt;, &lt;code&gt;less than or equal to&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/assertion-node/contains"&gt;Contains value&lt;/a&gt; – checks if a substring is present in a string.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/assertion-node/xpath"&gt;XPath&lt;/a&gt; – checks if there is a certain value in XML via selectors.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.testmace.com/node-types/assertion-node/script"&gt;JavaScript assertion&lt;/a&gt; – a random JavaScript script that returns true on success and false on failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that only the latter requires some programming skills, the other three are created with the help of graphical user interface. Here is an example of creating compare values assertion dialog:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MLsCFBvN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5b0o1dpz2byyzzbbno8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MLsCFBvN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5b0o1dpz2byyzzbbno8d.png" alt="assertion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quick assertions creation right from the response would be our icing on the cake. Just look at this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8L70agfj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ny9kfh6vfcndo9w115qq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8L70agfj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ny9kfh6vfcndo9w115qq.gif" alt="create assertion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, these assertions clearly have certain limitations, so you can use javascript assertions. Here TestMace provides you with a nice environment with autocomplete feature, syntax highlighting and even static analyzer.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Description
&lt;/h2&gt;

&lt;p&gt;TestMace allows not only to use API, but also to write &lt;a href="https://docs.testmace.com/node-types/api-description"&gt;documentation&lt;/a&gt;. The description itself has a hierarchical structure and fits the project naturally. In addition to that, you can import API descriptions from Swagger 2.0 / OpenAPI 3.0 formats. The description is not left aside, but fully integrates with the project: autocompletion of urls, HTTP headers, query parameters is available, and we’re planning to add tests to check if a response matches API description.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nodes Sharing
&lt;/h2&gt;

&lt;p&gt;Let’s say you need to share a bugged request or scenario with a colleague or just attach it to the bug. TestMace’s got it: &lt;a href="https://docs.testmace.com/other-features/import/shared"&gt;it allows&lt;/a&gt; you to serialize any node or a subtree in url. Just copy-paste and you have your request shared with another machine or project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human-Readable Format for Project Storing
&lt;/h2&gt;

&lt;p&gt;Each node is stored either in a separate .yml file (like Assertion node is) or in a folder with the node’s name containing index.yml file.&lt;br&gt;
That is how the file with the request from the previous example looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RequestStep&lt;/span&gt;
&lt;span class="na"&gt;assignVariables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="na"&gt;requestData&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GET&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://next.json-generator.com/api/json/get/NJv-NT-U8'&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="na"&gt;disabledInheritedHeaders&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="pi"&gt;[]&lt;/span&gt;
  &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="pi"&gt;[]&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Json&lt;/span&gt;
&lt;span class="na"&gt;jsonBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
&lt;span class="na"&gt;xmlBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
&lt;span class="na"&gt;textBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
&lt;span class="na"&gt;formData&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="pi"&gt;[]&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
&lt;span class="na"&gt;formURLEncoded&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="na"&gt;strictSSL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Inherit&lt;/span&gt;
&lt;span class="na"&gt;authData&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inherit&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Scratch &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As you can see, it’s totally readable. You can easily edit it manually if you need.&lt;/p&gt;

&lt;p&gt;The directory hierarchy is the same as the nodes hierarchy. For example, this scenario:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--750VXJ8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xupkjyclekbri9txg60p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--750VXJ8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xupkjyclekbri9txg60p.png" alt="project tree"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Is mapping in the file system to the following structure (only directory hierarchy is shown, but it should be clear):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wsfywCex--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fmxar1ojcpf36tcohnhk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wsfywCex--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fmxar1ojcpf36tcohnhk.png" alt="file representation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That simplifies the project review process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Import from Postman
&lt;/h2&gt;

&lt;p&gt;Having read all this, some of you may be wanting to try out our new product (aren’t you?) or even use it in your project (why the hell not). Well, you must be hesitating since you’ve got all your work done in Postman. In this case, TestMace supports &lt;a href="https://docs.testmace.com/other-features/import/postman"&gt;importing&lt;/a&gt; collections from Postman. It is without tests for now, but we may include it in our future releases.&lt;/p&gt;

&lt;h1&gt;
  
  
  Our Plans
&lt;/h1&gt;

&lt;p&gt;We’re hoping after reading all this many of you have found our product interesting. And it’s just a beginning! At the moment we’re fully involved in developing and I’m going to tell you about what we’re going to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud Synchronization
&lt;/h2&gt;

&lt;p&gt;That’s one of the most desirable features. Now we suggest you use the version control system for it, working on making everything in our app compatible with it. However, some of you may not be particularly happy with this workflow, so we’re planning to add cloud synchronization mechanism that you used to.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLI
&lt;/h2&gt;

&lt;p&gt;As I already mentioned, it’s hard to imagine any IDE product without integration with existing projects or workflow. CLI is essential for integrating tests written in TestMace into continuous integration process. We’re currently working on it, but in our early versions projects will run with a simple console report. In the future you’ll see reports in JUnit format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugin System
&lt;/h2&gt;

&lt;p&gt;Despite all functionality, our product can’t cover all possible use cases. Each project is unique, and there may be too many specific tasks. That is why we’ve been thinking to add SDK for plugins development, so that each individual user could meet their own needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  New Node Types
&lt;/h2&gt;

&lt;p&gt;Some use cases may require more node types, than we have now. We’re planning to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Script Node, which transforms and stores data using js and the corresponding API. This node type might be useful for writing something like pre-request and post-request scripts in Postman;&lt;/li&gt;
&lt;li&gt;GraphQL Node for graphql support;&lt;/li&gt;
&lt;li&gt;Custom Assertion Node to expand the set of existing assertions in the project;
The list is definitely not complete yet, and your feedback would help us update it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  FAQ
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;How is your product different from Postman?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The node concept allows to scale your product functionality with no limits.&lt;/li&gt;
&lt;li&gt;The human-readable format of the project and storing it in the file system makes it easier to work with the version control system.&lt;/li&gt;
&lt;li&gt;Creating tests without programming and advanced js support in the test editor (autocomplete feature, static analyzer).&lt;/li&gt;
&lt;li&gt;More sophisticated autocomplete feature and highlighting of current variables’ values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is this an open-source product?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, source files are not available, but in the future we’re considering to add this option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are you living on? :)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Along with the free version, there will soon be a paid one. It’ll first of all include the features, like synchronization that require the server side.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;We’re working hard to finally release a stable version of TestMace. We’ve received a positive feedback from our first users, so you can already safely try out our product. We would really appreciate your feedback as well, since it is impossible to create a great tool without close cooperation with the community. Contact us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official site: &lt;a href="https://client.testmace.com"&gt;https://testmace.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Telegram: &lt;a href="https://t.me/testmace"&gt;https://t.me/testmace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Slack: &lt;a href="https://testmaceslackin.herokuapp.com"&gt;https://testmaceslackin.herokuapp.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Facebook: &lt;a href="https://www.facebook.com/testmace"&gt;https://www.facebook.com/testmace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Issues-tracker: &lt;a href="https://github.com/TestMace/TestMace-issues"&gt;https://github.com/TestMace/TestMace-issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re looking forward to your comments!&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
