【Python9】pythonコードのテストについて

👇それでは下記の記事の続きをやっていこう!
前回までは、csv, jsonファイルなどの “File I/Oについて(ファイル入出力)” 学習してきました。

今回は、pythonコードのテストについて学習していきましょう!
コードがある一定の品質を保っているのかを確認する大事な作業になりますので、テストエンジニアではなくても一緒に学習していこう🤓

Pythonのテストについて

✅ 実装したコードは必ずテストを行うこと
✅ 機能を開発するだけでなく、”品質”を保ちながら開発することが求められる
✅ テストの種類
 ・コードを実行してテスト
 ・自動で実行するテスト
 ・他のモジュールや機能との繋ぎ込みのテスト
 ・ユーザー側での動作テスト etc…
✅ 単体テスト(UnitTest)と結合テスト(IntegrationTest)
 ・コンポーネント単位、コンポーネント間のテスト

assert

✅ assert の後ろにTrueとなるか判断したい値を書く
✅ テストコードは通常、テストスクリプトにひとまとめに書く

assert の用法

assert <Trueとなるような値>, “<エラー(False)時のコメント>” : Falseであればエラー出力

👇簡単なassertを使った例になります。

👇テストスクリプトを作成してテストしてみる

上記のテストスクリプトは問題があります、気づきましたでしょうか?
実はtest_power()でエラーが発生すると、test_times()の関数は実行されません
本当は2つの関数のテストを行いたいのに、両方テストできないって問題ですよね?
このように単純にスクリプトでテストを実施するのは限界があります。

そこでテストランナーのライブラリを使用してテストを実施していきます。
その詳細を下記に記載しますね。

Test runner

✅ コードをテストする際に、途中エラーで止まってしまう箇所があってもプログラムが最後まで実行され、エラー内容を出力してくれるツール
✅ テスト結果をチェックしてくれたり、デバッグしやすいように結果を表示してくれる
テストスクリプトは一つのフォルダにまとめて格納しておく
unittest : Pythonの標準ライブラリ
pytest : 有名で非常に多くのPJTで利用されるテストフレームワーク

unittestの実行
[~] $ python -m unittest <テストスクリプト(.py)> : <テストスクリプト>を実行

👇unittestを使ってテストを実行する

例外ケースのテスト

✅ 誤ったデータを入れたらきちんとエラーを返すかテストする
✅ 考えられる例外は無数にあるため、ある程度絞ってテストを実施する
✅withステートメントを使ってテストをする

unittestのassertメソッド一覧

  • assertEqual(a, b) : a == b
  • assertNotEqual(a, b) : a != b
  • assertTrue(x) : bool(x) is True
  • assertFalse(x) : bool(x) is False
  • assertIs(a, b) : a is b
  • assertIsNot(a, b) : a is not b
  • assertIsNone(x) : x is None
  • assertIsNotNone(x) : x is not None
  • assertIn(a, b) : a in b
  • assertNotIn(a, b) : a not in b
  • assertIsInstance(a, b) : isinstance(a, b)
  • assertNotIsInstance(a, b) : not isinstance(a, b)

pytest

✅ pythonのテストフレームワークで、多くのプロジェクトが採用
✅ python標準のassertを使って簡潔に書ける
✅ 標準ライブラリではないので、$ pip install pytestでインストールする

pytestの実行
[~] $ pytest <テストスクリプト(.py)> : <テストスクリプト>を実行

👇pytestを使ってテストを実行する

テストカバレッジ

✅pytestにはカバレッジ(テストスクリプトでチェックできている割合)をレポートしてくれる
✅pytestのカバレッジを確認するにはpytest-covというパッケージをインストールする必要あり($ pip install pytest-cov)
✅カバーできている割合をパーセントで表すのが一般的
✅TDD(テストドリブンディべロップメント): テストコードに問題ないか確認しながら開発を進めていくこと

pytest-covの実行
pytest-covの実行

[~] $ pytest <テストスクリプト(.py)> –cov=<対象のスクリプト>
                 : <対象のスクリプト>のテストカバレッジを表示
[~] $ pytest <テストスクリプト(.py)> –cov=<対象のスクリプト> –cov-report term-missing
       
: <対象のスクリプト>の実行されていない行を表示

devide関数を作りif文で結果が異なるコードがあると想定して確認してみる。
テストスクリプトでは割り切れる値が返り値になるテストを実施できているが、0を割る条件でのテストは実行できていないため、88%であり11行目にMissingが出ている。

テストスクリプトにif文の0を割る関数も確認するためにtest_devide_by_zero()関数を作成し、pytestを実行するとCoverは100%となる。

pytest-covの結果をcsvファイルで保存

上記のようなテストカバレッジの結果をhtml, xml, csvファイルとして出力することもできます。

pytest-covの結果xmlファイルで保存

$ pytest <テストスクリプト(.py)> –cov=<対象のスクリプト> –cov-report xml
        : カバレッジ情報が載ったxmlファイルを作成し
保存する
$ pytest <テストスクリプト(.py)> –cov=<対象のスクリプト> –cov-report xml –cov-append
        : カバレッジ情報が載ったxmlファイルを作成し保存する
(上書きではなく追加)

“pythonコードのテストについて”は以上になります、いかがだったでしょうか?_
テストコードををしっかり作って、開発を進めていくことの重要性を学ぶことができたんじゃないでしょうか👌

覚えることも案外多く大変だなと感じることが多いとは思いますが、現場で使いながら覚えていくのが一番いいんじゃないかなと思います◎

今回はこの辺で、バイバイ👋