{
  "code": null,
  "collection": "architecture",
  "href": "https://banes-lab.com/ontology#architecture-testability",
  "id": "testability",
  "kind": "quality-attribute",
  "layer": {
    "href": "https://banes-lab.com/ontology/schema#layer-computation-core",
    "json": "https://banes-lab.com/json/records/layer/computation-core",
    "label": "Computation Core",
    "markdown": "https://banes-lab.com/records/layer/computation-core.md",
    "ref": "layer:computation-core"
  },
  "name": "Testability",
  "ref": "architecture:testability",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-low-coupling",
          "json": "https://banes-lab.com/json/records/architecture/low-coupling",
          "label": "Low Coupling",
          "markdown": "https://banes-lab.com/records/architecture/low-coupling.md",
          "ref": "architecture:low-coupling"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-deterministic-behavior",
          "json": "https://banes-lab.com/json/records/lexicon/deterministic-behavior",
          "label": "Deterministic Behavior",
          "markdown": "https://banes-lab.com/records/lexicon/deterministic-behavior.md",
          "ref": "lexicon:deterministic-behavior"
        }
      ],
      "relation": "requires"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-dependency-inversion",
          "json": "https://banes-lab.com/json/records/architecture/dependency-inversion",
          "label": "Dependency Inversion Principle (DIP)",
          "markdown": "https://banes-lab.com/records/architecture/dependency-inversion.md",
          "ref": "architecture:dependency-inversion"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-pure-functions",
          "json": "https://banes-lab.com/json/records/architecture/pure-functions",
          "label": "Pure Functions",
          "markdown": "https://banes-lab.com/records/architecture/pure-functions.md",
          "ref": "architecture:pure-functions"
        }
      ],
      "relation": "reinforces"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-regression-safety",
          "json": "https://banes-lab.com/json/records/lexicon/regression-safety",
          "label": "Regression Safety",
          "markdown": "https://banes-lab.com/records/lexicon/regression-safety.md",
          "ref": "lexicon:regression-safety"
        }
      ],
      "relation": "enables"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-hidden-dependency",
          "json": "https://banes-lab.com/json/records/lexicon/hidden-dependency",
          "label": "Hidden Dependency",
          "markdown": "https://banes-lab.com/records/lexicon/hidden-dependency.md",
          "ref": "lexicon:hidden-dependency"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-test-pyramid-inversion",
          "json": "https://banes-lab.com/json/records/architecture/test-pyramid-inversion",
          "label": "Test Pyramid Inversion",
          "markdown": "https://banes-lab.com/records/architecture/test-pyramid-inversion.md",
          "ref": "architecture:test-pyramid-inversion"
        }
      ],
      "relation": "conflicts-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-encapsulation-extremes",
          "json": "https://banes-lab.com/json/records/lexicon/encapsulation-extremes",
          "label": "Encapsulation Extremes",
          "markdown": "https://banes-lab.com/records/lexicon/encapsulation-extremes.md",
          "ref": "lexicon:encapsulation-extremes"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-singleton-pattern",
          "json": "https://banes-lab.com/json/records/architecture/singleton-pattern",
          "label": "Singleton Pattern",
          "markdown": "https://banes-lab.com/records/architecture/singleton-pattern.md",
          "ref": "architecture:singleton-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-service-locator-pattern",
          "json": "https://banes-lab.com/json/records/architecture/service-locator-pattern",
          "label": "Service Locator Pattern",
          "markdown": "https://banes-lab.com/records/architecture/service-locator-pattern.md",
          "ref": "architecture:service-locator-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#tension-singleton-pattern-testability",
          "json": "https://banes-lab.com/json/records/tension/singleton-pattern-testability",
          "label": "Singleton Pattern / Testability",
          "markdown": "https://banes-lab.com/records/tension/singleton-pattern-testability.md",
          "ref": "tension:singleton-pattern-testability"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#tension-service-locator-pattern-testability",
          "json": "https://banes-lab.com/json/records/tension/service-locator-pattern-testability",
          "label": "Service Locator Pattern / Testability",
          "markdown": "https://banes-lab.com/records/tension/service-locator-pattern-testability.md",
          "ref": "tension:service-locator-pattern-testability"
        }
      ],
      "relation": "tensions-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#tension-encapsulation-extremes-testability",
          "json": "https://banes-lab.com/json/records/tension/encapsulation-extremes-testability",
          "label": "Testability / Encapsulation Extremes",
          "markdown": "https://banes-lab.com/records/tension/encapsulation-extremes-testability.md",
          "ref": "tension:encapsulation-extremes-testability"
        }
      ],
      "relation": "tensions"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-hidden-time-randomness-global-state",
          "json": "https://banes-lab.com/json/records/lexicon/hidden-time-randomness-global-state",
          "label": "Hidden Time/Randomness/Global State",
          "markdown": "https://banes-lab.com/records/lexicon/hidden-time-randomness-global-state.md",
          "ref": "lexicon:hidden-time-randomness-global-state"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-hidden-dependency",
          "json": "https://banes-lab.com/json/records/lexicon/hidden-dependency",
          "label": "Hidden Dependency",
          "markdown": "https://banes-lab.com/records/lexicon/hidden-dependency.md",
          "ref": "lexicon:hidden-dependency"
        }
      ],
      "relation": "violated-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-dependency-injection",
          "json": "https://banes-lab.com/json/records/architecture/dependency-injection",
          "label": "Dependency Injection",
          "markdown": "https://banes-lab.com/records/architecture/dependency-injection.md",
          "ref": "architecture:dependency-injection"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-make-effects-explicit",
          "json": "https://banes-lab.com/json/records/lexicon/make-effects-explicit",
          "label": "Make Effects Explicit",
          "markdown": "https://banes-lab.com/records/lexicon/make-effects-explicit.md",
          "ref": "lexicon:make-effects-explicit"
        }
      ],
      "relation": "refactored-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#vocabulary-severity-mandatory",
          "json": "https://banes-lab.com/json/records/vocabulary/severity-mandatory",
          "label": "mandatory",
          "markdown": "https://banes-lab.com/records/vocabulary/severity-mandatory.md",
          "ref": "vocabulary:severity-mandatory"
        }
      ],
      "relation": "severity"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-category-correctness-determinism-verification",
          "json": "https://banes-lab.com/json/records/architecture-category/correctness-determinism-verification",
          "label": "Correctness / Determinism / Verification",
          "markdown": "https://banes-lab.com/records/architecture-category/correctness-determinism-verification.md",
          "ref": "architecture-category:correctness-determinism-verification"
        }
      ],
      "relation": "category"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-no-test-without-subject-eslint-rule-ts",
          "json": "https://banes-lab.com/json/source/governance/rules/eslint/no-test-without-subject.eslint.rule.ts",
          "label": "rules/eslint/no-test-without-subject.eslint.rule.ts",
          "markdown": "https://banes-lab.com/source/governance/rules/eslint/no-test-without-subject.eslint.rule.ts.md",
          "ref": "anatomy:file-governance-rules-eslint-no-test-without-subject-eslint-rule-ts"
        }
      ],
      "relation": "enforced-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-interface-based-design",
          "json": "https://banes-lab.com/json/records/architecture/interface-based-design",
          "label": "Interface-Based Design",
          "markdown": "https://banes-lab.com/records/architecture/interface-based-design.md",
          "ref": "architecture:interface-based-design"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-referential-transparency",
          "json": "https://banes-lab.com/json/records/architecture/referential-transparency",
          "label": "Referential Transparency",
          "markdown": "https://banes-lab.com/records/architecture/referential-transparency.md",
          "ref": "architecture:referential-transparency"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-single-responsibility",
          "json": "https://banes-lab.com/json/records/architecture/single-responsibility",
          "label": "Single Responsibility Principle",
          "markdown": "https://banes-lab.com/records/architecture/single-responsibility.md",
          "ref": "architecture:single-responsibility"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-stateless-processing",
          "json": "https://banes-lab.com/json/records/architecture/stateless-processing",
          "label": "Stateless Processing",
          "markdown": "https://banes-lab.com/records/architecture/stateless-processing.md",
          "ref": "architecture:stateless-processing"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-ports-and-adapters-architecture",
          "json": "https://banes-lab.com/json/records/architecture/ports-and-adapters-architecture",
          "label": "Ports and Adapters Architecture",
          "markdown": "https://banes-lab.com/records/architecture/ports-and-adapters-architecture.md",
          "ref": "architecture:ports-and-adapters-architecture"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-clean-architecture",
          "json": "https://banes-lab.com/json/records/architecture/clean-architecture",
          "label": "Clean Architecture",
          "markdown": "https://banes-lab.com/records/architecture/clean-architecture.md",
          "ref": "architecture:clean-architecture"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-controlled-side-effects",
          "json": "https://banes-lab.com/json/records/architecture/controlled-side-effects",
          "label": "Controlled Side Effects",
          "markdown": "https://banes-lab.com/records/architecture/controlled-side-effects.md",
          "ref": "architecture:controlled-side-effects"
        }
      ],
      "relation": "reinforced-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-postconditions",
          "json": "https://banes-lab.com/json/records/architecture/postconditions",
          "label": "Postconditions",
          "markdown": "https://banes-lab.com/records/architecture/postconditions.md",
          "ref": "architecture:postconditions"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-high-cohesion",
          "json": "https://banes-lab.com/json/records/architecture/high-cohesion",
          "label": "High Cohesion",
          "markdown": "https://banes-lab.com/records/architecture/high-cohesion.md",
          "ref": "architecture:high-cohesion"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-state-isolation",
          "json": "https://banes-lab.com/json/records/architecture/state-isolation",
          "label": "State Isolation",
          "markdown": "https://banes-lab.com/records/architecture/state-isolation.md",
          "ref": "architecture:state-isolation"
        }
      ],
      "relation": "enabled-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/disciplined-methodology/build#the-check-comes-first",
          "json": "https://banes-lab.com/json/disciplined-methodology/build/the-check-comes-first",
          "label": "The check comes first",
          "markdown": "https://banes-lab.com/disciplined-methodology/build/the-check-comes-first.md",
          "ref": "chapter:/disciplined-methodology/build#the-check-comes-first"
        },
        {
          "href": "https://banes-lab.com/software-architecture/principles#computation-and-resource",
          "json": "https://banes-lab.com/json/software-architecture/principles/computation-and-resource",
          "label": "Computation and resource",
          "markdown": "https://banes-lab.com/software-architecture/principles/computation-and-resource.md",
          "ref": "chapter:/software-architecture/principles#computation-and-resource"
        },
        {
          "href": "https://banes-lab.com/software-architecture/scale#scale-follows-determinism",
          "json": "https://banes-lab.com/json/software-architecture/scale/scale-follows-determinism",
          "label": "Scale follows determinism",
          "markdown": "https://banes-lab.com/software-architecture/scale/scale-follows-determinism.md",
          "ref": "chapter:/software-architecture/scale#scale-follows-determinism"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-anti-patterns",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-anti-patterns",
          "label": "Anti-patterns",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-anti-patterns.md",
          "ref": "chapter:/ontology#architecture-category-anti-patterns"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-contracts-interfaces-compatibility",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-contracts-interfaces-compatibility",
          "label": "Contracts / Interfaces / Compatibility",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-contracts-interfaces-compatibility.md",
          "ref": "chapter:/ontology#architecture-category-contracts-interfaces-compatibility"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-correctness-determinism-verification",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-correctness-determinism-verification",
          "label": "Correctness / Determinism / Verification",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-correctness-determinism-verification.md",
          "ref": "chapter:/ontology#architecture-category-correctness-determinism-verification"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-core-modular-design",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-core-modular-design",
          "label": "Core Modular Design",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-core-modular-design.md",
          "ref": "chapter:/ontology#architecture-category-core-modular-design"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-solid-object-oriented-design",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-solid-object-oriented-design",
          "label": "SOLID / Object-Oriented Design",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md",
          "ref": "chapter:/ontology#architecture-category-solid-object-oriented-design"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-creational-patterns",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-creational-patterns",
          "label": "Creational Patterns",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-creational-patterns.md",
          "ref": "chapter:/ontology#architecture-category-creational-patterns"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-scalability-performance-optimization",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-scalability-performance-optimization",
          "label": "Scalability / Performance / Optimization",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-scalability-performance-optimization.md",
          "ref": "chapter:/ontology#architecture-category-scalability-performance-optimization"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-streaming-pipeline-dataflow-processing",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-streaming-pipeline-dataflow-processing",
          "label": "Streaming / Pipeline / Dataflow Processing",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-streaming-pipeline-dataflow-processing.md",
          "ref": "chapter:/ontology#architecture-category-streaming-pipeline-dataflow-processing"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-plugin-extensibility-ioc",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-plugin-extensibility-ioc",
          "label": "Plugin / Extensibility / IoC",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-plugin-extensibility-ioc.md",
          "ref": "chapter:/ontology#architecture-category-plugin-extensibility-ioc"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-codebase-system-architecture-styles",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-codebase-system-architecture-styles",
          "label": "Codebase / System Architecture Styles",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-codebase-system-architecture-styles.md",
          "ref": "chapter:/ontology#architecture-category-codebase-system-architecture-styles"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-transactions-state-concurrency",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-transactions-state-concurrency",
          "label": "Transactions / State / Concurrency",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-transactions-state-concurrency.md",
          "ref": "chapter:/ontology#architecture-category-transactions-state-concurrency"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-causality-ordering-distributed-time",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-causality-ordering-distributed-time",
          "label": "Causality / Ordering / Distributed Time",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-causality-ordering-distributed-time.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-causality-ordering-distributed-time"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-correctness-determinism-verification",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-correctness-determinism-verification",
          "label": "Correctness / Determinism / Verification",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-correctness-determinism-verification.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-correctness-determinism-verification"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-vocabulary-severity",
          "json": "https://banes-lab.com/json/ontology/schema/the-vocabulary-severity",
          "label": "Severity levels",
          "markdown": "https://banes-lab.com/ontology/schema/the-vocabulary-severity.md",
          "ref": "chapter:/ontology/schema#the-vocabulary-severity"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-resolutions",
          "json": "https://banes-lab.com/json/ontology/schema/the-resolutions",
          "label": "The resolutions",
          "markdown": "https://banes-lab.com/ontology/schema/the-resolutions.md",
          "ref": "chapter:/ontology/schema#the-resolutions"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "summary": "The degree to which code can be tested in isolation, with its dependencies, time and randomness supplied by the test.",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/ontology#architecture-validation",
      "json": "https://banes-lab.com/json/records/architecture/validation",
      "label": "Validation",
      "markdown": "https://banes-lab.com/records/architecture/validation.md",
      "ref": "architecture:validation"
    },
    "previous": {
      "href": "https://banes-lab.com/ontology#architecture-static-analysis",
      "json": "https://banes-lab.com/json/records/architecture/static-analysis",
      "label": "Static Analysis",
      "markdown": "https://banes-lab.com/records/architecture/static-analysis.md",
      "ref": "architecture:static-analysis"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/records/architecture",
    "label": "Architecture principles",
    "markdown": "https://banes-lab.com/api/records/architecture.md",
    "ref": "api:records/architecture"
  },
  "aliases": [],
  "exemplar": {
    "after": "function createFoo(name: string, ids: IdSource, clock: Clock, store: FooStore) {\n  return store.save({ id: ids.nextFooId(), name, createdAt: clock.now() });\n}",
    "before": "function createFoo(name: string) {\n  return fooDb.save({ id: crypto.randomUUID(), name, createdAt: new Date() });\n}",
    "lang": "ts",
    "medium": "code"
  },
  "formedBy": null,
  "scope": [
    "class",
    "module",
    "service"
  ],
  "severity": "mandatory"
}
