<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CI/CD  |  Python-memo｜自動化・AI・Web開発の実験室</title>
	<atom:link href="https://python.cbagames.jp/tag/ci-cd/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.cbagames.jp</link>
	<description>Pythonで、できるをふやそう。</description>
	<lastBuildDate>Tue, 23 Dec 2025 09:36:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://python.cbagames.jp/wp-content/uploads/2025/06/cropped-497d491d54402de785c9e043bfa0620a-32x32.png</url>
	<title>CI/CD  |  Python-memo｜自動化・AI・Web開発の実験室</title>
	<link>https://python.cbagames.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pythonのテスト設計入門｜「何をテストするか」が一瞬で分かる思考法</title>
		<link>https://python.cbagames.jp/2025/12/23/python-test-design-what-to-test/</link>
					<comments>https://python.cbagames.jp/2025/12/23/python-test-design-what-to-test/#respond</comments>
		
		<dc:creator><![CDATA[asukapy]]></dc:creator>
		<pubDate>Tue, 23 Dec 2025 09:35:23 +0000</pubDate>
				<category><![CDATA[Python入門]]></category>
		<category><![CDATA[CI/CD]]></category>
		<category><![CDATA[pytest]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[unittest]]></category>
		<category><![CDATA[テスト設計]]></category>
		<category><![CDATA[モック]]></category>
		<category><![CDATA[ユニットテスト]]></category>
		<guid isPermaLink="false">https://python.cbagames.jp/?p=709</guid>

					<description><![CDATA[目次 はじめに1. なぜ「テスト設計」が重要なのか手動テストには限界がある「祈りのリリース」になっていないかテストがないコードは、育てられない2. Pythonにおけるテストの全体像を整理するテストは「範囲」と「目的」で [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">1. なぜ「テスト設計」が重要なのか</a><ol><li><a href="#toc3" tabindex="0">手動テストには限界がある</a></li><li><a href="#toc4" tabindex="0">「祈りのリリース」になっていないか</a></li><li><a href="#toc5" tabindex="0">テストがないコードは、育てられない</a></li></ol></li><li><a href="#toc6" tabindex="0">2. Pythonにおけるテストの全体像を整理する</a><ol><li><a href="#toc7" tabindex="0">テストは「範囲」と「目的」で分けて考える</a></li><li><a href="#toc8" tabindex="0">「自動テスト」と「テストの種類」は別物</a></li><li><a href="#toc9" tabindex="0">Pythonでよく使われるテストツール</a></li></ol></li><li><a href="#toc10" tabindex="0">3. 「何をテストするか」を一瞬で判断する思考フレーム</a><ol><li><a href="#toc11" tabindex="0">3-1. まずテストすべきコードの特徴</a></li><li><a href="#toc12" tabindex="0">3-2. あえてテストを書かなくてよいケース</a></li><li><a href="#toc13" tabindex="0">3-3. 「このテストは何を守っているか」を言語化する</a></li></ol></li><li><a href="#toc14" tabindex="0">4. テスト設計の「型」を身につける</a><ol><li><a href="#toc15" tabindex="0">4-1. AAAパターン（Arrange / Act / Assert）</a></li><li><a href="#toc16" tabindex="0">4-2. Given-When-Thenで仕様をテストに落とす</a></li><li><a href="#toc17" tabindex="0">4-3. 良いテストの共通点</a></li></ol></li><li><a href="#toc18" tabindex="0">5. テスト設計を体系的に学びたい人へ</a><ol><li><a href="#toc19" tabindex="0">テスト駆動Python 第2版</a></li></ol></li><li><a href="#toc20" tabindex="0">6. Pythonでの具体的なテスト実装手順</a><ol><li><a href="#toc21" tabindex="0">6-1. 仮想環境を用意する</a></li><li><a href="#toc22" tabindex="0">6-2. unittestによるテストの基本構造</a></li><li><a href="#toc23" tabindex="0">6-3. setUp / tearDownで前後処理をまとめる</a></li></ol></li><li><a href="#toc24" tabindex="0">7. pytestでテストを書くと何が変わるのか</a><ol><li><a href="#toc25" tabindex="0">7-1. テストコードが驚くほどシンプルになる</a></li><li><a href="#toc26" tabindex="0">7-2. fixtureで「準備コード」を設計できる</a></li><li><a href="#toc27" tabindex="0">7-3. テストが「仕様書」に近づく</a></li><li><a href="#toc28" tabindex="0">pytestをきちんと理解したい人へ</a></li></ol></li><li><a href="#toc29" tabindex="0">8. 一歩先へ：モック・静的解析・CI/CD</a><ol><li><a href="#toc30" tabindex="0">8-1. モックで「テストできない」をなくす</a></li><li><a href="#toc31" tabindex="0">8-2. 静的解析で「崩れ方」を早めに止める</a></li><li><a href="#toc32" tabindex="0">8-3. CI/CDでテストを“習慣”にする</a></li></ol></li><li><a href="#toc33" tabindex="0">まとめ</a></li><li><a href="#toc34" tabindex="0">あわせて読みたい</a><ol><li><a href="#toc35" tabindex="0">参考文献</a></li></ol></li><li><a href="#toc36" tabindex="0">よくある質問（Q&amp;A）</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>Pythonで開発をしていると、こんな不安を感じたことはありませんか？<br>「ちゃんと動いているはずだけど、どこか壊れていそう…」 「修正したら、別の場所が動かなくなった気がする…」</p>



<p>その不安の正体は、<strong>テスト不足</strong>というよりも、 <strong>「テスト設計が曖昧なこと」</strong>にあるケースがとても多いです。</p>



<p>実は、テストを書くうえで一番むずかしいのは、<br><strong>「どう書くか」ではなく「何をテストするか」</strong>を決めること。<br>ここが整理できていないと、テストは増えるのに安心感は増えず、 だんだん「テストがしんどいもの」になってしまいます。</p>



<p>この記事では、Python初心者の方から、pytestを触ったことがある中級者の方までを対象に、<br><strong>「何をテストすべきか」を一瞬で判断するための考え方</strong>を中心に解説します。</p>



<p>AAAパターンやGiven-When-Thenといった定番の型、 unittest・pytestの使い分け、 そして実務でテストが“武器”になる設計の考え方まで、<br>できるだけ噛み砕いて、順番にお話ししていきますね。</p>



<p>テストは、開発を縛るものではなく、<br><strong>安心してコードを書き続けるための味方</strong>です。<br>この記事が、「テスト、ちょっと分かってきたかも😊」と思えるきっかけになれば嬉しいです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc2">1. なぜ「テスト設計」が重要なのか</span></h2>



<p>テストというと、「あとからバグを見つけるための作業」というイメージを持っている人も多いかもしれません。 ですが実際には、<strong>テストはバグを減らすための仕組み</strong>というより、 <strong>安心して開発を進めるための土台</strong>に近い存在です。</p>



<p>特に問題になりやすいのが、<strong>設計されていないテスト</strong>です。 「とりあえず動くか確認する」「重要そうなところだけ何となくテストする」 という状態では、次のような問題が起こりがちです。</p>



<h3 class="wp-block-heading"><span id="toc3">手動テストには限界がある</span></h3>



<p>アプリケーションが小さいうちは、手動での確認でも何とか回ります。 しかし機能が増えてくると、<br>「毎回すべてを確認するのは現実的ではない」 「前は動いていたのに、どこで壊れたのか分からない」 という状況に陥りやすくなります。</p>



<p>人の記憶と注意力に頼ったテストは、どうしても抜け漏れが発生します。 その結果、<strong>不具合はリリース直前や本番環境で発覚</strong>し、 修正コストが一気に跳ね上がってしまいます。</p>



<h3 class="wp-block-heading"><span id="toc4">「祈りのリリース」になっていないか</span></h3>



<p>テスト設計が弱いと、修正を加えるたびに<br>「ここを直したけど、他は大丈夫だよね……？」<br>と不安を抱えたままリリースすることになります。</p>



<p>これは決して珍しい話ではなく、 <strong>テストが「何を守っているのか分からない」状態</strong>であることが原因です。 テストがあっても、設計されていなければ安心感は得られません。</p>



<h3 class="wp-block-heading"><span id="toc5">テストがないコードは、育てられない</span></h3>



<p>もうひとつ大きな問題は、<strong>リファクタリングができなくなる</strong>ことです。</p>



<p>テストがないコードは、<br>「触ったら壊れそう」 「どこまで変更していいのか分からない」<br>という状態になりがちです。</p>



<p>その結果、小さな改善が先延ばしにされ、 コードは少しずつ読みにくく、変更しづらくなっていきます。 これがいわゆる<strong>技術的負債</strong>です。</p>



<p>逆に、<strong>設計されたテストがあるコード</strong>は、 「壊れていないことをすぐ確認できる」ため、 安心して手を入れることができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>だからこそ重要なのが、<br><strong>「とにかくテストを書く」ことではなく、「何を守るためのテストなのか」を決めること</strong>。<br>ここを明確にするのが、テスト設計の役割です。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc6">2. Pythonにおけるテストの全体像を整理する</span></h2>



<p>テスト設計を考えるうえで、まず押さえておきたいのが <strong>「テストにはいくつかの役割と粒度がある」</strong>という点です。</p>



<p>ここが曖昧なままだと、<br>「このテストは何のために書いているのか？」 「どこまで確認すれば十分なのか？」<br>が分からなくなり、テストが増えるほど混乱してしまいます。</p>



<h3 class="wp-block-heading"><span id="toc7">テストは「範囲」と「目的」で分けて考える</span></h3>



<p>Pythonのテストは、大きく分けると <strong>テスト対象の範囲</strong>によって分類できます。</p>



<ul class="wp-block-list">
<li><strong>ユニットテスト（単体テスト）</strong><br>関数やメソッドなど、最小単位のロジックが 期待通りの結果を返すかを確認するテストです。 ロジックの正しさを素早く検証できるため、 Python開発では最も数が多くなります。</li>



<li><strong>統合テスト</strong><br>複数のコンポーネントを組み合わせたときに、 データの受け渡しや振る舞いが正しく連携しているかを確認します。 API、DB、外部サービスとの連携部分が対象になることが多いです。</li>



<li><strong>リグレッションテスト（回帰テスト）</strong><br>修正や機能追加によって、 既存の動作が壊れていないことを保証するためのテストです。 自動テストとして継続的に実行されるのが一般的です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc8">「自動テスト」と「テストの種類」は別物</span></h3>



<p>よく混同されがちですが、 <strong>自動テスト</strong>という言葉は テストの「種類」ではなく<strong>実行方法</strong>を指します。</p>



<p>ユニットテストも統合テストも、 スクリプトで自動実行されていれば自動テストですし、 人が画面を操作して確認すれば手動テストになります。</p>



<p>設計の観点では、<br>「どのレベルのテストを、どこまで自動化するか」<br>を分けて考えることが重要です。</p>



<h3 class="wp-block-heading"><span id="toc9">Pythonでよく使われるテストツール</span></h3>



<p>Pythonには、テストを書くための環境が最初から整っています。</p>



<ul class="wp-block-list">
<li><strong>unittest</strong><br>Python標準ライブラリに含まれるテストフレームワーク。 クラスベースで明示的に書くスタイルのため、 テストの構造を理解しやすいのが特徴です。</li>



<li><strong>pytest</strong><br>よりシンプルな記述でテストを書ける人気のフレームワーク。 fixtureやパラメータ化など、 テスト設計の表現力が高いのが強みです。</li>
</ul>



<p>どちらが正解ということはなく、 <strong>重要なのは「どんなテストを、なぜ書くのか」</strong>です。 ツールは、その考え方を実装するための手段にすぎません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次のセクションでは、<br><strong>「すべてをテストしなくていい理由」</strong>と、 <strong>本当にテストすべきポイントの見極め方</strong><br>を具体的な基準として整理していきます。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc10">3. 「何をテストするか」を一瞬で判断する思考フレーム</span></h2>



<p>テスト設計で一番悩みやすいのが、 <strong>「どこまでテストを書けばいいのか分からない」</strong>という問題です。</p>



<p>すべての関数・すべての分岐をテストしようとすると、 テストを書くこと自体が目的になり、 開発スピードもモチベーションも下がってしまいます。</p>



<p>大切なのは、<br><strong>壊れたら困るところから優先的に守る</strong><br>という考え方です。</p>



<h3 class="wp-block-heading"><span id="toc11">3-1. まずテストすべきコードの特徴</span></h3>



<p>次のようなコードは、優先的にテストを書く価値があります。</p>



<ul class="wp-block-list">
<li><strong>重要なユースケース</strong><br>ユーザー登録、決済処理、データ保存など、 アプリケーションの中核となる処理。 ここが壊れると、サービス全体が成り立たなくなります。</li>



<li><strong>複雑なロジック</strong><br>条件分岐が多い、計算が入り組んでいる、 一目で正しさが判断できない処理。 人間の目だけでの確認には限界があります。</li>



<li><strong>境界値・エッジケース</strong><br>0、空文字、最大値・最小値など、 普段は意識しづらい入力に対する挙動。 バグはこうした「境目」で起こりがちです。</li>



<li><strong>過去にバグを出した箇所</strong><br>一度壊れた場所は、また壊れやすい場所です。 再発防止としてテストを書くことで、 同じミスを繰り返さずに済みます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc12">3-2. あえてテストを書かなくてよいケース</span></h3>



<p>逆に、次のような箇所は 無理にテストを書かなくても問題ないことが多いです。</p>



<ul class="wp-block-list">
<li>フレームワークが保証している単純な設定や配線だけのコード</li>



<li>単なるデータの受け渡しだけをしている薄いラッパー</li>



<li>仕様が頻繁に変わる初期段階のプロトタイプ</li>
</ul>



<p>こうした部分まで完璧にテストしようとすると、 テストのメンテナンスコストばかりが増えてしまいます。</p>



<h3 class="wp-block-heading"><span id="toc13">3-3. 「このテストは何を守っているか」を言語化する</span></h3>



<p>テストを書く前に、<br><strong>「このテストが失敗したら、何が困るのか」</strong><br>を一度言葉にしてみてください。</p>



<p>たとえば、<br>「不正な入力を弾けなくなる」 「計算結果がズレる」 「権限のない操作が通ってしまう」<br>といった具体的なリスクが思い浮かぶなら、 それはテストを書く価値のある対象です。</p>



<p>この視点を持つだけで、 <strong>テストは「量」ではなく「意味」で選べる</strong>ようになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次は、<br><strong>テストを読みやすく、壊れにくくするための「設計の型」</strong><br>を紹介します。 ここを押さえると、テストを書くスピードも一気に上がりますよ。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc14">4. テスト設計の「型」を身につける</span></h2>



<p>「何をテストするか」が決まったら、次に大切なのが <strong>テストをどういう形で書くか</strong>です。</p>



<p>テストは動けばOKではなく、<br><strong>あとから読んだときに意図がすぐ分かること</strong><br>がとても重要です。</p>



<p>そこで役に立つのが、テスト設計の<strong>定番の型</strong>です。 型を使うことで、テストの読みやすさと保守性が一気に上がります。</p>



<h3 class="wp-block-heading"><span id="toc15">4-1. AAAパターン（Arrange / Act / Assert）</span></h3>



<p>AAAパターンは、テストを次の3段階に分けて考える方法です。</p>



<ol class="wp-block-list">
<li><strong>Arrange（準備）</strong><br>テストに必要な入力データや初期状態を用意します。</li>



<li><strong>Act（実行）</strong><br>テスト対象の関数やメソッドを実行します。</li>



<li><strong>Assert（検証）</strong><br>実行結果が期待通りかを確認します。</li>
</ol>



<p>この順番を守るだけで、<br><strong>「何を準備して、何を試して、何を確認しているテストなのか」</strong><br>が一目で分かるようになります。</p>



<p>特にPythonのテストでは、 Arrangeが長くなりすぎていないかを見るだけでも、 「このテスト、ちょっと責務が重いかも？」 と気づけるようになります。</p>



<h3 class="wp-block-heading"><span id="toc16">4-2. Given-When-Thenで仕様をテストに落とす</span></h3>



<p>Given-When-Thenは、 <strong>仕様を文章の形で整理し、そのままテストに落とす</strong>考え方です。</p>



<ul class="wp-block-list">
<li><strong>Given</strong>：どんな前提条件か</li>



<li><strong>When</strong>：どんな操作・処理を行ったか</li>



<li><strong>Then</strong>：どんな結果になるべきか</li>
</ul>



<p>この構造でテストを考えると、<br><strong>「実装のテスト」ではなく「振る舞いのテスト」</strong><br>になりやすいのが大きなメリットです。</p>



<p>実装の細かい中身が変わっても、 振る舞いが変わらなければテストは壊れません。 これは、将来のリファクタリングをとても楽にしてくれます。</p>



<h3 class="wp-block-heading"><span id="toc17">4-3. 良いテストの共通点</span></h3>



<p>AAAやGiven-When-Thenを意識して書かれたテストには、 次のような共通点があります。</p>



<ul class="wp-block-list">
<li>テスト名を読むだけで、何を確認しているか分かる</li>



<li>1つのテストで確認していることが1つだけ</li>



<li>失敗したときに、原因の見当がすぐ付く</li>
</ul>



<p>テストは「安心を増やすためのコード」です。 型を使って設計することで、 テストはどんどん<strong>心強い味方</strong>になっていきます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次は、<br><strong>テスト設計を体系的に学びたい人向けのおすすめ書籍</strong><br>を紹介します。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc18">5. テスト設計を体系的に学びたい人へ</span></h2>



<p>ここまでで、<br>「何をテストするか」 「どういう型でテストを書くか」<br>という<strong>考え方の土台</strong>はだいぶ見えてきたと思います。</p>



<p>ただ、実務でテスト設計を身につけるには、 <strong>まとまった形でのインプット</strong>もやはり強力です。</p>



<p>特に、<br>「テストを書く理由が腹落ちしない」 「テスト駆動開発って結局何がいいの？」<br>と感じている方には、次の一冊がおすすめです。</p>



<h3 class="wp-block-heading"><span id="toc19">テスト駆動Python 第2版</span></h3>



<p>この本の特徴は、 <strong>テストコードの書き方</strong>よりも、 <strong>なぜそのテストを書くのか</strong>に重点が置かれている点です。</p>



<p>小さなテストを書き、 実装し、 リファクタリングする。<br>その一連の流れを追体験することで、 <strong>テストが設計そのものを支えている</strong>感覚が自然と身についていきます。</p>



<p>「テスト＝面倒な作業」から<br>「テスト＝設計を助けてくれる存在」<br>に意識が変わる一冊です。</p>



<p>テスト駆動Python 第2版<br>✅ <a rel="noopener" target="_blank" href="https://amzn.to/3MI0eNt">Amazonでチェックする</a>｜ ✅ <a rel="noopener" target="_blank" href="https://a.r10.to/h54V3w">楽天でチェックする</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次のセクションでは、<br>unittestの基本を踏まえたうえで、 <strong>pytestを使うとテスト設計がどう変わるのか</strong><br>を具体的に見ていきます。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc20">6. Pythonでの具体的なテスト実装手順</span></h2>



<p>ここからは、<br>これまで整理してきた<strong>テスト設計の考え方</strong>を、 実際のPythonコードにどう落とし込むかを見ていきます。</p>



<p>まずは基本となる環境づくりと、 Python標準の <strong>unittest</strong> を使ったテストの構造から確認しましょう。</p>



<h3 class="wp-block-heading"><span id="toc21">6-1. 仮想環境を用意する</span></h3>



<p>テストを書く前に、プロジェクトごとに <strong>依存関係を分離する環境</strong>を用意しておくのがおすすめです。</p>



<p>Pythonでは、標準機能だけで簡単に仮想環境を作れます。</p>



<pre class="wp-block-code"><code>python -m venv venv</code></pre>



<p>仮想環境を使うことで、<br>・ライブラリのバージョン違いによる事故を防げる ・テスト環境を再現しやすくなる<br>といったメリットがあります。</p>



<h3 class="wp-block-heading"><span id="toc22">6-2. unittestによるテストの基本構造</span></h3>



<p>unittestでは、 <strong>TestCaseクラスを継承したクラス</strong>を作り、 その中にテストを書いていきます。</p>



<p>ポイントは次の3つです。</p>



<ul class="wp-block-list">
<li>テストクラスは <strong>unittest.TestCase</strong> を継承する</li>



<li>テストメソッド名は <strong>test_</strong> で始める</li>



<li>assert系メソッドで結果を検証する</li>
</ul>



<p>assertEqual や assertRaises などを使うことで、 「何を期待しているテストなのか」が明確になります。</p>



<h3 class="wp-block-heading"><span id="toc23">6-3. setUp / tearDownで前後処理をまとめる</span></h3>



<p>テストごとに同じ準備処理を書くのは、 読みにくく、修正もしづらくなりがちです。</p>



<p>unittestでは、 <strong>setUp</strong> と <strong>tearDown</strong> を使って テスト前後の処理をまとめられます。</p>



<ul class="wp-block-list">
<li><strong>setUp</strong>：各テストの前に毎回実行される</li>



<li><strong>tearDown</strong>：各テストの後に毎回実行される</li>
</ul>



<p>これにより、<br>「準備 → 実行 → 検証」<br>というAAAパターンが、自然な形でコードに現れます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次のセクションでは、<br><strong>pytestを使うことで、テスト設計と記述がどう変わるのか</strong><br>を見ていきましょう。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc24">7. pytestでテストを書くと何が変わるのか</span></h2>



<p>unittestでテストの基本構造が分かってくると、 次に気になってくるのが <strong>「pytestって何がそんなに良いの？」</strong> という点だと思います。</p>



<p>結論から言うと、pytestは<br><strong>テスト設計の意図を、よりシンプルにコードで表現できる</strong><br>フレームワークです。</p>



<h3 class="wp-block-heading"><span id="toc25">7-1. テストコードが驚くほどシンプルになる</span></h3>



<p>pytestでは、unittestのように TestCaseクラスを継承する必要がありません。</p>



<p>関数としてテストを書くだけでよいため、 <strong>「準備・実行・検証」</strong>の流れがとても読みやすくなります。</p>



<p>特に、<br>・テストコードが長くなりがち ・初見の人が意図を読み取りにくい<br>と感じていた方には、大きな変化を感じやすいはずです。</p>



<h3 class="wp-block-heading"><span id="toc26">7-2. fixtureで「準備コード」を設計できる</span></h3>



<p>pytestの大きな特徴が、 <strong>fixture</strong>という仕組みです。</p>



<p>fixtureを使うことで、<br>「どんな前提条件でテストしているのか」<br>を関数として明示的に表現できます。</p>



<p>これは単なる便利機能ではなく、 <strong>テスト設計そのものを整理する道具</strong>として非常に強力です。</p>



<h3 class="wp-block-heading"><span id="toc27">7-3. テストが「仕様書」に近づく</span></h3>



<p>pytestは、 Given-When-Thenの考え方とも相性がよく、 <strong>振る舞いベースのテスト</strong>を書きやすいのが特徴です。</p>



<p>その結果、<br>・テストを読むだけで仕様が分かる ・実装が変わってもテストが壊れにくい<br>という状態を作りやすくなります。</p>



<p>「pytestを使うと楽になる」というより、<br><strong>設計の意図が、テストコードに素直に現れる</strong><br>と考えるとイメージしやすいかもしれません。</p>



<h3 class="wp-block-heading"><span id="toc28">pytestをきちんと理解したい人へ</span></h3>



<p>pytestは手軽に始められる一方で、 fixtureやパラメータ化など、 設計に直結する機能も多くあります。</p>



<p>「なんとなく使っている状態」から一歩進みたい方には、 次のガイドがとても参考になります。</p>



<p>pytest Quick Start Guide<br>✅ <a rel="noopener" target="_blank" href="https://amzn.to/498yhWq">Amazonでチェックする</a>｜ ✅ <a rel="noopener" target="_blank" href="https://a.r10.to/hYxfr7">楽天でチェックする</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次は、<br><strong>テストを「書いて終わり」にしないための応用テクニック</strong><br>として、モック・静的解析・CI/CD連携をまとめて紹介します。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc29">8. 一歩先へ：モック・静的解析・CI/CD</span></h2>



<p>テスト設計ができるようになると、 次に大事になるのが <strong>「テストを継続して回せる仕組み」</strong>です。</p>



<p>テストは、書いた瞬間だけ役に立つものではなく、 <strong>変更し続けるコードを守り続けるもの</strong>です。 そのために、ここから紹介する3つの要素が効いてきます。</p>



<h3 class="wp-block-heading"><span id="toc30">8-1. モックで「テストできない」をなくす</span></h3>



<p>テストが難しくなる代表例は、 <strong>外部に依存している処理</strong>です。</p>



<ul class="wp-block-list">
<li>外部APIへのリクエスト</li>



<li>データベースへの読み書き</li>



<li>ファイルI/O（読み込み・保存）</li>



<li>時刻や乱数など、毎回結果が変わる要素</li>
</ul>



<p>これらをそのままテストすると、<br>・ネットワーク状態で結果が変わる ・テストが遅い ・失敗原因がコードなのか外部なのか分からない<br>という「しんどいテスト」になりがちです。</p>



<p>そこで使うのが<strong>モック</strong>です。 外部依存を「仮のオブジェクト」に置き換えることで、 <strong>テスト対象のロジックだけ</strong>を安定して検証できます。</p>



<p>コツは、モックを多用することではなく、 <strong>「どこまでを自分の責任範囲としてテストするか」</strong> をはっきりさせることです。</p>



<h3 class="wp-block-heading"><span id="toc31">8-2. 静的解析で「崩れ方」を早めに止める</span></h3>



<p>テストは動作の保証ですが、 <strong>読みやすさ</strong>や<strong>一貫性</strong>まで守るには、 静的解析（リンター・フォーマッター）が効きます。</p>



<ul class="wp-block-list">
<li><strong>black</strong>：コードを自動整形して、見た目のブレをなくす</li>



<li><strong>flake8</strong>：スタイル違反や、よくあるミスを早期に検出する</li>
</ul>



<p>これらは「正しさ」そのものではなく、 <strong>コードが壊れやすくなる兆候</strong>を早めに止めてくれます。</p>



<p>とくにテストコードは、 「急いで書いて雑になりがち」なので、 自動で整えてくれる仕組みがあると安心です。</p>



<h3 class="wp-block-heading"><span id="toc32">8-3. CI/CDでテストを“習慣”にする</span></h3>



<p>最後に、実務で一番効くのがここです。 テストは「書ける」だけでは足りなくて、 <strong>毎回自動で回る</strong>状態になって初めて強いです。</p>



<p>たとえばGitHub Actionsなどを使うと、<br>・プッシュしたら自動でテスト ・PRを出したら自動でテスト<br>という流れが作れます。</p>



<p>この状態になると、 <strong>テストは“頑張って実行するもの”から“勝手に守ってくれるもの”</strong> に変わります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>そしてこれが、テスト設計の価値を一段引き上げます。<br>「壊れないことを確認しながら、安心して改善できる」<br>という状態が作れるからです。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc33">まとめ</span></h2>



<p>この記事では、Pythonにおけるテスト設計について、<br><strong>「何をテストするか」をどう判断するか</strong><br>という視点を中心に解説してきました。</p>



<p>もう一度、ポイントを振り返ってみましょう。</p>



<ul class="wp-block-list">
<li>テスト設計で一番大切なのは、<strong>すべてをテストすることではない</strong></li>



<li>壊れたら困る場所・バグが出やすい場所から優先的に守る</li>



<li>AAAパターンやGiven-When-Thenといった<strong>型</strong>を使うと、テストは一気に読みやすくなる</li>



<li>pytestやfixtureは、テストを楽にするだけでなく<strong>設計の意図を表現する道具</strong></li>



<li>モック・静的解析・CI/CDと組み合わせることで、テストは「書いて終わり」にならない</li>
</ul>



<p>テスト設計を、よく <strong>「建設現場の足場」</strong> に例えられることがあります。</p>



<p>足場がしっかりしていれば、 高い場所でも安心して作業ができ、 スピードも精度も上がります。<br>テストもまさに同じで、 <strong>安心してコードを育て続けるための土台</strong>です。</p>



<p>最初から完璧なテスト設計を目指す必要はありません。<br>まずは、 「この変更で、どこが壊れたら一番困るか？」<br>を考えながら、1つずつテストを積み上げていけば大丈夫です。</p>



<p>テストが増えるほど、<br>「修正するのが怖いコード」から 「触るのが楽しいコード」<br>に変わっていきます。</p>



<p>この記事が、 <strong>テスト設計に対するハードルを少し下げるきっかけ</strong> になっていたら嬉しいです 😊</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc34">あわせて読みたい</span></h2>



<p>テスト設計の考え方が見えてきたら、 次は<strong>実装力</strong>や<strong>コード品質</strong>を一緒に伸ばしていくのがおすすめです。 ここでは、今回の内容と相性の良い関連記事を紹介します。</p>



<ul class="wp-block-list">
<li><a target="_blank" href="https://python.cbagames.jp/2025/06/13/python-pytest-beginner-guide/">Pythonでテストコードを書く方法｜pytest入門ガイド</a><br>pytestをこれから本格的に使い始めたい人向け。 基本的な書き方から、実務での使いどころまで整理しています。</li>



<li><a target="_blank" href="https://python.cbagames.jp/2025/06/23/refactoring-for-beginners/">リファクタリングとは？初心者向けにコード改善の基本を解説</a><br>テストがあると、なぜリファクタリングが楽になるのか。 テスト設計とセットで読むと理解が深まります。</li>



<li><a target="_blank" href="https://python.cbagames.jp/2025/12/16/python-exception-design-try-except/">Pythonの例外設計入門｜try/exceptをどう設計するか</a><br>「どこで例外を捕まえるべきか」という設計の話は、 テスト対象を考える視点とも直結します。</li>



<li><a target="_blank" href="https://python.cbagames.jp/2025/09/19/clean-code-rules/">読みやすく変更しやすいPythonコードの書き方</a><br>良いテストは、良いコードから生まれます。 テストしやすい設計を作るための土台としておすすめです。</li>
</ul>



<p>テスト設計は単独のスキルではなく、 <strong>設計・実装・改善</strong>とつながっています。 関連記事もあわせて読むことで、理解がより立体的になりますよ。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc35">参考文献</span></h3>



<ul class="wp-block-list">
<li><a rel="noopener" target="_blank" href="https://qiita.com/jnchito/items/2a5d3e15761fd413657a">テストコードを書くときに知っておきたい考え方（Qiita）</a></li>



<li><a rel="noopener" target="_blank" href="https://zenn.dev/ikemo/articles/test-code-design">テストコード設計の考え方（Zenn）</a></li>



<li><a rel="noopener" target="_blank" href="https://realpython.com/python-testing/">Python Testing Tutorial（Real Python）</a></li>



<li><a rel="noopener" target="_blank" href="https://www.resumy.ai/tech-posts/8b29a835-dbab-4d0f-8363-a8a03ec6b420">ソフトウェアテスト設計の基本と実践（Resumy）</a></li>



<li><a rel="noopener" target="_blank" href="https://techplay.jp/column/1677">テストコードを書く意味と設計の重要性（TECH PLAY）</a></li>



<li><a rel="noopener" target="_blank" href="https://www.capa.co.jp/archives/25610">ソフトウェアテスト設計の基礎知識（株式会社キャパ）</a></li>



<li><a rel="noopener" target="_blank" href="https://testomat.io/blog/a-guide-to-the-basics-of-python-testing-how-to-write-unit-tests-and-organize-execution-test-cases/">A Guide to the Basics of Python Testing（Testomat）</a></li>
</ul>



<p>本記事の内容は、上記の資料や実務での一般的なベストプラクティスをもとに整理しています。 テスト設計についてさらに深掘りしたい場合は、ぜひあわせて参照してみてください。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc36">よくある質問（Q&amp;A）</span></h2>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">すべての関数にテストを書くべきですか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>いいえ、必ずしもそうではありません。<br>大切なのは<strong>「壊れたら困るかどうか」</strong>です。</p>



<p>ビジネスロジックの中核や、条件分岐が多い処理、 過去にバグを出した箇所などは優先的にテストすべきです。 一方で、単なるデータ変換やフレームワーク任せの部分まで 完璧にテストしようとすると、保守コストの方が大きくなります。</p>



<p>「このテストが失敗したら、何が一番困るか？」<br>これを基準に判断すると、迷いにくくなります。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">pytestだけ覚えればunittestは不要ですか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>pytestだけでも実務は十分に回せますが、 unittestの<strong>基本構造を理解しておく価値</strong>はあります。</p>



<p>unittestはクラス構造やライフサイクルが明示的なため、<br>「テストはどういう部品で成り立っているのか」<br>を理解するのに向いています。</p>



<p>そのうえでpytestを使うと、 <strong>「なぜpytestが書きやすいのか」</strong>が腑に落ちやすくなります。 両方を知っておくと、チームや既存コードへの対応力も上がります。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">個人開発や小規模なスクリプトでもテストは必要ですか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>規模が小さくても、 <strong>「あとで触る可能性があるコード」</strong>ならテストは役に立ちます。</p>



<p>個人開発では、<br>「しばらく触っていなかったコードを修正する」<br>という場面がよくあります。</p>



<p>そのときにテストがあると、 <strong>思い出し作業のコスト</strong>と<strong>修正の不安</strong>を大きく減らせます。</p>



<p>最初は1つ2つの重要な処理だけで構いません。<br>テストは「完璧にやるもの」ではなく、 <strong>未来の自分を助けるためのメモ</strong>くらいの感覚で十分です。</p>
</div></dd></dl></div>
]]></content:encoded>
					
					<wfw:commentRss>https://python.cbagames.jp/2025/12/23/python-test-design-what-to-test/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
