<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://daniel-dos.github.io/danieldias/blog-rust</id>
    <title>Daniel Dias Blog</title>
    <updated>2026-02-25T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://daniel-dos.github.io/danieldias/blog-rust"/>
    <subtitle>Daniel Dias Blog</subtitle>
    <icon>https://daniel-dos.github.io/danieldias/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Testing in Rust - A Different Experience - From Java and Go to Crates and Modules.]]></title>
        <id>https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust</id>
        <link href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Exploring how Rust's testing approach differs from Java and Go, and what it teaches us about software architecture.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="capa" src="https://daniel-dos.github.io/danieldias/assets/images/rust-testing-2854d2547f30f043855b044ca56ab5d6.png" width="1021" height="729" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>When I started writing tests in Rust, it felt different from what I was
used to in Java and Go.</p>
<p>Not better. Not worse. Just different.</p>
<p>But that difference reveals something deeper about how Rust approaches
architecture and modularity.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-a-private-function">Testing a Private Function<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#testing-a-private-function" class="hash-link" aria-label="Direct link to Testing a Private Function" title="Direct link to Testing a Private Function" translate="no">​</a></h2>
<p>Let’s compare something simple: testing internal logic.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-in-go">Testing in Go<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#testing-in-go" class="hash-link" aria-label="Direct link to Testing in Go" title="Direct link to Testing in Go" translate="no">​</a></h3>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">package</span><span class="token plain"> mathutil</span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> b </span><span class="token builtin" style="color:rgb(189, 147, 249)">int</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">int</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> a </span><span class="token operator">+</span><span class="token plain"> b</span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<p>Test (same package):</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">package</span><span class="token plain"> mathutil</span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"testing"</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">TestAdd</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">t </span><span class="token operator">*</span><span class="token plain">testing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">T</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token number">5</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Fail</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<p>If the test is in the same package, it can access <code>add</code>, even though it's not exported.</p>
<p>If you move the test to:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">package</span><span class="token plain"> mathutil_test</span></span><br></span></code></pre></div></div>
<p>Then <code>add</code> becomes inaccessible.</p>
<p>Go visibility is package-based.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-in-java">Testing in Java<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#testing-in-java" class="hash-link" aria-label="Direct link to Testing in Java" title="Direct link to Testing in Java" translate="no">​</a></h3>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">MathUtil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">private</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> a </span><span class="token operator">+</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">MathUtilTest</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token annotation punctuation" style="color:rgb(248, 248, 242)">@Test</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">testAdd</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token class-name">MathUtil</span><span class="token plain"> util </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">MathUtil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// util.add(2,3); ❌ Not accessible</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<p>You cannot access <code>private</code> methods.</p>
<p>Common workarounds:</p>
<ul>
<li class="">Test only public methods</li>
<li class="">Change visibility to package-private</li>
<li class="">Use reflection</li>
</ul>
<p>Java enforces encapsulation at the class level.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-in-rust">Testing in Rust<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#testing-in-rust" class="hash-link" aria-label="Direct link to Testing in Rust" title="Direct link to Testing in Rust" translate="no">​</a></h3>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">i32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">i32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">i32</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    a </span><span class="token operator">+</span><span class="token plain"> b</span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token attribute attr-name" style="color:rgb(241, 250, 140)">#[cfg(test)]</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">mod</span><span class="token plain"> </span><span class="token module-declaration namespace">tests</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">super</span><span class="token punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token operator">*</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token attribute attr-name" style="color:rgb(241, 250, 140)">#[test]</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">test_add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token macro property">assert_eq!</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<p>Why does this work?</p>
<p>Because the test module lives inside the same module scope.</p>
<p>Rust allows internal testing without exposing the function publicly.</p>
<p>This is a deliberate design choice.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-public-api">Testing Public API<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#testing-public-api" class="hash-link" aria-label="Direct link to Testing Public API" title="Direct link to Testing Public API" translate="no">​</a></h2>
<p>Now let’s compare integration-style testing.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-in-go---external-style-test">Testing in Go - external-style test<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#testing-in-go---external-style-test" class="hash-link" aria-label="Direct link to Testing in Go - external-style test" title="Direct link to Testing in Go - external-style test" translate="no">​</a></h3>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">package</span><span class="token plain"> mathutil_test</span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"testing"</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"myapp/mathutil"</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">TestPublicAPI</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">t </span><span class="token operator">*</span><span class="token plain">testing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">T</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    result </span><span class="token operator">:=</span><span class="token plain"> mathutil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> result </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token number">5</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Fail</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<p>This simulates real external usage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-in-java---external-style-test">Testing in Java - external-style test<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#testing-in-java---external-style-test" class="hash-link" aria-label="Direct link to Testing in Java - external-style test" title="Direct link to Testing in Java - external-style test" translate="no">​</a></h3>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token annotation punctuation" style="color:rgb(248, 248, 242)">@Test</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">testPublicMethod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token class-name">MathUtil</span><span class="token plain"> util </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">MathUtil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">assertEquals</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> util</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">addPublic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<p>Tests always behave like external consumers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rust-integration-test">Rust (Integration Test)<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#rust-integration-test" class="hash-link" aria-label="Direct link to Rust (Integration Test)" title="Direct link to Rust (Integration Test)" translate="no">​</a></h3>
<p>Directory structure:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">src/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├── lib.rs</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">tests/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> └── math_test.rs</span><br></span></code></pre></div></div>
<p>lib.rs:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">pub</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">i32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">i32</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">i32</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    a </span><span class="token operator">+</span><span class="token plain"> b</span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<p>tests/math_test.rs:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token namespace">myapp</span><span class="token namespace punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token plain">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token attribute attr-name" style="color:rgb(241, 250, 140)">#[test]</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">test_add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token macro property">assert_eq!</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></span></code></pre></div></div>
<p>Important detail:</p>
<p>Each file in <code>tests/</code> is compiled as a separate crate.
That means:</p>
<ul>
<li class="">Only public items are accessible</li>
<li class="">The project must expose a lib crate</li>
</ul>
<p>This forces architectural clarity.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="structural-differences">Structural Differences<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#structural-differences" class="hash-link" aria-label="Direct link to Structural Differences" title="Direct link to Structural Differences" translate="no">​</a></h2>
<ul>
<li class="">Go: Package-based visibility. Tests can be in the same package or a separate one.</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">mathutil/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├── math.go</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> └── math_test.go</span><br></span></code></pre></div></div>
<p>Simple and colocated.</p>
<ul>
<li class="">Java: Class-based visibility. Tests are usually in a separate test directory but can only access public or package-private members.</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">src/main/java/com/example/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">src/test/java/com/example/</span><br></span></code></pre></div></div>
<p>Separated by directory convention.</p>
<ul>
<li class="">Rust: Module and crate-based visibility. Internal tests can access private items, but integration tests must use the public API.</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">src/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├── lib.rs</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├── module.rs</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">tests/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> └── integration_test.rs</span><br></span></code></pre></div></div>
<p>Rust introduces a conceptual separation:</p>
<ul>
<li class="">Unit tests → inside modules</li>
<li class="">Integration tests → separate crate boundary</li>
</ul>
<p>This separation is semantic, not just folder-based.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architectural-implications">Architectural Implications<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#architectural-implications" class="hash-link" aria-label="Direct link to Architectural Implications" title="Direct link to Architectural Implications" translate="no">​</a></h2>
<p>In Go:</p>
<ul>
<li class="">Encapsulation is package-based.</li>
<li class="">Testing internal logic depends on package naming.</li>
</ul>
<p>In Java:</p>
<ul>
<li class="">Encapsulation is class-based.</li>
<li class="">You often test behavior, not implementation.</li>
</ul>
<p>In Rust:
Encapsulation is module-based.</p>
<p>Rust encourages:</p>
<ul>
<li class="">Testing internal implementation without exposing it</li>
<li class="">Testing public contracts from outside</li>
<li class="">Structuring projects around library crates</li>
</ul>
<p>Because integration tests require a <code>lib.rs</code>, many Rust projects naturally evolve into:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">src/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── lib.rs   ← core logic</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── main.rs  ← thin entrypoint</span><br></span></code></pre></div></div>
<p>That separation improves:</p>
<ul>
<li class="">Reusability</li>
<li class="">Testability</li>
<li class="">Architectural clarity</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-rust-model-teaches">What Rust Model Teaches<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#what-rust-model-teaches" class="hash-link" aria-label="Direct link to What Rust Model Teaches" title="Direct link to What Rust Model Teaches" translate="no">​</a></h2>
<p>Rust makes you think in layers:</p>
<ul>
<li class="">Internal correctness (unit tests)</li>
<li class="">Public guarantees (integration tests)</li>
</ul>
<p>Instead of exposing internals just to make tests work, Rust gives you controlled internal access.</p>
<p>It protects your public API while keeping internal testing ergonomic.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/25/testing-in-rust/test-in-rust#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Rust testing approach may feel unusual at first, especially if you're
coming from Java or Go.</p>
<p>But once you understand the module and crate system, it makes
architectural sense.</p>
<p>Rust is not just about memory safety or performance.</p>
<p>It's about structure.</p>
<p>And testing is one of the places where that philosophy becomes very
clear.</p>]]></content>
        <author>
            <name>Daniel Dias</name>
        </author>
        <category label="Rust" term="Rust"/>
        <category label="Backend" term="Backend"/>
        <category label="Learning Journey" term="Learning Journey"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[My Journey Learning Rust]]></title>
        <id>https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust</id>
        <link href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust"/>
        <updated>2026-02-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A practical project to solidify my Rust learning with a User CRUD application using SQLite.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="capa" src="https://daniel-dos.github.io/danieldias/assets/images/rust-capa-3503fd73afd87a16a48bd6fce275768f.png" width="1536" height="1024" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-rust-learning---user-crud-with-sqlite">Project: rust-learning - User CRUD with SQLite<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#project-rust-learning---user-crud-with-sqlite" class="hash-link" aria-label="Direct link to Project: rust-learning - User CRUD with SQLite" title="Direct link to Project: rust-learning - User CRUD with SQLite" translate="no">​</a></h2>
