{"id":9,"date":"2026-03-13T22:42:47","date_gmt":"2026-03-13T22:42:47","guid":{"rendered":"https:\/\/harmonic-framework.com\/?page_id=9"},"modified":"2026-04-08T15:31:21","modified_gmt":"2026-04-08T20:31:21","slug":"boundary-driven-testing","status":"publish","type":"page","link":"https:\/\/harmonic-framework.com\/es\/methodologies\/boundary-driven-testing\/","title":{"rendered":"Boundary-Driven Testing"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Boundary-Driven Testing<\/h1>\n\n\n\n<p style=\"font-size:20px\">Testing difficulty is architectural evidence. When a component cannot be exercised in isolation, the problem is not the tests \u2014 it is the structure.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Problem<\/h2>\n\n\n\n<p>The conventional framing of testing as a discipline separate from design produces a particular kind of pain. Teams adopt frameworks, mandate coverage minimums, and write guidelines about what to test. The tests improve. The pain persists. A change to a business rule breaks seventeen tests, most of which are not about business rules. An integration test requires spinning up four services to assert one value. An end-to-end test passes in isolation and fails in CI for reasons nobody can reproduce. More coverage, more pain.<\/p>\n\n\n\n<p>The problem is structural, not methodological. The tests are not wrong. The structure the tests are attempting to exercise is wrong. Components have absorbed responsibilities they should not have. Dependencies are hidden rather than declared. Boundaries have been drawn in the wrong place, or not drawn at all. No amount of better tooling, higher coverage requirements, or more disciplined test writing fixes a structural problem. Fix the structure; the tests follow.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Core Insight<\/h2>\n\n\n\n<p>The test spiral \u2014 unit, integration, end-to-end, system, user acceptance \u2014 is not a testing methodology. <strong>It is an architectural map.<\/strong> Each ring of the spiral corresponds to a level of architectural scope, and that scope is determined entirely by where boundaries have been placed.<\/p>\n\n\n\n<p>Get the boundaries right and the spiral populates itself: each role has clear targets, predictable scope, and low maintenance overhead. Get them wrong and the spiral collapses \u2014 unit tests become integration tests in disguise, E2E tests become the only reliable safety net, and the entire suite grows expensive while providing diminishing confidence.<\/p>\n\n\n\n<p>In a system with no meaningful component boundaries, unit scope and system scope are the same thing. There is nothing below the full system that can be isolated. The spiral collapses into E2E by default, because E2E is the only level at which anything coherent can be exercised.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing Is Not Separate from Design<\/h2>\n\n\n\n<p>A component designed around a coherent responsibility, with explicit inputs, explicit outputs, and dependencies passed rather than acquired, is <strong>inherently testable<\/strong>. No additional effort is required to make it so. The same structural choices that allow the component to change without cascading effects allow it to be tested without elaborate setup.<\/p>\n\n\n\n<p>The inverse is equally true. A component that cannot be unit-tested without mocking half the system is not badly tested \u2014 it is badly structured. The test difficulty is diagnostic. It reveals that the component has absorbed responsibilities it should not have, or that its dependencies are implicit rather than declared, or that the boundary between it and its collaborators has been drawn in the wrong place.<\/p>\n\n\n\n<p>This is why the structural models defined in VBD and EBD are also testing models. The same role taxonomy that makes components replaceable makes them mockable. The same communication rules that prevent coupling prevent test contamination. The same line that isolates change isolates test scope.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Test Profiles by Role<\/h2>\n\n\n\n<p>Each component role in VBD and EBD has a characteristic test profile \u2014 not assigned arbitrarily, but derived from its structural position, responsibilities, and communication rules. Every role carries unit tests. The weight and character of those tests differs by role. Integration tests arise at the seams between roles.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Engines \u2014 The Unit Test Core<\/h3>\n\n\n\n<p>Engines are the most logic-dense role and the natural home of the unit test suite. An Engine encapsulates business rules: given inputs, apply policy, produce a result. It has no workflow awareness, no sibling Engine dependencies, and no reason to reach outward beyond a Resource Accessor \u2014 which it receives through an explicit, mockable interface.<\/p>\n\n\n\n<p>This structural position is what makes Engines straightforwardly testable. Mock the Accessor, supply controlled inputs, assert on the output. The Engine&#8217;s communication constraints ensure there is nothing else to mock. The test scope is exactly the Engine and nothing more. Every business rule, every policy variant, every edge case and failure mode belongs here \u2014 and each one is fast, isolated, and cheap to run.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Mock the Resource Accessor only \u2014 nothing else should be reachable<\/li><li>Test every business rule, policy variant, and edge case<\/li><li>Test every failure mode the Engine can produce<\/li><li>Engine unit tests are the densest and most numerous in the suite<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Flows \u2014 The EBD Equivalent<\/h3>\n\n\n\n<p>Flows in EBD occupy the same structural position as Engines in VBD. A Flow receives shared state from the Experience, steps through Interactions, and emits a completion event carrying accumulated state upward. Its rule against calling sibling Flows and its prohibition from making direct backend calls keep the unit scope tight.<\/p>\n\n\n\n<p>Mock the backend call at the Experience boundary. Simulate Interaction events through a test harness. Assert on what the Flow emits at completion, what it emits on skip, and how it handles each conditional path through its Interaction sequence. The Flow&#8217;s behavior is fully exercisable without a running backend or a real browser environment.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Managers \u2014 Orchestration Under Test<\/h3>\n\n\n\n<p>Managers carry unit tests, but the character of those tests differs from Engine tests. An Engine is asserting business rules \u2014 the bulk of the domain logic lives here and demands exhaustive coverage. A Manager is asserting orchestration: given this response from an Engine, did the Manager route correctly? Given a domain failure, did it handle and respond appropriately? Given multiple Engines in sequence, does it compose them in the right order with the right inputs?<\/p>\n\n\n\n<p>Manager unit tests are comparatively fewer than Engine tests because the Manager has less behavior to assert directly. It does not compute \u2014 it coordinates. What it does assert is consequential: every state that can arrive from its collaborators, and every routing decision that follows. Mock all collaborators. Feed controlled responses representing every state each contract can produce. Verify the Manager&#8217;s decisions, not its collaborators&#8217; behavior.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Mock all Engines and Resource Accessors<\/li><li>Assert the orchestration sequence \u2014 which components are called, in what order, with what inputs<\/li><li>Assert every routing decision: success paths, domain failures, unexpected errors<\/li><li>Fewer tests than Engine \u2014 not because rigor is lower, but because the behavior surface is narrower<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Experiences \u2014 The EBD Equivalent<\/h3>\n\n\n\n<p>Experiences in EBD mirror Managers in VBD at the orchestration layer. An Experience composes Flows, holds accumulated journey state, dispatches to the backend, and advances the journey in response to Flow completion and skip signals. Unit tests assert journey composition logic: which Flows execute, in what order, under what conditions, and how the Experience responds to each possible signal from each Flow. The backend is mocked. Flows are mocked.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Resource Accessors \u2014 Translation Under Test<\/h3>\n\n\n\n<p>Accessors sit at the system&#8217;s external boundary. Their job is translation: convert a domain request into an external call, convert the response back. Whether the external system is reachable, whether it is correctly provisioned, whether it performs within acceptable bounds \u2014 none of these are Accessor concerns. They belong to system testing and deployment verification.<\/p>\n\n\n\n<p>Unit tests for an Accessor verify the translation. Mock the data source driver, control what it returns, assert that the Accessor&#8217;s output matches the expected domain representation. The Accessor has no business connecting to a real database in a unit or integration test. Its correctness is about the translation. The infrastructure&#8217;s correctness is about the infrastructure.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Interactions and Utilities \u2014 Narrow and Fast<\/h3>\n\n\n\n<p>Interactions are atomic. They render, receive user input, and emit events. They carry no flow logic, make no backend calls, and have no awareness of adjacent components. Render in a harness, simulate the input event, assert what was emitted. Props and callbacks are the entire interface \u2014 no mocks needed.<\/p>\n\n\n\n<p>Utilities are simpler still: inputs in, outputs out, no side effects. Given input X, assert output Y. The only exception is a Utility wrapping an external sink \u2014 a log transport, a telemetry exporter \u2014 where the sink gets mocked. Everything else is pure function territory.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Test Profiles at a Glance<\/h2>\n\n\n\n<p>Select a component role to see its test level, what it validates, and what gets mocked.<\/p>\n\n\n\n<div class=\"bdt-viz\">\n  <div class=\"bdt-selector\">\n    <div class=\"bdt-group\">\n      <div class=\"bdt-group-label\">VBD<\/div>\n      <button class=\"bdt-pill\" data-role=\"manager\">Manager<\/button>\n      <button class=\"bdt-pill\" data-role=\"engine\">Engine<\/button>\n      <button class=\"bdt-pill\" data-role=\"accessor\">Resource Accessor<\/button>\n      <button class=\"bdt-pill\" data-role=\"utility\">Utility<\/button>\n    <\/div>\n    <div class=\"bdt-divider-v\"><\/div>\n    <div class=\"bdt-group\">\n      <div class=\"bdt-group-label\">EBD<\/div>\n      <button class=\"bdt-pill\" data-role=\"experience\">Experience<\/button>\n      <button class=\"bdt-pill\" data-role=\"flow\">Flow<\/button>\n      <button class=\"bdt-pill\" data-role=\"interaction\">Interaction<\/button>\n      <button class=\"bdt-pill\" data-role=\"utility-ebd\">Utility<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"bdt-card\" data-role=\"engine\">\n    <div class=\"bdt-card-grid\">\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Test Level<\/span><span class=\"bdt-cell__value\">Unit + Integration<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Validates<\/span><span class=\"bdt-cell__body\">Business rules, policies, every variant and edge case; correct use of the Accessor contract<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Mock<\/span><span class=\"bdt-cell__body\">Resource Accessor \u2014 at both levels<\/span><\/div>\n    <\/div>\n    <div class=\"bdt-desc\">The densest test surface in the system. Unit tests cover every business rule, every policy variant, every failure mode \u2014 the Accessor is mocked, scope is exactly the Engine. Integration tests verify the Engine \u2192 Resource Accessor seam: does the Engine call the Accessor with correct inputs? Does it handle every state the Accessor&#8217;s contract can return? The Accessor is still mocked \u2014 you are feeding it controlled responses. No database, no infrastructure. The integration test verifies the contract at the seam, not the components on either side of it.<\/div>\n  <\/div>\n\n  <div class=\"bdt-card\" data-role=\"manager\">\n    <div class=\"bdt-card-grid\">\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Test Level<\/span><span class=\"bdt-cell__value\">Unit + Integration<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Validates<\/span><span class=\"bdt-cell__body\">Orchestration sequence, routing decisions, response handling at each seam<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Mock<\/span><span class=\"bdt-cell__body\">All Engines and Accessors \u2014 at both levels<\/span><\/div>\n    <\/div>\n    <div class=\"bdt-desc\">Manager unit tests are fewer than Engine tests \u2014 not because rigor is lower, but because the behavior surface is narrower. The Manager does not compute; it coordinates. Unit tests assert orchestration decisions: which Engine was called, with what inputs, and how every response state was routed. Integration tests focus on the seam contracts: does the Manager call each Engine with the correct inputs? Does it correctly handle every state those mocked Engines can return? Engines are still mocked \u2014 you are feeding them controlled responses, not running them. The integration test verifies the wiring, not the components on either end of it.<\/div>\n  <\/div>\n\n  <div class=\"bdt-card\" data-role=\"accessor\">\n    <div class=\"bdt-card-grid\">\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Test Level<\/span><span class=\"bdt-cell__value\">Unit<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Validates<\/span><span class=\"bdt-cell__body\">Translation: domain request \u2192 external call shape, response \u2192 domain object<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Mock<\/span><span class=\"bdt-cell__body\">Data source driver only<\/span><\/div>\n    <\/div>\n    <div class=\"bdt-desc\">The Accessor&#8217;s correctness is about the translation, not the infrastructure. Whether the external system is reachable is a system-level fact, not a test target. Mock the driver, control what it returns, assert the mapping. No live database needed.<\/div>\n  <\/div>\n\n  <div class=\"bdt-card\" data-role=\"flow\">\n    <div class=\"bdt-card-grid\">\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Test Level<\/span><span class=\"bdt-cell__value\">Unit<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Validates<\/span><span class=\"bdt-cell__body\">Progression through Interactions, completion events, conditional paths<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Mock<\/span><span class=\"bdt-cell__body\">Backend call at Experience boundary<\/span><\/div>\n    <\/div>\n    <div class=\"bdt-desc\">Same principle as Engine. Simulate Interaction events through a test harness, assert on what the Flow emits at completion and on skip. The rule against sibling Flow calls keeps the scope tight \u2014 the Flow is fully exercisable without a running backend or real browser environment.<\/div>\n  <\/div>\n\n  <div class=\"bdt-card\" data-role=\"experience\">\n    <div class=\"bdt-card-grid\">\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Test Level<\/span><span class=\"bdt-cell__value\">Unit + Integration<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Validates<\/span><span class=\"bdt-cell__body\">Journey composition, Flow sequencing, completion and skip handling<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Mock<\/span><span class=\"bdt-cell__body\">Backend + Flows \u2014 at both levels<\/span><\/div>\n    <\/div>\n    <div class=\"bdt-desc\">The EBD equivalent of the Manager. Unit tests assert journey composition: which Flows execute, in what order, and how the Experience handles every signal each Flow can emit. Integration tests verify the seam contracts: does the Experience pass correct state to each Flow, and handle every signal those mocked Flows can return? Flows are still mocked. The backend is always mocked. You are verifying the wiring of the journey, not what happens inside each Flow.<\/div>\n  <\/div>\n\n  <div class=\"bdt-card\" data-role=\"interaction\">\n    <div class=\"bdt-card-grid\">\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Test Level<\/span><span class=\"bdt-cell__value\">Unit<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Validates<\/span><span class=\"bdt-cell__body\">Renders correctly, accepts input, emits the right events<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Mock<\/span><span class=\"bdt-cell__body\">Nothing \u2014 props and callbacks are the entire interface<\/span><\/div>\n    <\/div>\n    <div class=\"bdt-desc\">Atomic and indivisible. Render in a harness, simulate the input event, assert what was emitted. No flow logic, no backend calls, no awareness of adjacent components. The test surface is as narrow as the component.<\/div>\n  <\/div>\n\n  <div class=\"bdt-card\" data-role=\"utility\">\n    <div class=\"bdt-card-grid\">\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Test Level<\/span><span class=\"bdt-cell__value\">Unit<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Validates<\/span><span class=\"bdt-cell__body\">Pure inputs and outputs, no side effects<\/span><\/div>\n      <div class=\"bdt-cell\"><span class=\"bdt-cell__label\">Mock<\/span><span class=\"bdt-cell__body\">External sink only, if applicable<\/span><\/div>\n    <\/div>\n    <div class=\"bdt-desc\">Given input X, assert output Y. No domain knowledge, no workflow context \u2014 pure function territory. The only exception is a Utility wrapping an external sink (a log transport, a telemetry exporter), where the sink gets mocked. Everything else requires no setup at all.<\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function() {\n  var wrap   = document.currentScript.parentElement;\n  var pills  = wrap.querySelectorAll('.bdt-pill');\n  var cards  = wrap.querySelectorAll('.bdt-card');\n  var active = null;\n  var cardAlias = { 'utility-ebd': 'utility' };\n  function resolveCard(role) { return cardAlias[role] || role; }\n  function activate(role) {\n    active = role;\n    pills.forEach(function(p) { p.classList.toggle('active', p.dataset.role === role); });\n    var card = resolveCard(role);\n    cards.forEach(function(c) { c.classList.toggle('visible', c.dataset.role === card); });\n  }\n  activate('manager');\n  pills.forEach(function(pill) {\n    pill.addEventListener('click', function() {\n      var role = pill.dataset.role;\n      if (active === role) {\n        active = null;\n        pills.forEach(function(p) { p.classList.remove('active'); });\n        cards.forEach(function(c) { c.classList.remove('visible'); });\n      } else {\n        activate(role);\n      }\n    });\n  });\n})();\n<\/script>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Integration Seams<\/h2>\n\n\n\n<p>Integration tests verify the seams between roles \u2014 not individual components in isolation. Everything is still mocked at the external boundary. Real external systems do not enter until E2E. The distinction from unit tests is scope, not realism: a unit test exercises one component against mocked dependencies; an integration test exercises the collaboration between two components against mocked dependencies at the outer edge.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Manager \u2192 Engine<\/h3>\n\n\n\n<p>Does the Manager invoke the Engine with the correct inputs? Does it handle every state the Engine&#8217;s contract can emit \u2014 success, domain failure, unexpected error \u2014 and route accordingly? The Engine is mocked. Feed it controlled responses representing each state it might return. What you are testing is the Manager&#8217;s response to each, not the Engine&#8217;s behavior.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Engine \u2192 Resource Accessor<\/h3>\n\n\n\n<p>Does the Engine correctly use the Accessor&#8217;s contract? Does it handle all return states \u2014 including partial results, empty sets, and infrastructure errors? The Accessor is mocked. No database is involved. You are testing whether the Engine correctly interprets the Accessor&#8217;s interface and handles everything the contract allows.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Manager \u2192 Resource Accessor<\/h3>\n\n\n\n<p>Managers sometimes interact with Accessors directly \u2014 for reads that inform orchestration decisions, or for state persistence the Manager owns. Test these paths the same way: mock the Accessor, exercise the Manager&#8217;s handling of every response state the Accessor&#8217;s contract defines.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Experience \u2192 Flow (EBD)<\/h3>\n\n\n\n<p>Does the Experience pass correct shared state to each Flow? Does it handle Flow completion events and skip signals correctly? Does it advance the journey as designed when Flows complete in sequence, complete early, or signal that conditions for execution were not met? The backend is mocked. Flows are mocked. You are verifying journey composition \u2014 not backend behavior or Flow-level logic.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Mock Placement Is Architectural Evidence<\/h2>\n\n\n\n<p>Where you place mocks tells you where your boundaries are. Where you are <em>forced<\/em> to place mocks tells you where your boundaries <em>should<\/em> be.<\/p>\n\n\n\n<p>The rule: <strong>mock at the role boundary, not inside the role.<\/strong> Each component role has one natural mock point \u2014 the interface at which it hands off to the next tier. Mock that interface and nothing else.<\/p>\n\n\n\n<p>When a unit test requires mocking more than the single boundary below the component under test, something is wrong. Either the component has absorbed responsibilities that belong at a different tier, or its dependencies are implicit rather than injected, or a Resource Accessor is missing and the component is reaching directly into infrastructure it should not see. Mock proliferation is always a structural signal \u2014 not a testing problem, and not a problem that better mocking frameworks solve.<\/p>\n\n\n\n<p>The inverse is also worth examining. An Engine unit test that requires no mocks at all is either genuinely pure-computation \u2014 which is fine \u2014 or is only exercising the easy path through logic that silently delegates to collaborators the test never reaches. Coverage numbers tell you how many lines ran. They do not tell you whether the logic that matters was actually exercised.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Scenarios Validate Architecture and Tests Simultaneously<\/h2>\n\n\n\n<p>VBD and EBD both use core scenarios as architectural validation mechanisms. A core use case in VBD should be traceable through the component hierarchy without bypassing communication rules. A core user journey in EBD should trace through Experience \u2192 Flow \u2192 Interaction without boundary leakage. If a scenario requires an Engine to call another Engine, or a Flow to call the backend directly, the boundaries need adjustment \u2014 not the test.<\/p>\n\n\n\n<p>These same scenarios are the test scenarios that matter most. Scenarios that validate structural boundaries naturally exercise the most load-bearing code paths, the most significant collaborations, and the most complete representations of what the system is actually for. The same scenario, traced at unit scope, integration scope, and E2E scope, asks three different questions and produces three different kinds of confidence. Together they cover the full surface of what the system must do.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n\n<div class=\"wp-block-button is-style-outline is-style-outline--1\"><a class=\"wp-block-button__link\" href=\"\/whitepapers\/boundary-driven-testing\/\">Read the Full Whitepaper<\/a><\/div>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Boundary-Driven Testing Testing difficulty is architectural evidence. When a component cannot be exercised in isolation, the problem is not the tests \u2014 it is the structure. The Problem The conventional framing of testing as a discipline separate from design produces a particular kind of pain. Teams adopt frameworks, mandate coverage minimums, and write guidelines about &#8230; <a title=\"Boundary-Driven Testing\" class=\"read-more\" href=\"https:\/\/harmonic-framework.com\/es\/methodologies\/boundary-driven-testing\/\" aria-label=\"Read more about Boundary-Driven Testing\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"parent":6,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"methodology":[],"class_list":["post-9","page","type-page","status-publish"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"trp-custom-language-flag":false,"post-thumbnail":false,"hf-card":false,"hf-hero":false},"uagb_author_info":{"display_name":"","author_link":"https:\/\/harmonic-framework.com\/es\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"Boundary-Driven Testing Testing difficulty is architectural evidence. When a component cannot be exercised in isolation, the problem is not the tests \u2014 it is the structure. The Problem The conventional framing of testing as a discipline separate from design produces a particular kind of pain. Teams adopt frameworks, mandate coverage minimums, and write guidelines about&hellip;","_links":{"self":[{"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages\/9","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/comments?post=9"}],"version-history":[{"count":6,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages\/9\/revisions"}],"predecessor-version":[{"id":659,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages\/9\/revisions\/659"}],"up":[{"embeddable":true,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages\/6"}],"wp:attachment":[{"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/media?parent=9"}],"wp:term":[{"taxonomy":"methodology","embeddable":true,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/methodology?post=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}