python

単体テストを書く理由とPythonの単体テストのフレームワークまとめ

Pythonに関わらず、プログラムを書いてる人なら必ず向き合わないといけないのが単体テストです。

単体テストが重要なのはわかるけど、後回しになってしまいがちです。

ただ、ちゃんとした現場や大企業などでは、単体テストが必須になっています。

納品の基準をクリアするために、テスト結果のエビデスンスが必要になるためです。

また、エビデンスという観点だけではなく、TDD(テスト駆動開発)と呼ばれる手法が流行っている通り、

プログラムの品質とスピードを担保する上でも重要とされています。

Python 単体テストに関する疑問

  • 単体テストの何から手をつけていいのかわからない
  • テストを書くメリットがわからない

Pythonで単体テストを書く方法を身につけていきましょう!

単体テストを書く理由を知る

単体テストを書くメリットについて単体テストにまつわる誤解を元に紹介していきます。

誤解①:単体テストを書く時間が増えるので、工数が増加する

単体テストを書くと一見、時間が増えそうです。

確かに、実装だけで済んだところに単体テストが加えわるため、ソースコードを書く量が増えます

しかし、単体テストを書くと工数が増加するわけではありません。

なぜなら、単体テストは設計の確からしさを検証する作業になるからです。

設計に沿ったソースコードは品質が高く、バグの発生が抑えられます

システムリリース後のバグ発生のコストを考えると圧倒的に単体テストを書く方が低コストで済みます。

誤解②:単体テストのソースコードは実装に関係ない

単体テストは、実装と別物と考えられることが多いが表裏一体!

むしろ、単体テストに合わせソースコードを書き直すこともあります。

単体テスト≒設計なので、単体テストに合わせてソースコードを書くことは設計に沿ったソースコードを書くに等しい。

また、単体テストを効率的に書こうとするとソースコードが綺麗に整理されるため、リファクタリングにもなります。

Python単体テストのフレームワーク比較

Pythonの単体テストのフレームワークで有名どころは3つくらいしかありません。

unittest

Python標準の単体テストフレームワーク。
公式サイト

標準でインストールされているため、とりあえず使っている人もいるではないでしょうか。
Pythonにおける単体テストの基本になるので一度は使ってみてもいいと思います。
unittestを使ってカバレッジを取得する方法

pytest

Pythonの中でももっともに人気の高い単体テストフレームワークです。
公式サイト
pytestの導入手順と使い方


unittestよりシンプルにプログラムチックに書けるため、選択する人が多いのだと思います。

nose2

nose2は、unittestとpytestの両方に対応したテストフレームワークです。
DSL記法に対応しているため、RubyのRspecやJavascriptのJasmineなどの単体テストフレームワークを使っている方にとっては馴染みやすいです。
簡単にカバレッジ(テストの網羅率)を取得できるのもポイントです。
nose2をDSL記法で書いて見た

nose2は、unittestやpytestと比べて設定周りがやや複雑なので、まずはunittestかpytestを試してからにしましょう!

まとめ

単体テストは、長期的な目線に立つと導入しておくメリットが非常に大きいです。
特に慣れてくると、テストを書かない方が怖くなってきます。
「テスト書かないと怖いよね」と言えるエンジニアが増えるといいなと思います。
ABOUT ME
ロッピー
コンサルタントから2018年にエンジニアに転向。年収400万円のサラリーマンエンジニアから、半年で月収100万円を稼ぐエンジニアになった。 Python、Golangなど単価の高い言語を得意とする。