<p>Recently, I have been deepening my studies in Rust, and to solidify my learning I built a practical project: a complete User CRUD application using SQLite.</p>
<p>The project, available on GitHub, demonstrates how I applied core Rust concepts in a real-world backend scenario, including asynchronous programming, structured error handling, layered architecture (Service/Repository), and database integration with SQLx.</p>
<p>This hands-on implementation was essential to move beyond theory and translate Rust’s safety and performance principles into practical, production-style code.</p>
<p>Repository: 👉 <a href="https://github.com/Daniel-Dos/rust-learning" target="_blank" rel="noopener noreferrer" class="">https://github.com/Daniel-Dos/rust-learning</a></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-technologies-used">🦀 Technologies Used<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#-technologies-used" class="hash-link" aria-label="Direct link to 🦀 Technologies Used" title="Direct link to 🦀 Technologies Used" translate="no">​</a></h2>
<ul>
<li class=""><strong>Rust (edition 2024)</strong></li>
<li class=""><strong>Tokio</strong> (asynchronous runtime)</li>
<li class=""><strong>SQLx</strong> (asynchronous SQLite access)</li>
<li class=""><strong>Tracing</strong> (structured logging)</li>
<li class=""><strong>Anyhow</strong> (idiomatic error handling)</li>
<li class=""><strong>Rand</strong> (random data generation)</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-what-i-implemented">🛠️ What I Implemented<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#%EF%B8%8F-what-i-implemented" class="hash-link" aria-label="Direct link to 🛠️ What I Implemented" title="Direct link to 🛠️ What I Implemented" translate="no">​</a></h2>
<p>The project consists of a complete User CRUD:</p>
<ul>
<li class="">✅ <strong>Create</strong> -- Insert users with random data</li>
<li class="">📋 <strong>Read</strong> -- List all users</li>
<li class="">✏️ <strong>Update</strong> -- Update user email</li>
<li class="">❌ <strong>Delete</strong> -- Remove user by ID</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-architecture-applied">🏗️ Architecture Applied<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#%EF%B8%8F-architecture-applied" class="hash-link" aria-label="Direct link to 🏗️ Architecture Applied" title="Direct link to 🏗️ Architecture Applied" translate="no">​</a></h2>
<p>I structured the project into layers to maintain clarity and separation
of responsibilities:</p>
<ul>
<li class=""><strong>Main / CLI</strong> → Application entry point</li>
<li class=""><strong>Service</strong> → Business rules</li>
<li class=""><strong>Repository</strong> → Database access</li>
<li class=""><strong>Models / Utils</strong> → Entities and helper functions</li>
</ul>
<p>This organization allowed me to apply concepts similar to modern backend
architectures.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-key-learnings">🧠 Key Learnings<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#-key-learnings" class="hash-link" aria-label="Direct link to 🧠 Key Learnings" title="Direct link to 🧠 Key Learnings" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ownership-and-borrowing">🔐 Ownership and Borrowing<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#-ownership-and-borrowing" class="hash-link" aria-label="Direct link to 🔐 Ownership and Borrowing" title="Direct link to 🔐 Ownership and Borrowing" translate="no">​</a></h3>
<p>I learned in practice how Rust's ownership system works:</p>
<ul>
<li class="">The difference between move and borrow</li>
<li class="">When and how values are dropped</li>
<li class="">How to avoid lifetime issues</li>
</ul>
<p>This completely changed how I think about memory management.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-idiomatic-error-handling">⚠️ Idiomatic Error Handling<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#%EF%B8%8F-idiomatic-error-handling" class="hash-link" aria-label="Direct link to ⚠️ Idiomatic Error Handling" title="Direct link to ⚠️ Idiomatic Error Handling" translate="no">​</a></h3>
<p>I started using:</p>
<ul>
<li class=""><code>Result</code> and the <code>?</code> operator</li>
<li class=""><code>map_err</code></li>
<li class=""><code>ok_or_else</code></li>
<li class="">Structured error propagation with <code>anyhow</code></li>
</ul>
<p>The code became cleaner, more expressive, and safer.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-asyncawait-with-tokio">⚡ Async/Await with Tokio<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#-asyncawait-with-tokio" class="hash-link" aria-label="Direct link to ⚡ Async/Await with Tokio" title="Direct link to ⚡ Async/Await with Tokio" translate="no">​</a></h3>
<p>I implemented asynchronous database operations while understanding:</p>
<ul>
<li class="">How <code>.await</code> impacts lifetimes</li>
<li class="">How to avoid invalid references</li>
<li class="">How to properly structure async calls</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-architecture-with-traits-and-dependency-injection">🧩 Architecture with Traits and Dependency Injection<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#-architecture-with-traits-and-dependency-injection" class="hash-link" aria-label="Direct link to 🧩 Architecture with Traits and Dependency Injection" title="Direct link to 🧩 Architecture with Traits and Dependency Injection" translate="no">​</a></h3>
<p>I used traits as abstractions to decouple layers and keep the code more
testable and organized.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-structured-logging">📊 Structured Logging<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#-structured-logging" class="hash-link" aria-label="Direct link to 📊 Structured Logging" title="Direct link to 📊 Structured Logging" translate="no">​</a></h3>
<p>I learned the importance of:</p>
<ul>
<li class="">Avoiding logs directly inside the repository layer</li>
<li class="">Keeping logs in upper layers (CLI or Service)</li>
<li class="">Separating infrastructure concerns from business logic</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="demo-video">Demo Video<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#demo-video" class="hash-link" aria-label="Direct link to Demo Video" title="Direct link to Demo Video" translate="no">​</a></h2>
<p>Below is a short demonstration of the environment running the implemented CRUD operations:</p>
<div style="position:relative;padding-top:56.25%"><iframe src="https://drive.google.com/file/d/1DH9gxlzsCdJ-n_2onQ3wGYB0ZcWISF6t/preview" style="position:absolute;top:0;left:0;width:100%;height:100%;border:none" allow="autoplay; fullscreen" allowfullscreen=""></iframe></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-final-reflection">💡 Final Reflection<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#-final-reflection" class="hash-link" aria-label="Direct link to 💡 Final Reflection" title="Direct link to 💡 Final Reflection" translate="no">​</a></h2>
<p>This project went far beyond a simple "hello world".</p>
<p>It challenged me to deeply understand:</p>
<ul>
<li class="">Memory safety</li>
<li class="">Asynchronous flows</li>
<li class="">Architectural organization</li>
<li class="">Backend best practices in Rust</li>
</ul>
<p>Rust has a challenging learning curve, but it is extremely rewarding.</p>
<p>And this is just the beginning 🚀</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-references">📚 References<a href="https://daniel-dos.github.io/danieldias/blog-rust/2026/02/19/my-journey-learning-rust/my_journey_learning_rust#-references" class="hash-link" aria-label="Direct link to 📚 References" title="Direct link to 📚 References" translate="no">​</a></h2>
<ul>
<li class="">Rust Official Documentation — <a href="https://www.rust-lang.org/learn" target="_blank" rel="noopener noreferrer" class="">https://www.rust-lang.org/learn</a></li>
<li class="">The Rust Programming Language (The Book) — <a href="https://doc.rust-lang.org/book/" target="_blank" rel="noopener noreferrer" class="">https://doc.rust-lang.org/book/</a></li>
<li class="">Tokio Documentation — <a href="https://docs.rs/tokio" target="_blank" rel="noopener noreferrer" class="">https://docs.rs/tokio</a></li>
<li class="">SQLx Documentation — <a href="https://docs.rs/sqlx" target="_blank" rel="noopener noreferrer" class="">https://docs.rs/sqlx</a></li>
<li class="">Tracing Crate Documentation — <a href="https://docs.rs/tracing" target="_blank" rel="noopener noreferrer" class="">https://docs.rs/tracing</a></li>
<li class="">Anyhow Crate Documentation — <a href="https://docs.rs/anyhow" target="_blank" rel="noopener noreferrer" class="">https://docs.rs/anyhow</a></li>
<li class="">Project Repository (rust-learning) — <a href="https://github.com/Daniel-Dos/rust-learning" target="_blank" rel="noopener noreferrer" class="">https://github.com/Daniel-Dos/rust-learning</a></li>
</ul>
<hr>]]></content>
        <author>
            <name>Daniel Dias</name>
        </author>
        <category label="Rust" term="Rust"/>
        <category label="Backend" term="Backend"/>
        <category label="Learning Journey" term="Learning Journey"/>
    </entry>
</feed>