ChatGPTでpytestを試してみた(2025/1/21)

<h2>はじめに</h2>
<p>プログラミングの効率を上げるためのアプローチとして注目されている<strong>テスト駆動開発（TDD）</strong>。今回はその実践ガイドである「テスト駆動Python」を<strong>AIツール</strong>と一緒に読み進めてみました。</p>
<p>今回活用したAIツールは、<strong>ChatGPT</strong>です。それぞれの特徴を活かしながら学習を進める中で、どのように役立ったのか、またどのような誤解や限界があったのかを解説します。</p>

<p>この記事では、特に以下のポイントについて解説します：</p>
<ul>
  <li>AIツールを活用して本を読むメリット</li>
  <li>AIが示した情報の正確性や信頼性についての考察</li>
</ul>

---

<h2 id="参考にした本">参考にした本</h2>
<p>今回参照した「<strong>テスト駆動Python</strong>」は、Pythonを用いたTDD（Test Driven Development）の実践を丁寧に解説した書籍です。</p>
<p>この本は初心者から上級者まで幅広い層を対象にしており、以下のトピックが詳しくカバーされています：</p>
<ul>
  <li>TDDの基本概念</li>
  <li>pytestを使用したテストコードの記述方法</li>
</ul>
<p>📚 <strong>書籍情報</strong>:</p>
<a href="https://amzn.asia/d/8T5yYwl">テスト駆動Python</a><br>
<img src="https://m.media-amazon.com/images/I/81kd-IFoEfL._SY385_.jpg" alt="テスト駆動Pythonの写真" />
<h2>開発環境</h2>
<p>開発環境は以下の通りです：</p>
<ul>
  <li>pytest 8.3.4</li>
  <li>ChatGPT-4</li>
</ul>

---

<h2 id="ChatGPTと一緒に読んだ場合">ChatGPTと一緒に読んだ場合</h2>
<h3>ChatGPTの活用法</h3>
<p>ChatGPTは、質問に対して即座にテキストベースの回答を返すAIツールです。本を読む際に疑問点が生じた場合、ChatGPTに質問して即時に解説を得ることができます。「辞書代わり」として活用するのに非常に便利です。</p>

<p><strong>具体例:</strong></p>
<blockquote>
  <p><strong>質問:</strong> 書籍に出てくる「モックオブジェクト」とは何ですか？</p>
  <p><strong>ChatGPTの回答:</strong> モックオブジェクトとは、テストのために外部依存を模倣するオブジェクトです。例えば、APIやデータベースの代わりに使用し、テスト対象部分の動作を確認する際に役立ちます。</p>
</blockquote>

<h3>ChatGPT(GPT-4o)の課題</h3>
<p>一方で、ChatGPTの回答には注意が必要です。回答が必ずしも正確とは限らず、書籍や公式ドキュメントと矛盾する解釈が含まれる場合があります。</p>
<p>例えば、pytestの出力に関する質問では、回答が一部正確でなかったため、信頼性の問題が浮き彫りになりました。</p>

---

<h3 id="間違えていた点">間違えていた点</h3>
<p>以下の質問をChatGPTに投げかけました：</p>
<blockquote>
  <p><strong>質問:</strong> pytestの出力結果でs.やxxX.について</p>
</blockquote>

<p>ChatGPTの回答は以下の通りでした：</p>
<blockquote>
  <p>pytest の出力結果で表示される記号（例: s, ., x, X）は、各テストケースの結果を示しています。以下は、それぞれの記号の意味と詳細です。</p>
  <table>
    <thead>
      <tr>
        <th>記号</th>
        <th>状態</th>
        <th>説明</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>.</td>
        <td>成功（Pass）</td>
        <td>テストが正常に実行され、すべてのアサーションが通過しました。</td>
      </tr>
      <tr>
        <td>s</td>
        <td>スキップ（Skipped）</td>
        <td>特定の条件でテストをスキップした場合に表示されます（例: @pytest.mark.skip を使用した場合）。</td>
      </tr>
      <tr>
        <td>x</td>
        <td>失敗（Failed）</td>
        <td>テストが失敗し、アサーションが通過しなかった場合に表示されます。</td>
      </tr>
      <tr>
        <td>X</td>
        <td>エラー（Error）</td>
        <td>テスト中に例外が発生した場合（例: 実行中に例外がスローされた場合）に表示されます。</td>
      </tr>
    </tbody>
  </table>
</blockquote>

<p>しかし、この回答には誤りがありました。</p>
<ul>
  <li><code>x</code>: 失敗することが期待されるテストケースに対応。</li>
  <li><code>X</code>: 失敗が期待されていたが成功してしまったテストケースに対応。</li>
</ul>

---

<h3>具体的なコード例</h3>
<p>以下は、pytestの出力で<code>x</code> と <code>X</code> を確認できる具体例です：</p>

```python
import pytest

@pytest.mark.xfail
def test_expected_fail():
    assert 1 == 2  # 失敗することが期待される

@pytest.mark.xfail
def test_unexpected_success():
    assert 1 == 1  # 成功してしまう
"""
このコードをpytestすると、次の出力が得られます：
$pytest
$xX
"

```


<h2>感想</h2>
<p>現時点（2025年1月21日）では、ChatGPTがPythonの一部モジュールに関する解説で不正確な情報を提供する場合があると感じました。</p>
<p>そのため、AIツールを活用して学習を進める際には、書籍や公式ドキュメントなど、信頼性の高い情報源を併用することが重要だと考えます。</p>
<p>一方で、なぜChatGPTがこのような誤りを生じるのか、その原因を探ることも大切だと感じました。例えば：</p>
<ul>
  <li>ChatGPTの学習データに関連ドキュメントの情報が不足しているのか？</li>
  <li>モデルが学習データを誤って学習しているのか？</li>
</ul>
<p>これらの理由を明らかにすることで、AIツールをより効果的に活用できるのではないかと考えています。もし、この点について詳しい方がいらっしゃれば、ぜひ教えていただけると嬉しいです。</p>