<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Internal-Tests on Ocarina — manual</title>
    <link>https://mojo-molotov.github.io/from-ocarina-to-igor/tags/internal-tests/</link>
    <description>Recent content in Internal-Tests on Ocarina — manual</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Mon, 01 Jun 2026 19:25:20 +0200</lastBuildDate>
    <atom:link href="https://mojo-molotov.github.io/from-ocarina-to-igor/tags/internal-tests/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Chapter 04 — Framework internal tests</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/</guid>
      <description>&lt;h1 id=&#34;chapter-04framework-internal-tests&#34;&gt;Chapter 04 — Framework internal tests&lt;a class=&#34;anchor&#34; href=&#34;#chapter-04framework-internal-tests&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;How Ocarina tests itself. Five test families, a clear-eyed coverage policy, an Allure report archived on GitHub Pages.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;outline&#34;&gt;Outline&lt;a class=&#34;anchor&#34; href=&#34;#outline&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;#&lt;/th&gt;&#xA;          &lt;th&gt;File&lt;/th&gt;&#xA;          &lt;th&gt;Topic&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;01&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/01-strategy/&#34;&gt;&lt;code&gt;01-strategy.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&amp;ldquo;&lt;em&gt;From the outside like a user&lt;/em&gt;&amp;rdquo; strategy + the &lt;code&gt;conftest.py&lt;/code&gt; (FakeDriver, RecordingPOM, builders).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;02&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/02-cram-prysk/&#34;&gt;&lt;code&gt;02-cram-prysk.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Cram tests (&lt;code&gt;prysk&lt;/code&gt;): &lt;code&gt;.t&lt;/code&gt; files&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;03&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/03-pytest-scenarios/&#34;&gt;&lt;code&gt;03-pytest-scenarios.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Test scenarios applied to the framework (pytest + allure + hypothesis).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;04&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/04-mypy-plugins-types/&#34;&gt;&lt;code&gt;04-mypy-plugins-types.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Tests on &lt;strong&gt;static typing&lt;/strong&gt; via &lt;code&gt;pytest-mypy-plugins&lt;/code&gt; (&lt;code&gt;*.yml&lt;/code&gt;).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;05&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/05-syrupy-snapshots/&#34;&gt;&lt;code&gt;05-syrupy-snapshots.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Snapshot tests (&lt;code&gt;syrupy&lt;/code&gt;) for &lt;code&gt;pretty_print_results&lt;/code&gt; and &lt;code&gt;results_to_json&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;06&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/06-hypothesis-properties/&#34;&gt;&lt;code&gt;06-hypothesis-properties.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Property-based testing for invariants.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;07&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/07-coverage-policy/&#34;&gt;&lt;code&gt;07-coverage-policy.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Coverage policy: what&amp;rsquo;s tested, what is NOT, why.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;08&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/04-internal-tests/08-allure-history/&#34;&gt;&lt;code&gt;08-allure-history.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Allure + composite action &lt;code&gt;allure-history&lt;/code&gt; + GH Pages deploy.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;summary-table&#34;&gt;Summary table&lt;a class=&#34;anchor&#34; href=&#34;#summary-table&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Family&lt;/th&gt;&#xA;          &lt;th&gt;Tool&lt;/th&gt;&#xA;          &lt;th&gt;Quantity&lt;/th&gt;&#xA;          &lt;th&gt;Topic&lt;/th&gt;&#xA;          &lt;th&gt;Target&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Scenarios&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;pytest&lt;/code&gt; + &lt;code&gt;allure-pytest&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;~15 &lt;code&gt;test_*.py&lt;/code&gt; files&lt;/td&gt;&#xA;          &lt;td&gt;DSL, orchestration, Playwright actor&lt;/td&gt;&#xA;          &lt;td&gt;Covers &lt;em&gt;behavior&lt;/em&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Cram&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;prysk&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;15 &lt;code&gt;.t&lt;/code&gt; files&lt;/td&gt;&#xA;          &lt;td&gt;Selenium + Playwright CLI: parsing, validations, defaults&lt;/td&gt;&#xA;          &lt;td&gt;Covers &lt;em&gt;CLI user surface&lt;/em&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Static types&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;pytest-mypy-plugins&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;~5 &lt;code&gt;*test_types.yml&lt;/code&gt; files&lt;/td&gt;&#xA;          &lt;td&gt;Type inferences, narrowing, expected errors&lt;/td&gt;&#xA;          &lt;td&gt;Covers &lt;em&gt;typing&lt;/em&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Snapshots&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;syrupy&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;2 &lt;code&gt;.ambr&lt;/code&gt; files&lt;/td&gt;&#xA;          &lt;td&gt;Output of &lt;code&gt;pretty_print_results&lt;/code&gt;, &lt;code&gt;results_to_json&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Covers &lt;em&gt;output format&lt;/em&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Property-based&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;hypothesis&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;1 file (&lt;code&gt;test_invariants_properties.py&lt;/code&gt;)&lt;/td&gt;&#xA;          &lt;td&gt;Behavior on random values&lt;/td&gt;&#xA;          &lt;td&gt;Covers &lt;em&gt;robustness to inputs&lt;/em&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;approach&#34;&gt;Approach&lt;a class=&#34;anchor&#34; href=&#34;#approach&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In &lt;code&gt;conftest.py&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
