{"id":12250,"date":"2020-03-25T22:10:05","date_gmt":"2020-03-25T22:10:05","guid":{"rendered":"http:\/\/abstracta.us\/blog\/?p=12250"},"modified":"2025-05-05T21:23:01","modified_gmt":"2025-05-05T21:23:01","slug":"model-based-testing-using-state-machines","status":"publish","type":"post","link":"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/","title":{"rendered":"Model-Based Testing Using State Machines"},"content":{"rendered":"\n<h1>What is a state machine and how can you use one to improve your testing strategy?<\/h1><p><!-- Go to www.addthis.com\/dashboard to customize your tools --><script src=\"\/\/s7.addthis.com\/js\/300\/addthis_widget.js#pubid=ra-58d80a50fc4f926d\" type=\"text\/javascript\"><\/script><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/abstracta.us\/wp-content\/uploads\/2020\/03\/mark-fletcher-brown-nN5L5GXKFz8-unsplash-min-1024x683.jpg\" alt=\"\" class=\"wp-image-12274\"\/><\/figure>\n\n\n\n<p>When testing software systems, it\u2019s very important to build a mental model of what you understand about the expected behavior, the interactions between the user and the SUT (system under test), the conditions and the different situations that will help to determine its correctness. There are certain mechanisms to draw the model on paper &#8211; one of which is a state machine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"In_this_post_Ill_cover_model-based_testing_using_a_state_machine_and_how_it_can_help_improve_your_testing\"><\/span>In this post, I\u2019ll cover <strong>model-based testing using a state machine<\/strong> and how it can help improve your testing.<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>State machines are models for the behavior of a system or a part of a system. <\/strong>They\u2019re represented with graphs where the nodes correspond to the states and arrows to the transitions between said states.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/abstracta.us\/wp-content\/uploads\/2020\/03\/unnamed-min-2-1024x496.png\" alt=\"\" class=\"wp-image-12268\"\/><\/figure>\n\n\n\n<p>The image above shows a super simple and graphic example that models the behavior of a light bulb which can have one of two states at any time: on or off. The arrows show the transitions between these states which are associated with an action (pressing the light switch).<\/p>\n\n\n\n<p>These models are extremely useful in the area of \u200b\u200bsoftware development to abstractly model the behavior of a system, being able to understand it better and discuss with others what it\u2019s expected to do and what it isn\u2019t.<\/p>\n\n\n\n<p>From a testing point of view, state machines can be super useful, although unfortunately, they\u2019re quite underutilized in the industry.&nbsp;<\/p>\n\n\n\n<p>In light of that, here is what I\u2019ll share specifically in this post to help you get started:<\/p>\n\n\n\n<ul><li>A simple example of a state machine<\/li><li>A more complex, real case scenario<\/li><li>A tool that will help you apply this testing technique<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"A_Simple_Model\"><\/span>A Simple Model<br><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Let&#8217;s continue with the example of the light bulb. We can represent this everyday situation with the following state machine:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/abstracta.us\/wp-content\/uploads\/2020\/03\/Recurso-8@2x-min-1024x254.png\" alt=\"model-based testing light bulb example\" class=\"wp-image-12269\"\/><\/figure>\n\n\n\n<p>Let&#8217;s see in more detail how this model is composed:<\/p>\n\n\n\n<ul><li><strong>Status<\/strong>: The states are conditions in which a system is while waiting for one or more events (switch on, off, etc.). The same event can cause different behaviors for the different states (this distinguishes the states). For example, the same \u201cpress the switch\u201d event generates different actions depending on the state in which the system is located.&nbsp;<\/li><li><strong>Event<\/strong>: The \u201cexternal\u201d stimulus that the system receives that causes a change in its state. For example, the \u201cpress the switch\u201d event causes the light to change its state. Once an event occurs, the system can change its state, remain in the current state and \/ or execute an action.&nbsp;<\/li><li><strong>Action<\/strong>: An action is an operation that starts from an event. For example, after &#8220;pressing the switch&#8221; the &#8220;turns off&#8221; action is executed.<\/li><li><strong>Transition<\/strong>: A transition is represented by an arrow indicating that there is a change, a passage from one state to another. In each of these arrows, we can see concepts of guards (conditions), events and actions.&nbsp;<\/li><li><strong>Guard<\/strong>: A condition that must be met for the event to cause it to go through a certain transition. In the example, we could add one more transition (another arrow) that goes from \u201coff\u201d to \u201coff\u201d (a loop to the same state) by adding the guard that says \u201cthere is no electricity\u201d.&nbsp;<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/abstracta.us\/wp-content\/uploads\/2020\/03\/Recurso-12@2x-min-1024x310.png\" alt=\"state machine example for light bulb\" class=\"wp-image-12271\"\/><\/figure>\n\n\n\n<p>Now, let&#8217;s see how to generate test cases for state machines according to the coverage criteria.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"State_Machine_Coverage\"><\/span>State Machine Coverage<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>State machines can be used to design test cases that cover a system according to some coverage criteria. Some of these coverage criteria are:&nbsp;<\/p>\n\n\n\n<ul><li><strong>State Coverage<\/strong>: This criterion is satisfied when the test cases cover all the states<\/li><li><strong>Transition Coverage<\/strong>: All transitions are traversed by the test cases<\/li><li><strong>Transition Pair Coverage<\/strong>: For each state, all combinations of input and output transitions are covered<\/li><\/ul>\n\n\n\n<p>This type of technique is one of the most used in the world of <em>Model-based Testing (MBT)<\/em>, for which I recommend checking out <a href=\"http:\/\/www.harryrobinson.net\/\">Harry Robinson\u2019s work<\/a>.<\/p>\n\n\n\n<p>Following the example of the light bulb, let&#8217;s see what happens with these test cases:&nbsp;<\/p>\n\n\n\n<ul><li>Test case 1: The light bulb is off and without electricity, I press the switch.&nbsp;<\/li><li>Test case 2: The light bulb is on and without electricity, I press the switch.&nbsp;<\/li><li>Test case 3: The light bulb is on, I press the switch.&nbsp;<\/li><\/ul>\n\n\n\n<p>It is interesting to note that just with test case 2, you already have state coverage. If you wanted to cover all the transitions, then you need test cases 1, 2 and 3. In order to cover the pairs of transitions, you should make even more flows over the system. This shows how one criterion subsumes another.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"A_Realistic_Scenario_for_Testing_State_Machines\"><\/span>A Realistic Scenario for Testing State Machines<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Now, let&#8217;s go to an<strong> example that\u2019s a little more complex<\/strong> or more similar to what you\u2019d face when testing a system.&nbsp;<\/p>\n\n\n\n<p><strong>In this example, you\u2019ll see that we\u2019re not tied down to a single representation of state machines and this technique could be applied manually.<\/strong><\/p>\n\n\n\n<p>Imagine you\u2019re testing a <strong>system that manages inventory items<\/strong>. The objective is to design the test cases for the creation of items, taking into account the entire item\u2019s life cycle and the different people who have to perform different actions and validations on the information uploaded to the system.&nbsp;<\/p>\n\n\n\n<p>This is a great example of a scenario in which you could model the behavior of the items with a state machine and derive the test cases from it. The items may have different states and the expected behavior for each action or functionality of the system will depend on the item\u2019s state.<\/p>\n\n\n\n<p>The following figure presents a partial state machine for the concept, <em>item<\/em>. To the left of the figure you can see the actor involved in the task and, in this specific case, the guards are represented as decision points in the diagram.&nbsp;<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/abstracta.us\/wp-content\/uploads\/2020\/03\/Recurso-7@2x-min-756x1024.png\" alt=\"Inventory management system model-based testing example\" class=\"wp-image-12272\"\/><\/figure>\n\n\n\n<p>The states determine different behaviors of the instances of items. The transitions correspond to system functionalities that cause the item to change its behavior, its state.&nbsp;<\/p>\n\n\n\n<p><strong>The state machine shows the expected behavior of the entity, <\/strong><strong><em>item,<\/em><\/strong><strong> in its life cycle<\/strong>. What will be tested is to cover all the transitions and nodes of this diagram. The result is a set of sequences to follow about the state machine that defines the interesting test cases. For this state machine, they would be the following:<\/p>\n\n\n\n<ul><li>Case 1: Preliminary item entry, verify data and refuse purchase.<\/li><li>Case 2: Preliminary item entry, verify data and approve by the buyer responsible for the area.<\/li><li>Case 3: Preliminary item entry, verify data and approve by the buyer responsible for the area, complete the data by <em>trade marketing<\/em>, the purchasing department manager does not approve the purchase because it is a non-promotional and saturated item.<\/li><li>Case 4: Preliminary item entry, verify data and approve by the buyer responsible for the area, complete the data by <em>trade marketing<\/em>, the purchasing department manager does not approve the purchase for a promotional and saturated item.<\/li><li>Case 5: Preliminary item entry, verify data and approve by the buyer responsible for the area, complete the data by <em>trade marketing<\/em>, the purchasing department manager approves the purchase for a non-promotional and unsaturated item.<\/li><li>Case 6: Preliminary item entry, verify data and approve by the buyer responsible for the area, complete the data by <em>trade marketing<\/em>, the purchasing department manager approves the purchase for a promotional and saturated item.<\/li><\/ul>\n\n\n\n<p>So far, these are high-level test cases (abstract test cases). That is, there are only the functional sequences to be invoked and the conditions on the data. Then, you must define the specific data that allows you to run the tests on the system.<\/p>\n\n\n\n<p>At the time of execution, the state machine is used as an oracle (to determine if the result is valid or invalid), since it must be verified in each step whether the expected state was reached or not. Each abstract test case may correspond to one or more specific test cases based on the different data selected.<\/p>\n\n\n\n<p>So, from this example, we\u2019ve seen how you can model the expected state of a system with a graph and hence, derive test cases, taking into account the coverage criteria you want to achieve.&nbsp;<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Testing_State_Machines_with_GraphWalker\"><\/span>Testing State Machines with GraphWalker<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Although this testing can be done manually, there are tools that facilitate the generation of test cases from a state machine model, ensuring the desired level of coverage. One such tool is <a href=\"https:\/\/github.com\/GraphWalker\">GraphWalker<\/a> which we\u2019ll go over and look at some of its benefits.<\/p>\n\n\n\n<p>GraphWalker allows you to design a state machine in a graphic format and automatically generate test cases to cover the model based on different criteria.&nbsp;<\/p>\n\n\n\n<p>GraphWalker has an editor where you can create the model, like the one I made earlier of the light bulb, for example. To use this editor, I recommend you check <a href=\"https:\/\/github.com\/GraphWalker\/graphwalker-project\/wiki\/Offline\">the GraphWalker user manual<\/a> because, as of today, although it\u2019s not too complex, it\u2019s not too intuitive either.&nbsp;<br><\/p>\n\n\n\n<p>Once you generate the model, download it in the JSON format from which the GraphWalker application will generate a series of paths according to the coverage criteria chosen.&nbsp;<\/p>\n\n\n\n<p>For all options and details, I recommend reviewing the product documentation. In addition to what we saw here, the tool offers many more possibilities and it\u2019s also useful for automating the test execution, integrating with tools like Selenium.&nbsp;<\/p>\n\n\n\n<p>As an example, the following is an output of the program applied to the light bulb state machine, where you can see the sequence of steps that it suggests to follow in order to cover all the transitions.&nbsp;<\/p>\n\n\n\n<ul><li>{&#8220;CurrentElementName&#8221;: &#8220;Off&#8221;}<\/li><li>{&#8220;currentElementName&#8221;: &#8220;press switch \/ turns on light&#8221;}<\/li><li>{&#8220;currentElementName&#8221;: &#8220;On&#8221;}<\/li><li>{{&#8220;currentElementName&#8221;: &#8220;[there is electricity] press switch \/ turns off light&#8221;}<\/li><li>{&#8221; currentElementName &#8220;:&#8221; Off &#8220;}<\/li><li>{&#8221; currentElementName &#8220;:&#8221; [no electricity] press switch \/ no effect &#8220;}<\/li><li>{&#8221; currentElementName &#8220;:&#8221; Off &#8220;}<\/li><\/ul>\n\n\n\n<p>Different levels of coverage can guarantee us more or less exhaustiveness. Then, to decide what coverage to use in each case, consider the criticality of the functionality tested and the amount of time you have available for testing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"More_About_GraphWalker\"><\/span>More About GraphWalker<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>This GIF below shows in a very simple way, the concept of going through a state machine, which can be used for \u201cmanual\u201d testing as well as for automated testing.&nbsp;<\/p>\n\n\n\n<p>What\u2019s interesting about GraphWalker is that it allows you to have a bridge between the model and the test code, with which we can \u201cexecute\u201d the model and thus execute automated tests.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/abstracta.us\/wp-content\/uploads\/2020\/03\/unnamed-min-1.gif\" alt=\"\" class=\"wp-image-12251\"\/><\/figure>\n\n\n\n<p>To understand more about this concept, I recommend listening to talks by <a href=\"https:\/\/www.linkedin.com\/in\/krikar\/\">Kristian Karl<\/a> from Spotify, there are several that he has given about this, and <a href=\"https:\/\/www.youtube.com\/watch?v=psOThLDKOFc&amp;feature=emb_title\">here is just one of them<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Incorporate_State_Machine_Testing_for_Better_Test_Coverage\"><\/span>Incorporate State Machine Testing for Better Test Coverage<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>I hope after reading this, you feel motivated to use this useful and powerful technique and by doing so, help professionalize more and more the work that we do in testing.<\/p>\n\n\n\n<p>I\u2019d love to encourage you to try this model-based testing technique and GraphWalker. If you dare to share examples, repositories where you have been testing the tool, questions or comments, I\u2019d love to hear from you&#8230; leave a comment below!\u00a0<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Recommended_for_You\"><\/span>Recommended for You<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><a href=\"https:\/\/abstracta.us\/blog\/software-testing\/testing-strategy-software-testing-maturity-model\/\">Improve Your Software Testing Strategy: A Software Testing Maturity Model<\/a><br><a href=\"https:\/\/abstracta.us\/blog\/software-testing\/optimize-the-cost-of-software-testing\/\">How Can You Optimize the Cost of Software Testing?<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is a state machine and how can you use one to improve your testing strategy? When testing software systems, it\u2019s very important to build a mental model of what you understand about the expected behavior, the interactions between the user and the SUT (system&#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v14.0.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Model-Based Testing Using State Machines | Abstracta<\/title>\n<meta name=\"description\" content=\"Have you ever wondered how to use model-based testing with state machines? Here are examples and tips to help you with this technique.\" \/>\n<meta name=\"robots\" content=\"index, follow\" \/>\n<meta name=\"googlebot\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta name=\"bingbot\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Model-Based Testing Using State Machines | Abstracta\" \/>\n<meta property=\"og:description\" content=\"Have you ever wondered how to use model-based testing with state machines? Here are examples and tips to help you with this technique.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog about AI-powered quality engineering for teams building complex software | Abstracta\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/AbstractaQA\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-25T22:10:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-05T21:23:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/abstracta.us\/wp-content\/uploads\/2020\/03\/Copy-of-blog-image-6-1-min.png\" \/>\n\t<meta property=\"og:image:width\" content=\"560\" \/>\n\t<meta property=\"og:image:height\" content=\"315\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@fltoledo\" \/>\n<meta name=\"twitter:site\" content=\"@AbstractaUS\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/abstracta.us\/blog\/#website\",\"url\":\"https:\/\/abstracta.us\/blog\/\",\"name\":\"Blog about AI-powered quality engineering for teams building complex software | Abstracta\",\"description\":\"AI-powered quality engineering\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/abstracta.us\/blog\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/abstracta.us\/wp-content\/uploads\/2020\/03\/mark-fletcher-brown-nN5L5GXKFz8-unsplash-min-1024x683.jpg\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/#webpage\",\"url\":\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/\",\"name\":\"Model-Based Testing Using State Machines | Abstracta\",\"isPartOf\":{\"@id\":\"https:\/\/abstracta.us\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/#primaryimage\"},\"datePublished\":\"2020-03-25T22:10:05+00:00\",\"dateModified\":\"2025-05-05T21:23:01+00:00\",\"author\":{\"@id\":\"https:\/\/abstracta.us\/blog\/#\/schema\/person\/7421e539de0357d3adb0c69ed469a1c2\"},\"description\":\"Have you ever wondered how to use model-based testing with state machines? Here are examples and tips to help you with this technique.\",\"breadcrumb\":{\"@id\":\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/abstracta.us\/blog\/\",\"url\":\"https:\/\/abstracta.us\/blog\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/abstracta.us\/blog\/software-testing\/\",\"url\":\"https:\/\/abstracta.us\/blog\/software-testing\/\",\"name\":\"Software Testing\"}},{\"@type\":\"ListItem\",\"position\":3,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/\",\"url\":\"https:\/\/abstracta.us\/blog\/software-testing\/model-based-testing-using-state-machines\/\",\"name\":\"Model-Based Testing Using State Machines\"}}]},{\"@type\":[\"Person\"],\"@id\":\"https:\/\/abstracta.us\/blog\/#\/schema\/person\/7421e539de0357d3adb0c69ed469a1c2\",\"name\":\"Federico Toledo, Chief Quality Officer at Abstracta\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/abstracta.us\/blog\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6de7ec6536c4028b5c02ad4ec1b9af0d?s=96&d=blank&r=g\",\"caption\":\"Federico Toledo, Chief Quality Officer at Abstracta\"},\"description\":\"Co-founder and COO of Abstracta\",\"sameAs\":[\"https:\/\/twitter.com\/fltoledo\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/12250"}],"collection":[{"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/comments?post=12250"}],"version-history":[{"count":17,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/12250\/revisions"}],"predecessor-version":[{"id":13230,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/12250\/revisions\/13230"}],"wp:attachment":[{"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/media?parent=12250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/categories?post=12250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/tags?post=12250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}