{"id":335,"date":"2021-12-22T23:08:00","date_gmt":"2021-12-22T23:08:00","guid":{"rendered":"http:\/\/rainforestqa.com\/automated-functional-testing\/"},"modified":"2026-02-11T19:59:43","modified_gmt":"2026-02-11T19:59:43","slug":"automated-functional-testing","status":"publish","type":"post","link":"https:\/\/www.rainforestqa.com\/blog\/automated-functional-testing","title":{"rendered":"Automated functional testing 101: How &#038; when to start"},"content":{"rendered":"\n<p>Manually testing an application is time-consuming, costly, and difficult to scale as your application grows: as you add more features to your application, you have to add more functional tests. And getting those additional tests done usually means adding headcount.&nbsp;<\/p>\n\n\n\n<p><em>Automated<\/em> functional testing can speed up the testing process, provide more consistent results, and give one person the ability to manage the testing workload of five or more manual testers.&nbsp;<\/p>\n\n\n\n<p>But automated functional testing comes with its own challenges:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Most tools and frameworks don\u2019t actually test what the user sees\u2014they evaluate the application\u2019s code\u2014so they miss more bugs than manual testers.<\/li>\n\n\n\n<li>Most tools require programming skills, which leaves room for human error.<\/li>\n\n\n\n<li>For automated tests that evaluate an application\u2019s code, changes to the application\u2019s code can break these tests and require time-consuming maintenance.<\/li>\n<\/ul>\n\n\n\n<p>In this guide to automated functional testing, we\u2019ll cover everything you need to know to get started and avoid as many of these challenges as possible. We\u2019ll discuss:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Functional testing basics<\/li>\n\n\n\n<li>The evolution of functional testing tools<\/li>\n\n\n\n<li>How modern tools like Rainforest QA are changing functional testing<\/li>\n\n\n\n<li>When it makes sense to add functional software testing to your release process<\/li>\n<\/ul>\n\n\n\n<p><em>Ready to automate your functional testing? <a href=\"https:\/\/www.rainforestqa.com\/talk-to-sales\">Talk to us<\/a> about setting up a Rainforest plan that fits your needs.<\/em><\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.rainforestqa.com\/blog\/automated-functional-testing\/#Functional_testing_basics\" >Functional testing basics<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.rainforestqa.com\/blog\/automated-functional-testing\/#The_evolution_of_functional_testing_tools\" >The evolution of functional testing tools<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.rainforestqa.com\/blog\/automated-functional-testing\/#How_modern_tools_like_Rainforest_QA_are_changing_functional_testing\" >How modern tools like Rainforest QA are changing functional testing<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.rainforestqa.com\/blog\/automated-functional-testing\/#How_and_when_to_add_functional_test_automation_to_your_release_process\" >How and when to add functional test automation to your release process<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Functional_testing_basics\"><\/span>Functional testing basics<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Functional testing is the process of confirming that all the elements of an application work together as a whole and appear correctly in the user interface (UI) so that a user can perform desired actions.&nbsp;<\/p>\n\n\n\n<p><strong>Different types of functional testing include:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Integration testing.<\/strong> Testing combinations of modules that have already individually passed unit testing to make sure they work together.<\/li>\n\n\n\n<li><strong>Smoke testing.<\/strong> A small set of UI tests performed to ensure the basic functionalities of a new feature are working.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.rainforestqa.com\/blog\/automate-regression-testing\/\" target=\"_blank\" rel=\"noopener\"><strong>Regression testing<\/strong><\/a><strong>.<\/strong> A test suite executed right before releasing a new feature or product to ensure that the new changes didn\u2019t break any existing critical functionalities of the app.<\/li>\n\n\n\n<li><strong>API testing.<\/strong> A series of tests to make sure APIs return expected results with the desired level of performance.<\/li>\n<\/ul>\n\n\n\n<p>Unit testing is sometimes considered functional testing because it evaluates whether a unit of code behaves as intended. However, for the purposes of this article, we won\u2019t include it as a type of functional testing because it doesn\u2019t touch the user interface.&nbsp;<\/p>\n\n\n\n<p>For example, say you\u2019re building a calculator app. With unit testing, you can confirm the accuracy of the \u201csum\u201d function. When given the input of \u201c2+2,\u201d the function returns the answer \u201c4.\u201d But to be fully confident that the calculator will work for users, you need to test how it works from the UI.&nbsp;<\/p>\n\n\n\n<p>That\u2019s where functional testing comes in. Functional testing would verify that the correct numbers and signs are actually appearing in the UI. Even if the \u201csum\u201d function is working (i.e. the unit tests passed), a mistake in integrating other functionalities could cause a \u20182\u2019 to appear on the visual layer when the backend of the app sends a \u20183\u2019, causing the function to return the answer \u20185.\u2019<\/p>\n\n\n\n<p>Non-functional testing evaluates the app\u2019s performance in terms of speed, security, and reliability. For example, a functional test would verify that a user can successfully complete a signup process. A non-functional test might test how long the sign-up process would take if 3,000 people were trying to access the web application at the same time.&nbsp;<\/p>\n\n\n\n<p><strong>A few types of tests that fall under non-functional testing include:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Security testing:<\/strong> Tests used to verify security mechanisms are working properly (e.g., that credit card numbers are encrypted on the backend).<\/li>\n\n\n\n<li><strong>Load testing:<\/strong> Tests used to verify the application still responds under additional demands (e.g., 3,000 users access the site).<\/li>\n\n\n\n<li><strong>Performance testing:<\/strong> Tests used to measure variables such as speed and resolution.&nbsp;<\/li>\n\n\n\n<li><strong>Usability testing: <\/strong>Tests that evaluate how intuitive and easy-to-use the software will be for the end-user.&nbsp;<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_evolution_of_functional_testing_tools\"><\/span>The evolution of functional testing tools<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Before automated software testing, the only way to test your application was manually. It was common practice to jot down a few notes about the features that needed to be tested or create a spreadsheet of user paths (sometimes called data-driven testing). Then, someone would spend a considerable amount of time clicking through the application looking for bugs.&nbsp;<\/p>\n\n\n\n<p>Even with the many test automation tools available today, a lot of teams still start with <a rel=\"noopener\" href=\"https:\/\/www.rainforestqa.com\/blog\/manual-vs-automated-testing\" target=\"_blank\">manual testing<\/a> because it can be done without any additional training by whoever is available. Manual testing is a good option for test cases that frequently change or that require subjective judgment (\u201cDo the images look clear?\u201d). However, it\u2019s not a long term, scalable solution for all your functional testing.&nbsp;<\/p>\n\n\n\n<p>Teams run into these difficulties with manual testing:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Test execution is inconsistent and prone to human error, thanks to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Inattentional_blindness\" target=\"_blank\" rel=\"noopener\">inattentional blindness<\/a> resulting from rote, repetitive testing.<\/li>\n\n\n\n<li>Test execution is very time-consuming.&nbsp;<\/li>\n\n\n\n<li>Bugs found during manual testing can be hard for developers to reproduce because of variations between the tester\u2019s and the developer\u2019s testing environments.<\/li>\n\n\n\n<li>Testing is typically more expensive to execute on a per-hour basis because it relies on human resources instead of cheap computer processing power.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Eventually, teams usually find they need more test coverage than is feasible to build and maintain with manual testing. That\u2019s where automated testing comes in.&nbsp;<\/p>\n\n\n\n<p><strong>In 2004, Selenium was introduced as the first open-source web browser automation tool for software testing.<\/strong>&nbsp;<\/p>\n\n\n\n<p><a href=\"https:\/\/www.selenium.dev\/\" target=\"_blank\" rel=\"noopener\">Selenium<\/a> is a testing framework that helps developers write lines of code to make a browser mimic end-user interactions with a web page or application. The Selenium code searches for specific lines of code (i.e. locator IDs) that represent the presence of an element (such as a button) in the user interface. If the locator ID is found, the test assumes the element is visible and the test passes.&nbsp;<\/p>\n\n\n\n<p>As Selenium evolved, developers were able to run tests in parallel, author tests for any scripting language (such as Java or Python), use record-and-playback to write simple tests with Selenium IDE, and perform cross-browser testing with the Selenium Webdriver. This changed the face of software testing because suddenly:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tests could be repeated the exact same way every time with more control over what was being tested and with more consistent results.<\/li>\n\n\n\n<li>Developers could quickly execute multiple tests with a click of a button rather than sit and wait for someone to manually complete test steps.<\/li>\n<\/ul>\n\n\n\n<p>As use of Selenium became more common, other tools appeared that made it easier to write and organize automated test scripts and to run even more tests simultaneously. Some of the tools also made it easier to understand why tests failed by capturing screenshots of the UI or snapshots of the underlying code at the point of the failure.&nbsp;<\/p>\n\n\n\n<p>But even with these improvements and add-ons, doing automated functional testing with Selenium and its offshoots still presents several challenges:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It\u2019s very time-consuming to write tests because you have to write code for every assertion (e.g., Is the button shape visible and correct? Does the button read \u2018Sign up\u2019? Is it located in the top right corner?).<\/li>\n\n\n\n<li>Tests need to be constantly updated. Because Selenium works by interacting with the underlying code of an application (also called the DOM), Selenium test scripts rely on locator IDs to find elements (buttons, forms, etc.) and apply actions to them. These locators often change with app updates, which means the tests have to constantly get updated.<\/li>\n\n\n\n<li>It requires programming skills, which means your developers have to spend some of their time writing and maintaining UI tests rather than building new features, or you have to hire dedicated (and often expensive) QA engineers.<\/li>\n<\/ul>\n\n\n\n<p>In response to this, commercial tools started appearing that offered \u201cno-code\u201d testing solutions. However, most of these tools simply generate the code for you. You will still run into the problems of:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Having to update tests nearly every time the underlying code changes.<\/li>\n\n\n\n<li>Needing an engineer to understand why a test failed and keep tests up-to-date.<\/li>\n<\/ul>\n\n\n\n<p>Further, all testing solutions that test the underlying code\u2014without interacting with the visual layer\u2014may end up missing a lot of bugs that the majority of users would notice immediately.&nbsp;<\/p>\n\n\n\n<p><strong>The only way to get around these difficulties is to <\/strong><a href=\"https:\/\/www.rainforestqa.com\/blog\/automated-ui-testing\" target=\"_blank\" rel=\"noopener\"><strong>stop using code to test code<\/strong><\/a><strong>.<\/strong><\/p>\n\n\n\n<p>Rainforest QA is a no-code automated functional testing tool that mimics real user behavior by interacting with the UI on the visual layer rather than with the underlying code. This means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You\u2019re testing what the user actually sees, so you catch more bugs that actually affect users.<\/li>\n\n\n\n<li>From start to finish, you don\u2019t have to write a single line of code.<\/li>\n<\/ul>\n\n\n\n<p>The next section takes a detailed look at how Rainforest QA differs from all other tools that test the underlying code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_modern_tools_like_Rainforest_QA_are_changing_functional_testing\"><\/span>How modern tools like Rainforest QA are changing functional testing<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Rainforest QA uses pixel-matching to locate elements and verify all aspects of the element&nbsp; (i.e. color, text, shape, position, etc.). With code-based tools, you would need to write a separate test step (or line of code) for each aspect of the element. Rainforest tests can verify all of that with just one screenshot.&nbsp;<\/p>\n\n\n\n<p>To write or <a href=\"https:\/\/www.rainforestqa.com\/blog\/test-automation-maintenance\/\" target=\"_blank\" rel=\"noopener\">maintain a test<\/a> step in Rainforest QA:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Select from the dropdown menu of actions (click, fill, wait, observe, etc.).&nbsp;<\/li>\n\n\n\n<li>Click and drag to take a screenshot of the element you want to apply the action to, or specify how to apply the action (i.e. \u2018wait\u2019 for \u20183 seconds\u2019).<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/rainforestqa.com\/wp-content\/uploads\/2023\/02\/61b250fa0b013466232fafc2_Add20a20Click20Action.gif\" alt=\"Adding a click action in Rainforest\"\/><\/figure>\n\n\n\n<p><strong>You can also choose to embed one test into another test to speed up test creation (and test maintenance).<\/strong>&nbsp;<\/p>\n\n\n\n<p>For example, if you have a test for a signup flow, you can embed that test into every other test that starts with a signup flow.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/rainforestqa.com\/wp-content\/uploads\/2023\/02\/61b251d647904d53ca291ea5_quality-assurance-metrics-3.gif\" alt=\"\"\/><\/figure>\n\n\n\n<p>Once you\u2019ve written or embedded every test step, you can playback the test to verify it will run as intended. Rainforest QA also offers an API, CLI, and a CircleCI Orb so developers can kick off a suite of Rainforest tests along with their unit tests and integration tests.&nbsp;<\/p>\n\n\n\n<p>Finally, Rainforest allows for multiple tests to be executed simultaneously on our cloud of virtual machines. You can run tests on the latest and older versions of Chrome, Firefox, Safari, and Microsoft Edge.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tests Don\u2019t Break with Minor Changes to the Underlying Code<\/h3>\n\n\n\n<p>All code-based automation tools look for locators in the underlying code to verify if an element is visible. For example, let&#8217;s say you want to verify that a message saying \u2018signup was successful\u2019 appears at the end of a signup process. Code-based tests will search through the underlying code for the element locator of the message. If the locator is present, the test will pass.&nbsp;<\/p>\n\n\n\n<p>The problem with this is that even the <em>slightest<\/em> change in the element locator can break your test\u2014even if the end results look identical to the user. Maybe your team renamed the locator during an update, or accidentally missed a letter in the locator when creating the test. Either way, a code based test would fail because it couldn\u2019t find an exact match, even though the visual element would look and act the same way for the user.<\/p>\n\n\n\n<p>Because Rainforest tests use pixel-matching to verify elements, they are less susceptible to minor changes in the underlying code. In fact, a Rainforest test will only fail if there is a visual change in the UI\u2014which is more likely to represent a real bug.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test Actions Outside of the Browser<\/h3>\n\n\n\n<p>Most automation solutions can only generate scripts that stay inside a single browser tab. With Rainforest\u2019s proprietary automation, you can create tests that open new tabs and new windows, open and close browsers, and even interact with desktop apps.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"3-minute demo of Rainforest QA test automation\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/h2UB3KOY7zc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>For example, <a href=\"https:\/\/www.youtube.com\/watch?v=0-vHwl6vNAw\" target=\"_blank\" rel=\"noopener\">the video walkthrough shown above<\/a> covers how to create a test that saves a file to the desktop from one location, and then uploads the file to Google Drive.<\/p>\n\n\n\n<p>While Rainforest is optimized to be an <a href=\"https:\/\/www.rainforestqa.com\/blog\/web-application-automated-testing-tools\" target=\"_blank\" rel=\"noreferrer noopener\">automated testing tool for web applications<\/a>, this feature helps test how your app interacts with desktop apps, how it interacts with browsers with ad-blockers, and other complex functions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quickly Understand and Report Every Failure with Video Playbacks and Integrations<\/h3>\n\n\n\n<p>Rainforest records a video of every test (whether the test passes or fails) to make it easier to debug issues. Test results also include HTTP logs and JSON browser logs to help with debugging.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/rainforestqa.com\/wp-content\/uploads\/2023\/02\/61b250280b013443202f9bdd_quality-assurance-metrics-4.png\" alt=\"Rainforest Signupflow Element Mismatch\"\/><\/figure>\n\n\n\n<p>Rainforest QA also integrates with tools like Slack and Microsoft Teams, so you can get instant notifications for any test failure. If you integrate with Jira, every time you need a bug to be fixed, you can automatically create a ticket for the software development team that includes a video recording of the test and relevant logs.&nbsp;<\/p>\n\n\n\n<p>This dramatically reduces the amount of time it takes to triage bugs.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_and_when_to_add_functional_test_automation_to_your_release_process\"><\/span>How and when to add functional test automation to your release process<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The most important factor to consider when adding automated functional testing to your release process is the stability of your product.&nbsp;<\/p>\n\n\n\n<p>If you have a consistent series of functional tests that don&#8217;t change very often and get run frequently, it\u2019s likely that automation could save you a lot of time and money.&nbsp;<\/p>\n\n\n\n<p>However, if your product or feature is still early-on in the development cycle, with major code changes occurring on a regular basis, it\u2019s not time to automate yet. You\u2019re better off waiting until the application is more stable.<\/p>\n\n\n\n<p>Some test cases will never be a good fit for automation, which is why the Rainforest platform also offers <a href=\"https:\/\/www.rainforestqa.com\/features\/crowdsourced-testing\" target=\"_blank\" rel=\"noopener\">on-demand manual testing<\/a> by testers in our worldwide community of QA specialists. With one platform, you can scale up manual and automated testing without adding headcount.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Get started with automated functional testing with Rainforest QA<\/h2>\n\n\n\n<p><a href=\"https:\/\/www.rainforestqa.com\/blog\/how-to-automate-testing\" target=\"_blank\" rel=\"noopener\">Rainforest automation<\/a> enables your team to move faster\u2014<em>without<\/em> breaking things. It\u2019s easy for teams to get started with automated UI testing and build as you go in an agile environment.&nbsp;<\/p>\n\n\n\n<p>You don\u2019t need to learn a new programming language, you don\u2019t need to buy additional services from other vendors to run or manage your tests, and anyone on your team can create, run, maintain, debug, and interpret tests.&nbsp;<\/p>\n\n\n\n<p>It\u2019s a fast and scalable all-in-one solution that\u2019s appropriate for teams that are just dipping their toes into automated testing, as well as QA-mature teams doing continuous testing with a suite of 500+ software tests.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.rainforestqa.com\/talk-to-sales\">Talk to us<\/a> about setting up a Rainforest plan that fits your needs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to create automated functional tests and overcome basic challenges so you can do more testing faster.<\/p>\n","protected":false},"author":28,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","inline_featured_image":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-335","post","type-post","status-publish","format-standard","hentry","category-test-automation"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/posts\/335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/comments?post=335"}],"version-history":[{"count":11,"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/posts\/335\/revisions"}],"predecessor-version":[{"id":3507,"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/posts\/335\/revisions\/3507"}],"wp:attachment":[{"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/media?parent=335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/categories?post=335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rainforestqa.com\/blog\/wp-json\/wp\/v2\/tags?post=335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}