この記事ではPythonのunittestについて解説をしたいと思います。unittestではPythonで書いたコードやプログラムのテストをすることが出来ます。
テストケースを作ってテストをしたい
今回の記事ではこのように思っている方に向けて、
- 【基礎】unittestとは
- 【基礎】テストとは
- 【実践】unittestの使い方
などの基本的な部分について解説をしていきます。Pythonのunittestについて理解を深めていきましょう!
なお、Pythonの記事については、こちらにまとめています。
unittestとは
まずはunittestとは何かについて知っておきましょう。unittestはPythonの標準パッケージとして組み込まれた、コードやプログラムのテストを行うためのパッケージです。
基本的にはimportをしたあと、unittest.TestCaseを継承したテストケースを作ってテストを行います。Pythonにはassert文を使うテストの方法もありますが、違いとしてはテストケースを作ってテストを実行するという点が挙げられます。
テストケースとはテストする条件と方法をまとめたものです。assert文でテストをする場合は、そのテストが行われる場所すべてにassert文を書く必要があります。
これに対してunittestでは、どこで、どのようなテストをするのかまとめて書いておくことができるので、規模の大きいコードやプログラムにも対応出来ます。assert文についてはこちらの記事をご覧ください。
また、プログラムやコードのテストとは何かについても知っておきましょう。テスト(ソフトウェアテスト)とは、コードが意図しない動きをしないかどうかを調べるための作業のことです。デバッグという言葉は聞き馴染みがあるのではないでしょうか。
そのデバッグを行うために、このテストを行って意図しない動きを洗い出す作業が必要になります。
unittestの使い方
それでは早速unittestを使ってみましょう。これからは章ごとに順番に解説をしていきます。
テストをするコードを作る
まずはテストをする対象のコードを書きましょう。今回は、テキストを入力してそれが数字であれば入力した数字をそのまま返し、数字以外であれば数字を入力するようなメッセージを返すコードを書きます。
numprint.py
def numTest(x): if x.isdigit(): return x else: return "Not a number!"
数字を入力した場合
Please input number: 10 Input number is: 10
数字以外を入力した場合
Please input number: aaa Not a number!
今回はこのコードを使って、数字を入力したときと数字以外を入力したときで期待した表示がされるかを確認しましょう。
書いたコードをimportする
unittestではテストをする対象のコードをモジュール化してテストをします。先程のnumprint.pyをTestnumprint.pyにimportしましょう。また一緒にunittestパッケージもimportしておきましょう。
Testnumprint.py
import unittest from numprint import numTest
importについての詳しい解説はこちらの記事をご覧ください。
unittestを使ってテストコードを書く
ここからは実際にunittestを使ってテストを実行してみましょう。先程のTestnumprint.pyをこのように変更しましょう。
Testnumprint.py
import unittest from numprint import numTest class Testnumprint(unittest.TestCase): def test_numprint(self): val = "10" expect = "10" actual = numTest(numVal) self.assertEqual(expect, actual) if __name__ == "__main__": unittest.main()
一行ずつ説明していきましょう。まずはunittest.TestCaseを継承したクラスを作りましょう。クラスについてはこちらの記事をご覧ください。
次にtest_numprintというテストを実行するためのメソッドを作ります。そこで実際にテストをする値を用意します。ここではvalが実際に入力をする値、expectが入力をした場合に返ってくることが想定されている値になります。次にnumTestという実際にテストを行うための関数を実行して、その戻り値をactualに入れています。
そのactual(実際に実行したときの値)とexpect(実行をする前に期待されている値)が等しいかどうかを、self.assertEqualメソッドで2つの値を比較します。ちなみに最後のif〜のブロックは、テストを簡単にするためのコードだと思ってもらって構いません。詳しくはこちらの記事をご覧ください。
実際に実行してみましょう。
. ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
このようになれば期待した値と実際に実行した値が一緒(= テスト成功)だということがわかりますね。valに「”aaa”」という文字列を入れて、expectに「”Not a number!”」を入れて実行してみても、テストは成功します。
まとめ
この記事ではunittestでコードやプログラムのテストをする方法について解説をしました。assert文との違いやテストとは何かについて、unittestの使い方については分かっていただけたでしょうか?
assert文とunittestのどちらが優れているというわけでもなく、使い所を見極めて使っていきましょう。unittestの使い方を忘れてしまったときは、ぜひまたこの記事をご覧ください!