初心者こそすぐにテストを実行せよ!Python+Unittest その1

reviewing

プログラミング言語の学習をはじめた初心者とベテランプログラマーの違いってわかりますか?

結論から言うと、自分の書いたコードが常に検証できるようなテスト環境を整えているかどうかです。

少しイメージしてみてください。

あなたが数週間かけて書いたコードが5000行ぐらいあって、急遽仕様変更により数カ所のコードを変更しないといけません。

その時、あなたはきっと下記のような不安を持ってしまうかもしれません。

  • 数行の変更がすべてのコードに影響して、システムが完全に動かなくなるかもしれない。
  • ある条件になると正しい計算ができなくなるかもしれない。

もし過去の自分が、想定する使われ方(ユースケース)をテストとして残してくれてたらどうでしょうか?

答えは想像つくと思います。

「 過去に書いたあなたのテストコードがバグの発生を教えてくれます。」

そんなテストコードがあったら、あなたは自信を持ってコードを書き続けることに集中できませんか?

この記事では、そんなあなたの将来を支える、ほんの小さなテストコードの書き方について書いていきたいと思います。もしよかったら読んでみてください。

対象者

  • Pythonプログラミング学習をはじめた方
  • hello worldをプログラムで表示できる方
  • 勉強するなら、ほんの少しレベルの高いことを学びたい
  • 少しでもはやく、中級者の道へ進みたい方

テストコードは、Unittestにお任せあれ!!

それでは、テストコードの書き方を見ていきましょう。

プログラミング言語は何でもいいですが、ここでは、初心者も習得しやすいPythonを使って説明していきます。

テストコードは、Unittestという先人が作ってくれたプログラムを使って書いていきます。

Unittestの仕組みやどんな機能があるのかはプログラミング言語を一通りマスターすれば、自然と理解できるようになります。(この記事では割愛します。)

今はわからなくても問題ありません。まずは、下記の手順に従ってテストコードを書いて見てください。

ステップ:1 4 + 5 のプログラムを作って見ましょう!

それでは、あなたの好きなフォルダの中に、“sample.py”を作ってみてください。作り終わりましたら、下記コードをコピーして”Sample.py”に貼り付けてください。

#サンプルプログラム : Sample.py
# 4 + 5 = ?
# Unit testを使うことを宣言しまーす! 
# スポーツマンシップに則り、正々堂々戦う事を誓います! 高校野球じゃないよ ( ^∀^)
# 宣言するには、キーワードのimportを使います。
import unittest
class MyTest(unittest.TestCase):
    def test_XXX(self):
if __name__ == "__main__":
    unittest.main()

これが、テンプレートです。

この状態だと何もテストコードが書かれていないので、文法エラーが出ます。

def test_XXX(self)のXXXのところにテストしたいコトを日本語で書いて、その下にテストコードを書いていきます。

今回の場合では、こんな感じで書いてみてください。
もちろん、下記のコードをコピーして自分のコードに貼り付けてもいいです。

XXX –> 4たす5は
期待値は10

import unittest
class MyTest(unittest.TestCase):
    def test_4たす5は(self):
        期待値は = 10
        self.assertEqual(期待値は, 4 + 5)
if __name__ == "__main__":
    unittest.main()

それでは、コードを実行してみましょう!
私の環境では、下記のような結果が出ました。
あれ?FAIL(エラー)しているようです。

(base) Tommy$ python3 sample.py  <-- Macでの実行例
F
==============================================================
FAIL: test_4たす5は (__main__.MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "sample.py", line 12, in test_4たす5は
    self.assertEqual(期待値は, 4 + 5)
AssertionError: 10 != 9
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)

それでは解説をします。私の環境では、下記のようにターミナルに打ち込んでpythonを実行してみました。

python3 sample.py

テストを0.000秒で一回テストをくれたようです。

(Runの過去形Ranになってますね。やったでぇー。)

結果、ひとつテストを失敗しているようです。

----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)

これが最重要のポイントです!

もう一度言います。 これが最重要のポイントです!

