ユニットテスト練習録#1

先週からユニットテストを学びはじめました。
テストを学ぶこと自体がはじめてなのと、テストで使うpytestの使い方に四苦八苦しながら、なんとかテストを開始できました。
前回ではpytestの本を紹介しましたが、一通りやってみるとこの本はテスト初心者向けではなくテストをしたことのある人むけで、pytestというソフトウェアの使い方を紹介している本だということがわかりました。
読んでからそのことが判明。全体像がわからないってコワいですね。

それで参考にしたのは

コレ。

もっといい本はあるとは思うんですが(ちょっと古いので)、ちょうど手元にあったので参考にしました。
バージョン管理+ユニットテスト+自動化という、よくわからない周辺技術がまとまっていていいなと思って買っていたのです。

サンプルコードはjavaやC++なのでコードは細かくはわかりませんが(汗)、要するにテストがどういうものなのか、ということは理解できましたし、テストの結果可能に自動化の項目は胸アツで、全体的像がなんとなくつかめた気がします。
テストがすべて通っている間は緑のラバランプを点灯させ、エラーが出ると赤くして全員に伝えるようにするというのはカッコ良すぎる…。

結局ユニットテストとは

で、結局ユニットテストとはどのようなものかと私が理解したかというと、引数を変えて実行して、返し値を比較したり検証したりするもの、ということです。※正しいかわかりません。

このためには、テストメソッド内で関数を実行できる必要があり、引数を与えたり返り値を与えると検証が楽です。

def plus(a, b):
    sum = a + b
    return sum

をテストするとしたら、

def test_plus():
    a = 10
    b = 20
    test_sum = plus(a, b)
    assert test_sum == 30

となります。
与える値を独立してすぐ変えられるし、結果も簡単に取得しています。
ポイントは、こういう風になるように元のコードを書く、ということだと思います。
私の場合、メソッドをreturnせずにインスタンス変数に直接書き込んだり、引数を取らずにこれまたインスタンス変数で値を取らせていて、それをテストしようとしてサンプルコードとの違い、解説のアッサリ具合にえ、この場合は??となっていたんですが、元のコード自体をテストしやすいように書けば、複雑なことはしないんですね。
複雑になりそうなら、コードの方が何か間違っているということです。たぶん。

さらなる境界

また、テストをするにあたってはさらに自分の境界にぶち当たることになりました。
パッケージ、インポート関係です。
パッケージなんて作ったこともありませんし、パッケージ化が必要となる複数のファイルに渡るプログラムを書いたことがありませんので、ここらへんの知識がよくわかっていませんでした。
しかしテストは、パッケージの知識を要求してきます。

本にはテストとソースのディレクトリを分けろとあり、確かにわけわからなくなりそうだし、これからもコードが増えることを考えると同じディレクトリに入れることはいかにも後から面倒なことになるだろうと思い、pytestのサンプル通りのディレクトリ構成にしました。

しかし、ディレクトリを分けるということは、テストのときに使うメソッドを離れたところからインポートしなければならないということで、よくわからないながらもpytestの手順を見比べながらやりました。

概要…
1番上にsetup.pyをおいて、名前とか、ソースのディレクトリなど必要な情報を入力します。
そしてソースコードやテストが入っているディレクトリに中身が空のinitをおきます。
で、パッケージのルートディレクトリ(setup.pyがある)で、pip install -e . をすると登録され、importできるようになりました。

意味がところどころわからなくて辛いですが、そのうちわかるようになるんですかね…。

定数をファイルに分離する

ユニットテストでは、独立したクラスでテストします。メソッドごとに依存もできるだけなくします。

これに基づいてクラスを分離していてぶち当たったのは、クラス共通で使っている定数がテストで読み込めないことでした。
1番上のクラス外に書いていますから(そもそもここが間違っている?)、インスタンス化しても読み込めない。ファイルを実行したときのみ実行できます。

なので定数を別のファイルに書いてインポートするようにしました。
テストファイルからもその定数をインポートすることで、問題なく使えるようになりました。
しかし元のファイルから呼び出せません。色々調べましたが、そのとおりにやってもムリでした。
応急処置で元のファイルの定数宣言はそのままです。

基礎的な知識が欠落しています。ドキュメントをまた読み直そうと思います。


次の記事

貴島 大悟
WEB開発者