{"componentChunkName":"component---src-templates-post-template-js","path":"/rust-test","result":{"data":{"markdownRemark":{"id":"f24c2d76-86d7-55bb-b2a1-f0c18292cff8","html":"<p>今回は Rust のテスト記法に関するメモ書きです。</p>\n<!-- omit in toc -->\n<h2 id=\"もくじ\" style=\"position:relative;\"><a href=\"#%E3%82%82%E3%81%8F%E3%81%98\" aria-label=\"もくじ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>もくじ</h2>\n<ul>\n<li><a href=\"#rust-%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\">Rust のテストについて</a></li>\n<li>\n<p><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88\">ユニットテスト</a></p>\n<ul>\n<li><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E9%80%A0\">ユニットテストの基本構造</a></li>\n<li><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-1\">ユニットテストテストのサンプル 1</a></li>\n<li><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-2\">ユニットテストテストのサンプル 2</a></li>\n<li><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-3\">ユニットテストテストのサンプル 3</a></li>\n<li><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-4\">ユニットテストテストのサンプル 4</a></li>\n<li><a href=\"#%E3%81%9D%E3%81%AE%E4%BB%96%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9\">その他ユニットテストの注意点</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88\">結合テスト</a></p>\n<ul>\n<li><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E9%80%A0\">結合テストの基本構造</a></li>\n<li><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-1\">結合テストのサンプル 1</a></li>\n<li><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-2\">結合テストのサンプル 2</a></li>\n<li><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-3\">結合テストのサンプル 3</a></li>\n</ul>\n</li>\n<li><a href=\"#%E3%81%BE%E3%81%A8%E3%82%81\">まとめ</a></li>\n</ul>\n<h2 id=\"rust-のテストについて\" style=\"position:relative;\"><a href=\"#rust-%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\" aria-label=\"rust のテストについて permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Rust のテストについて</h2>\n<p>Rust では標準で以下の 3 つのテスト機能を利用できます。</p>\n<ul>\n<li>ユニットテスト</li>\n<li>結合テスト</li>\n<li>ドキュメントテスト</li>\n</ul>\n<p>他にもサードパーティーのクレートを追加することで様々なテスト機能を追加することができるようですが、今回は標準で利用可能なテスト方法のうち、主にユニットテストと結合テストを中心に扱うことにします。</p>\n<p>ドキュメントテストは今回は使用しないので割愛します。</p>\n<h2 id=\"ユニットテスト\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88\" aria-label=\"ユニットテスト permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユニットテスト</h2>\n<p>ユニットテストとは、個々の関数やモジュールを単独で検証するテストです。</p>\n<p>Rust の場合は、テスト対象のコードと同じファイル内に <code class=\"language-text\">#[cfg(test)]</code> モジュールとして配置することで実装できます。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">internal_helper</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n    x <span class=\"token operator\">*</span> <span class=\"token number\">2</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">public_function</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">internal_helper</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[cfg(test)]</span>  <span class=\"token comment\">// cargo test 時のみコンパイルされる</span>\n<span class=\"token keyword\">mod</span> <span class=\"token module-declaration namespace\">tests</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">use</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">::</span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// 親モジュールの全アイテムをインポート</span>\n\n    <span class=\"token attribute attr-name\">#[test]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_internal_helper</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// private 関数にも直接アクセスできる</span>\n        <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">internal_helper</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token attribute attr-name\">#[test]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_public_function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">public_function</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">11</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"ユニットテストの基本構造\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E9%80%A0\" aria-label=\"ユニットテストの基本構造 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユニットテストの基本構造</h3>\n<p>シンプルなユニットテストの実装のため、以下の関数を実装します。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">/// 二つの整数を加算する</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n    a <span class=\"token operator\">+</span> b\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>これに対して、テストモジュールは同じファイルに <code class=\"language-text\">#[cfg(test)]</code> アノテーションを記述した上で実装します。</p>\n<p>参考：<a href=\"https://doc.rust-lang.org/book/ch11-03-test-organization.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Test Organization - The Rust Programming Language</a></p>\n<p><code class=\"language-text\">#[cfg(test)]</code> アノテーションが記述されたテストモジュールは cargo test を実行したときにだけ Rust によりコンパイル/実行されます。</p>\n<p>ユニットテストはプロダクションのソースコードと同じファイルに記載するため、ビルド時に生成物にテストモジュールが含まれないようにするためにも <code class=\"language-text\">#[cfg(test)]</code> アノテーションを使用しています。(結合テストの場合は別のファイルに記述するため、<code class=\"language-text\">#[cfg(test)]</code> アノテーションは不要です。)</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[cfg(test)]</span>\n<span class=\"token keyword\">mod</span> <span class=\"token module-declaration namespace\">tests</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">use</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">::</span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token attribute attr-name\">#[test]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_add_basic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token macro property\">assert!</span><span class=\"token punctuation\">(</span>result <span class=\"token operator\">==</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>このようなテストモジュールについては <code class=\"language-text\">cargo test</code> もしくは <code class=\"language-text\">cargo test &lt;テスト関数></code> でテストを実行できます。</p>\n<p>例えば上記の例では、<code class=\"language-text\">cargo test test_add_basic</code> を実行することで add 関数のテストに成功することを確認できます。</p>\n<p><img src=\"C:%5CUsers%5Ckash1064%5CCodes%5Cblog-project%5CKaeru-no-Himitsukichi%5Cstatic%5Cmedia%5C2026-05-31-rust-test%5Cimage-20260531161743127.png\" alt=\"image-20260531161743127\"></p>\n<h3 id=\"ユニットテストテストのサンプル-1\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-1\" aria-label=\"ユニットテストテストのサンプル 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユニットテストテストのサンプル 1</h3>\n<p>Rust のユニットテストでは、標準の assert! マクロにより評価を行うことができます。</p>\n<p>例えば、以下の 3 つの関数をテスト用に作成します。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">/// 二つの整数を加算する</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n    a <span class=\"token operator\">+</span> b\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/// 二つの整数を乗算する</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">multiply</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n    a <span class=\"token operator\">*</span> b\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/// 文字列が空かどうかを判定する</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">is_empty</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">str</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">bool</span> <span class=\"token punctuation\">{</span>\n    s<span class=\"token punctuation\">.</span><span class=\"token function\">is_empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>これらの関数の挙動をテストするため、いくつかのテスト関数をそれぞれ使用できます。</p>\n<p>まず以下の関数は、assert! マクロを使用して <code class=\"language-text\">add(2, 3)</code> が 5 となるかを検証します。</p>\n<p><code class=\"language-text\">assert!</code> は条件が true であることを検証できます。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_add_basic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert!</span><span class=\"token punctuation\">(</span>result <span class=\"token operator\">==</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">assert!</code> マクロではテスト失敗時のテキストを定義することもできます。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_add_with_text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert!</span><span class=\"token punctuation\">(</span>result <span class=\"token operator\">==</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"2 + 3 = 5 ですが、実際の結果は {} でした。\"</span><span class=\"token punctuation\">,</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>上記のテストに失敗した場合、以下のようなテキストを表示できます。</p>\n<p><img src=\"C:%5CUsers%5Ckash1064%5CCodes%5Cblog-project%5CKaeru-no-Himitsukichi%5Cstatic%5Cmedia%5C2026-05-31-rust-test%5Cimage-20260531163634374.png\" alt=\"image-20260531163634374\"></p>\n<p>また、<code class=\"language-text\">assert_eq!</code> というマクロを使用することもできます。</p>\n<p>このマクロでは、パラメータとして与えられた 2 つの要素の値が一致することを確認できます。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_add_with_assert_eq</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>逆に、<code class=\"language-text\">assert_ne!</code> マクロは 2 つの要素が一致しないことを確認することができます。</p>\n<p>以下の例の場合には、<code class=\"language-text\">multiply(3, 4)</code> の実行結果が 12 となるため、2 つめのパラメータが 12 の場合にテストに失敗します。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_multiply_not_zero</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token macro property\">assert_ne!</span><span class=\"token punctuation\">(</span><span class=\"token function\">multiply</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>また、テスト関数は通常の関数のように使用できるため、以下のように変数の宣言などをテストに含めることもできます。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_with_setup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> input_a <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> input_b <span class=\"token operator\">=</span> <span class=\"token number\">200</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> actual <span class=\"token operator\">=</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>input_a<span class=\"token punctuation\">,</span> input_b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>actual<span class=\"token punctuation\">,</span> input_a <span class=\"token operator\">+</span> input_b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"ユニットテストテストのサンプル-2\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-2\" aria-label=\"ユニットテストテストのサンプル 2 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユニットテストテストのサンプル 2</h3>\n<p>次に、カスタム構造体 Point を使用した以下のようなシンプルなコードを実装します。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span></span>fmt<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">struct</span> <span class=\"token type-definition class-name\">Point</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">pub</span> x<span class=\"token punctuation\">:</span> <span class=\"token keyword\">f64</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">pub</span> y<span class=\"token punctuation\">:</span> <span class=\"token keyword\">f64</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">impl</span> <span class=\"token class-name\">Point</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">new</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">:</span> <span class=\"token keyword\">f64</span><span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">:</span> <span class=\"token keyword\">f64</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">Self</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">Self</span> <span class=\"token punctuation\">{</span> x<span class=\"token punctuation\">,</span> y <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">origin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">Self</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">Self</span> <span class=\"token punctuation\">{</span> x<span class=\"token punctuation\">:</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">:</span> <span class=\"token number\">0.0</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">distance_from_origin</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">self</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">f64</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token punctuation\">(</span><span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>x <span class=\"token operator\">*</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>x <span class=\"token operator\">+</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>y <span class=\"token operator\">*</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sqrt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">impl</span> <span class=\"token namespace\">fmt<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Display</span> <span class=\"token keyword\">for</span> <span class=\"token class-name\">Point</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">fmt</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">self</span><span class=\"token punctuation\">,</span> f<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> <span class=\"token namespace\">fmt<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Formatter</span><span class=\"token operator\">&lt;</span><span class=\"token lifetime-annotation symbol\">'_</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token namespace\">fmt<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Result</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">write!</span><span class=\"token punctuation\">(</span>f<span class=\"token punctuation\">,</span> <span class=\"token string\">\"({}, {})\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// new を使って Point を作成</span>\n    <span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> <span class=\"token class-name\">Point</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token number\">3.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"p1 の座標 = {}\"</span><span class=\"token punctuation\">,</span> p1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// origin を使って原点を作成</span>\n    <span class=\"token keyword\">let</span> origin <span class=\"token operator\">=</span> <span class=\"token class-name\">Point</span><span class=\"token punctuation\">::</span><span class=\"token function\">origin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"原点の座標 = {}\"</span><span class=\"token punctuation\">,</span> origin<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n    <span class=\"token comment\">// distance_from_origin を使って原点からの距離を計算</span>\n    <span class=\"token keyword\">let</span> distance <span class=\"token operator\">=</span> p1<span class=\"token punctuation\">.</span><span class=\"token function\">distance_from_origin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"p1 の原点からの距離 = {}\"</span><span class=\"token punctuation\">,</span> distance<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>このコードに対して、例えば以下のようにユニットテスト内でロードしたカスタム構造体 Point を使用することができます。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[cfg(test)]</span>\n<span class=\"token keyword\">mod</span> <span class=\"token module-declaration namespace\">tests</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">use</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">::</span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token attribute attr-name\">#[test]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_main_ne_custom_struct</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> p <span class=\"token operator\">=</span> <span class=\"token class-name\">Point</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token number\">1.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token macro property\">assert_ne!</span><span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Point</span><span class=\"token punctuation\">::</span><span class=\"token function\">origin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>ただし、このコードで上記のテストを実行すると、<code class=\"language-text\">assert_ne!</code> の依存関係にある Debug や PartialEq の実装が存在しないためテストがエラーとなってしまいます。</p>\n<p><img src=\"C:%5CUsers%5Ckash1064%5CCodes%5Cblog-project%5CKaeru-no-Himitsukichi%5Cstatic%5Cmedia%5C2026-05-31-rust-test%5Cimage-20260531224028164.png\" alt=\"image-20260531224028164\"></p>\n<p>このように <code class=\"language-text\">assert_ne!</code> などのマクロをカスタム構造体のテストに使用する場合は、構造体に <code class=\"language-text\">#[derive(Debug,PartialEq)]</code> を付けて実装を導出しておく必要があります。</p>\n<h3 id=\"ユニットテストテストのサンプル-3\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-3\" aria-label=\"ユニットテストテストのサンプル 3 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユニットテストテストのサンプル 3</h3>\n<p>ここまではテスト関数内でパニックが発生した場合にテストが失敗していましたが、意図的にパニックを発生させたい関数について、「適切にパニックが発生するか」をテストすることもできます。</p>\n<p>例えば、以下のような 0 除算が発生した場合に panic をトリガーする除算関数をテストするとします。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">divide</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> b <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">panic!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ゼロで除算することはできません: {} / {}\"</span><span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    a <span class=\"token operator\">/</span> b\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>この場合には、以下のように <code class=\"language-text\">#[should_panic]</code> アトリビュートをテスト関数に付与します。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token attribute attr-name\">#[should_panic]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_divide_by_zero_panics</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">divide</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// パニックするので、テストは成功</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>このテストが実行された場合には、0 除算によるパニックが発生すればテストが成功となり、逆にパニックが発生せず divide 関数による除算が成功するとテストは失敗となります。</p>\n<p>参考：<a href=\"https://doc.rust-lang.org/rust-by-example/testing/unit_testing.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Unit testing - Rust By Example</a></p>\n<p>また、<code class=\"language-text\">#[should_panic(expected = \"message\")]</code> のようにパニック発生時のメッセージをアトリビュートで指定することもできます。</p>\n<h3 id=\"ユニットテストテストのサンプル-4\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-4\" aria-label=\"ユニットテストテストのサンプル 4 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユニットテストテストのサンプル 4</h3>\n<p>以下はドキュメントのサンプルのそのまま引用ですが、<code class=\"language-text\">#[ignore]</code> アトリビュートを記述することで、特定のテスト関数を <code class=\"language-text\">cargo test</code> 時に実行させないようにすることができます。</p>\n<p>このような除外されたテストについては <code class=\"language-text\">cargo test -- --ignored</code> で実行することができます。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n    a <span class=\"token operator\">+</span> b\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[cfg(test)]</span>\n<span class=\"token keyword\">mod</span> <span class=\"token module-declaration namespace\">tests</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">use</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">::</span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token attribute attr-name\">#[test]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_add</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token attribute attr-name\">#[test]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_add_hundred</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">102</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">102</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token attribute attr-name\">#[test]</span>\n    <span class=\"token attribute attr-name\">#[ignore]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">ignored_test</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"その他ユニットテストの注意点\" style=\"position:relative;\"><a href=\"#%E3%81%9D%E3%81%AE%E4%BB%96%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9\" aria-label=\"その他ユニットテストの注意点 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>その他ユニットテストの注意点</h3>\n<p>Rust のテストは、デフォルトでは複数スレッドで並列実行されるようです。</p>\n<p>そのため、複数のテスト間でファイルや DB などのリソースを共有する必要がある場合には適切に Mutex などによりリソースを保護するなどの注意が必要です。</p>\n<p>テスト時の並列実行を無効化したい場合は <code class=\"language-text\">cargo test -- --test-threads=1</code> を使用できます。</p>\n<p>参考：<a href=\"https://doc.rust-jp.rs/book-ja/ch11-02-running-tests.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">テストの実行のされ方を制御する - The Rust Programming Language 日本語版</a></p>\n<p>また、テストの実行順序は保証されていないため、複数のテスト間に依存関係が発生しないように注意する必要があります。</p>\n<h2 id=\"結合テスト\" style=\"position:relative;\"><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88\" aria-label=\"結合テスト permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>結合テスト</h2>\n<h3 id=\"結合テストの基本構造\" style=\"position:relative;\"><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E9%80%A0\" aria-label=\"結合テストの基本構造 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>結合テストの基本構造</h3>\n<p>Rust の結合テストは、クレートの外側から、ユーザーと同じ視点でプログラムの公開されたインターフェースのみを使用してテストを行います。</p>\n<p>結合テストは、ライブラリの各モジュールの連携が正しく動作するかをテストする目的で行われます。</p>\n<p>Cargo は、以下のように src ディレクトリと並んで配置された tests  ディレクトリを結合テストとして扱います。</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">my_project/\n├── Cargo.toml\n├── src/\n│   ├── lib.rs          <span class=\"token comment\"># ライブラリ本体</span>\n│   └── utils.rs\n└── tests/              <span class=\"token comment\"># 結合テスト専用ディレクトリ</span>\n    ├── api_test.rs     <span class=\"token comment\"># 個別のテストファイル（各自が独立クレート）</span>\n    ├── edge_cases.rs\n    └── common/         <span class=\"token comment\"># テスト共有ユーティリティ</span>\n        └── mod.rs      <span class=\"token comment\"># mod.rs にすることでテストファイルと認識されないため、テスト用のヘルパーコードを配置できる</span></code></pre></div>\n<p>参考：<a href=\"https://doc.rust-jp.rs/rust-by-example-ja/testing/integration_testing.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">インテグレーションテスト - Rust By Example 日本語版</a></p>\n<h3 id=\"結合テストのサンプル-1\" style=\"position:relative;\"><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-1\" aria-label=\"結合テストのサンプル 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>結合テストのサンプル 1</h3>\n<p>今回は、Claude に適当に作らせた電卓ライブラリに対する結合テストを作成します。</p>\n<p>クライアントプログラムからこのライブラリを使用する場合、アプリケーションは <code class=\"language-text\">rust_integration_test_samples</code> クレートの各種モジュールを以下のようにインポートする必要があります。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">rust_integration_test_samples<span class=\"token punctuation\">::</span>calculator<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Calculator</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">rust_integration_test_samples<span class=\"token punctuation\">::</span>storage<span class=\"token punctuation\">::</span></span><span class=\"token punctuation\">{</span><span class=\"token class-name\">Storage</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">StorageValue</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">rust_integration_test_samples<span class=\"token punctuation\">::</span>user<span class=\"token punctuation\">::</span></span><span class=\"token punctuation\">{</span><span class=\"token class-name\">Role</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">UserService</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>これは、結合テストを行うテストコードについても同様で、テストコード側でもクライアントプログラムを実装する場合と同じく外部からライブラリを利用するためにモジュールのインポートを行う必要があります。</p>\n<p>以下は最もシンプルな結合テストの実装です。</p>\n<p>以下では、クライアントプログラムと同様にライブラリの Calculator モジュールをインポートし、<code class=\"language-text\">test_calculator_basic_operations</code> というテスト関数で add や subtract、multiply などの関数の戻り値をテストしています。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">rust_integration_test_samples<span class=\"token punctuation\">::</span>calculator<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Calculator</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_calculator_basic_operations</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> calc <span class=\"token operator\">=</span> <span class=\"token class-name\">Calculator</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span><span class=\"token number\">10.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">multiply</span><span class=\"token punctuation\">(</span><span class=\"token number\">3.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">21.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>このテストコードは、tests 配下に配置したファイルに記述します。</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">my_project/\n├── Cargo.toml\n├── src/\n│   ├── lib.rs          <span class=\"token comment\"># ライブラリ本体</span>\n│   └── utils.rs\n└── tests/              <span class=\"token comment\"># 結合テスト専用ディレクトリ</span>\n    └── api_test.rs     <span class=\"token comment\"># 個別のテストファイル（各自が独立クレート）</span></code></pre></div>\n<h3 id=\"結合テストのサンプル-2\" style=\"position:relative;\"><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-2\" aria-label=\"結合テストのサンプル 2 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>結合テストのサンプル 2</h3>\n<p>同じテストコード内で、以下のように正常系や異常系のテストを行うこともできます。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">/// 除算のテスト（正常系）</span>\n<span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_calculator_division</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> calc <span class=\"token operator\">=</span> <span class=\"token class-name\">Calculator</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> calc<span class=\"token punctuation\">.</span><span class=\"token function\">divide</span><span class=\"token punctuation\">(</span><span class=\"token number\">10.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span><span class=\"token number\">5.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/// 除算のテスト（エラー系：ゼロ除算）</span>\n<span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_calculator_division_by_zero</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> calc <span class=\"token operator\">=</span> <span class=\"token class-name\">Calculator</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> calc<span class=\"token punctuation\">.</span><span class=\"token function\">divide</span><span class=\"token punctuation\">(</span><span class=\"token number\">10.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CalcError</span><span class=\"token punctuation\">::</span><span class=\"token class-name\">DivisionByZero</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>ライブラリ側の divide 関数は以下のように実装されており戻り値として <code class=\"language-text\">Result&lt;f64, CalcError></code> を返すため、結合テスト側のテストコードでも <code class=\"language-text\">assert_eq!(result, Ok(5.0));</code> や <code class=\"language-text\">assert_eq!(result, Err(CalcError::DivisionByZero));</code> による結果の評価を行っています。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">divide</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">:</span> <span class=\"token keyword\">f64</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">:</span> <span class=\"token keyword\">f64</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Result</span><span class=\"token operator\">&lt;</span><span class=\"token keyword\">f64</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">CalcError</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> b <span class=\"token operator\">==</span> <span class=\"token number\">0.0</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CalcError</span><span class=\"token punctuation\">::</span><span class=\"token class-name\">DivisionByZero</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> a <span class=\"token operator\">/</span> b<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span><span class=\"token function\">record</span><span class=\"token punctuation\">(</span><span class=\"token macro property\">format!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"{} / {}\"</span><span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"結合テストのサンプル-3\" style=\"position:relative;\"><a href=\"#%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-3\" aria-label=\"結合テストのサンプル 3 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>結合テストのサンプル 3</h3>\n<p>結合テストでは、ユーザーがクライアントプログラムを操作した場合と同じように一連の操作後の状態を順にテストすることもできます。</p>\n<p>例えば以下の例では、ライブラリ側で管理する計算履歴の情報に対して、計算の実行後や履歴のクリア後のカウント数をテストしたり、履歴のテスト後も計算を継続することが可能であることを確認するテストを実装しています。</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token attribute attr-name\">#[test]</span>\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">test_calculator_history_management</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> calc <span class=\"token operator\">=</span> <span class=\"token class-name\">Calculator</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// 初期状態</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">history</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// 操作を実行</span>\n    calc<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    calc<span class=\"token punctuation\">.</span><span class=\"token function\">multiply</span><span class=\"token punctuation\">(</span><span class=\"token number\">3.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">history</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// 履歴クリア</span>\n    calc<span class=\"token punctuation\">.</span><span class=\"token function\">clear_history</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">history</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// クリア後も操作は可能</span>\n    calc<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">5.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">assert_eq!</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">history</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"まとめ\" style=\"position:relative;\"><a href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" aria-label=\"まとめ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>まとめ</h2>\n<p>ユニットテストや結合テストにはもっと色々な記法があり、より複雑なテストの実装も可能なようですが、とりあえず今回はここまでにします。</p>\n<p>最近は AI 使ってばっかりなのでもっとテストをガリガリ書けるようになりたいですね。</p>","fields":{"slug":"/rust-test","tagSlugs":["/tag/rust/"]},"frontmatter":{"date":"2026-06-01","description":"Rust のエラーハンドリングと thiserror に関するメモ書きです。","tags":["Rust"],"title":"Rust のエラーハンドリングと thiserror に関するメモ書き","socialImage":{"publicURL":"/static/42a86ef0996119572315112587f870d4/rust-test.png"}}}},"pageContext":{"slug":"/rust-test"}},"staticQueryHashes":["251939775","401334301","825871152"]}