プログラミング言語を整える
初級unittest を整える。
= 標準ライブラリだけでテストを書いて実行する練習場
unittest が初めての方は、先に そもそも unittest とは・どんな場面で使うか をどうぞ。
4つの課題(クリックで2つのタブに読み込み)
サンプルを選ぶか自分でコードを書いて「▶ unittest 実行」を押すと、ここに結果が出ます。
そもそも unittest とは
書いたコードが正しいかを、コードで自動確認する仕組み。
unittest は、Python に最初から入っているテスト用のモジュールです。「この関数にこの値を渡したら、この答えが返るはず」という約束をコードで書き、実行するたびに自動で確かめてくれます。追加のインストールが要らないのが利点です。
テストは TestCase を受け継いだクラスの中に、test から始まる名前のメソッドとして書きます。この考え方は JUnit など他の言語のテスト道具に通じるもので、一度覚えると他の言語でも応用できます。
どこで・どんな場面で使うか
-
関数を直したあとに確認するとき
直したつもりで別の場所を壊していないか、ボタン一つで一通り確かめられます。
-
チームで作るシステム
誰かがコードを変えても、約束が守られているかを機械が見てくれます。
-
自動チェックに組み込むとき
コードを共有するたびに自動でテストを走らせる仕組みの中で使われます。
-
仕様を先に書いて作るとき
先に「こう動くべき」をテストにしておき、それを満たすようにコードを書く進め方に使います。
-
求人・仕事での位置づけ
Python の開発では、テストを書ける人として評価される場面があります。
なぜ覚えておくと得か
- 安心してコードを直せる。変更の影響をすぐ確認できるので、改良や整理に踏み出しやすくなります。
- 仕様がコードとして残る。「どう動くべきか」がテストに書かれるため、あとから読む人の助けになります。
- 他のテスト道具にもつながる。基本の考え方は共通なので、pytest など別の道具へ進むときも楽になります。
上の練習場で課題を選んで実行し、テストが成功する場合と失敗する場合の表示の違いを確かめてみてください。
4つの課題で unittest の骨格をつかむ。
- 1
assertEqual の基本
self.assertEqual(実際の値, 期待する値)が一致すればテストは通る(緑)。「③ test_add_wrong」はわざと期待値を間違えているので、実際の値との差分が表示されます。 - 2
setUp と複数テスト
setUp(self)は各テストメソッドの直前に毎回呼ばれます。ここで用意した材料(self.counterなど)は、前のテストの影響を受けません。 - 3
例外のテスト(assertRaises)
with self.assertRaises(例外の型):のブロック内で例外が起きればテストは成功、起きなければ失敗になります。 - 4
サブテストとスキップ(subTest・skip)
with self.subTest(...)で複数パターンを1つのテストにまとめられます(途中で1つ落ちても残りは実行される)。@unittest.skip("理由")は、そのテストを一時的に外します。
unittest と pytest の違い
どちらも Python のテストの仕組みですが、立ち位置が違います。
| 観点 | unittest | pytest |
|---|---|---|
| 由来 | Python 標準ライブラリ(インストール不要) | サードパーティ製(pip install pytest が必要) |
| テストの書き方 | unittest.TestCase を継承したクラスのメソッド | クラス不要。test_ で始まる関数だけでよい |
| 検査の書き方 | 専用メソッド(assertEqual・assertRaises など) | 素の assert 文がそのまま使える |
| 同条件で繰り返す | subTest(1メソッドの中でループ) | @pytest.mark.parametrize(テストごとに分かれて表示) |
pytest 版の同じような練習は /pytest/ の Playground で試せます。書き方の違いを見比べてみてください。
テストの命名規則
unittest がテストを自動で見つけられるのは、決まった名前の付け方に従っているからです。
- テストクラス —
unittest.TestCaseを継承したクラス。クラス名自体に決まりはありませんが、慣習としてTestで始めることが多いです。 - テストメソッド — 名前が
testで始まるメソッドだけが、テストとして自動的に実行されます。test_を付け忘れると、そのメソッドは静かに無視されます(エラーにもならないので気づきにくい点です)。 - setUp / tearDown — 決まった名前の特殊メソッドで、それぞれ各テストの前・後に自動で呼ばれます。呼び出す側のコードを書く必要はありません。
- テストファイル — このページでは
test_calc.pyという名前で固定していますが、実際のプロジェクトでもtest_*.pyという命名が、テスト自動収集ツールとの相性がよい慣習です。
このページについて
実行のたびに unittest.TextTestRunner(verbosity=2) の出力を解析し、テストごとの合否一覧と、落ちたテストの抜粋(アサーションの差分・例外の最終行)を分けて表示します。
💡 初回は Pyodide(Python WASM)の読み込みに 5〜15 秒かかります。2 回目以降はキャッシュから瞬時にロード。 書いたコードと実行結果は、どこにも送信されません(すべてブラウザ内で実行)。
🌐 「▶ unittest 実行」を押した最初の1回だけ、Python の実行環境(Pyodide 0.28.0)を配信元の
cdn.jsdelivr.net から取得します。
これはプログラムを受け取るだけの通信で、あなたが書いたコードや実行結果が送られることはありません。
ただし通信である以上、配信元にはお使いの回線の IP アドレスが見えます。
「入力は端末から出さない」という当サイトの原則に関わる点なので、隠さずに書いておきます。
このツールについて
unittest は Python に標準で入っているテストの仕組みです。インストールなしで、実装コードとテストコードを書いて実行し、どのテストが通って(緑)どれが落ちたか(赤)をその場で確かめられます。
標準ライブラリ unittest だけでテストを書いて実行できる練習場。落ちるテストを直して通す往復を体験。subTest・skip まで。pytest との違いも解説。
主な機能
- calc.py と test_calc.py の2タブ
- 4課題(assertEqual/setUp/assertRaises/subTest とスキップ)
- テストごとの合否一覧と失敗の抜粋
- unittest と pytest の違いの解説表・/pytest/ と相互リンク
- 標準ライブラリのみ・送信ゼロ
よくある質問
Q. unittest と pytest はどちらを覚えればいいですか?
A. どちらも Python の標準的な選択肢です。unittest は標準ライブラリでインストール不要、pytest は素の assert 文が使えるぶん書き方が簡潔です。同じ題材で比べられる /pytest/ のページも用意しています。
Q. テストメソッドの名前に決まりはありますか?
A. あります。名前が test で始まるメソッドだけが自動的に実行されます。付け忘れるとエラーにならず静かに無視されるので注意が必要です。
Q. subTest を使うと何が変わりますか?
A. 1つのテストメソッドの中で複数のパターンを検査でき、途中の1パターンが失敗しても残りはそのまま実行されます。subTest を使わないループでは最初の失敗で止まります。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。
続けて整える
この内容は、研修でも扱っています
totonoe.tech を運営する株式会社Koinobori は、法人向けの研修サービス「NOBORIBA®」も運営しています。 ここで手を動かした内容を、講師から教わる形の研修です。このページの道具は無料のまま、登録もいりません。