テストコードを書いたら、一番はじめにエラーが出る事を確認してください。

なぜかと言うと、あなたのミスでテストが正常に行われていないと、あなたの修正したプログラムが間違っているかどうか区別することができないからです。

はじめにテストコードを意図的にエラーを出力させることにより、テストコードの妥当性を判断します。

これが確認できれば、将来あなたが誤ったコードを書いてしまっても、Pythonがエラーを教えてくれます。

話をもとに戻して、このエラーを消していきましょう。
どこが間違っているかわかりますか?

テスト内容は、「4たす5は」で、期待値は10でした。

def test_4たす5は(self):
        期待値は = 10

評価式は、 「 4 + 5 」です。
self.assertEqualは、「 期待値は 」と 「 4+5 」が等しい時にOKを出力し、違う時にFAILエラーを出してくれる構文です。

self.assertEqual(期待値は, 4 + 5)

構文1 AとBが等しいかどうかを確認する

  • self.assertEqual( A, B)
    AとBが同じであれば、Trueを出力。違う場合は、Falseを出力

話を進めます。テストコードを直すとしたら、私は評価式「 4 + 6 」にすべきですね。

import unittest
class MyTest(unittest.TestCase):
    def test_4たす6は(self):
        期待値は = 10
        self.assertEqual(期待値は, 4 + 6)
if __name__ == "__main__":
    unittest.main()

それでは、再度プログラムを実行してみましょう。

(base) Tommy$ python3 sample.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK

結果はいかがでしょうか?先程のようにエラーの文字がなくなり、プログラム結果の最後の行にOKが出力されました。

これが、Unittestを使ったプログラミング方法です

テストコードを仕上げて、テスト結果がOKになるまで、プログラムを修正していきます。

さらに、下記のようにプログラムを実行してみてください。
(先ほどのプログラムに -vを追加しただけです。)

(base) Tommy$ python3 sample.py -v

いかがでしょうか? -vを付けなかった実行結果と付けた実行結果を比べてどちらが見やすいですか?

もし-vを付けた方が見やすければ、次回以降も付けて実行してみてください。

(base) Tommy$ python3 sample.py -v
test_4たす5は (__main__.MyTest) ... ok
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK

宿題

5+6のテストコードを作成してみてください。プログラム実行時は、-vを付けて、2回実行してみてください。(1回目は、FAIL(エラー)をだすこと!)

Pythonマスターへの近道

初学者が短期間で効率よくプログラミング力を上げるのはかなり難しいこと。

私も買い切りの教材を買って勉強したんですが、つまずく回数が増えてモチベーションが下がって積み教材になったことがあります。

そんなことになる前に、なんでも回答してくれるようなメンターがいたり、お互いに頑張れる仲間がいると想像以上に効率よくプログラミング習得ができます。

もしあなたがITエンジニアを目指すなら

もしあなたがITエンジニアを目指すなら、一度プログラミングスクールを調べてみることをオススメします。

月額制で、就職活動までバックアップしてくれるプログラミングスクールもあるので、情報収集をしてみてください。
説明会(オンラインor来校)はもちろん無料なので色々な情報を集めてみると目標までの最適解が見つかります。

実務レベルのカリキュラム(未経験でも最短3カ月で実務レベルが目指せるカリキュラム)を体験してみよう

python特化型オンラインスクールの無料説明会

まとめ

この記事では、テストコードの必要性について学び、実際にテストコードを書いてみました。テストコードを事前に用意しておけば、プログラマが意図しないバグを作ってしまっても、テストコードがエラーを出力してくれます。

テストコードの作成で一番重要なことは、実行結果が必ずエラーになるコードを一番初めに確認すること。是非この記事を参考に、テストコードを書く習慣をつけることをおすすめします。あなたの不安はかなり減るはずです。

関連記事

関連記事
●初心者こそすぐにテストを実行せよ!Python+Unittest その2
●仕事の効率が劇的に改善する!UdemyのおすすめPython講座【感想あり】