Pythonのテストフレームワークunittestとpytestの違いを現役エンジニアが解説【初心者向け】

初心者向けにPythonのテストフレームワークunittestとpytestの違いについて現役エンジニアが解説しています。テストフレームワークとは、ソフトウェアのテストを行うフレームワークのことです。Python標準のunittestとサードパーティーのpytestのインストール方法や使い方について解説します。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

Pythonのテストフレームワークunittestとpytestの違いについて、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して、初心者向けに解説します。

 

Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。

 

田島悠介

今回は、Pythonに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Pythonのテストフレームワークunittestとpytestの違いについて詳しく説明していくね!

大石ゆかり

お願いします!

 

目次

 

テストフレームワークとは

テストフレームワークとは、ソフトウェアのテストを行うフレームワークのことをいいます。ソフトウェアを開発した際には当然リリース前に自分の手で動かして期待通りの結果が出力されるのかを確認します。

しかし、あるパターンでは期待通りの結果が出力されないことがあります。そこでテストフレームワークではテストケースをいくつか用意して問題なく結果が出力されるかを確認しています。

テストケースで問題があればリリース後のトラブルを事前に防ぐことができるということになります。テストフレームワークは各言語に合わせて提供されており、実際の開発現場でもこのテストフレームワークを使用したテスト行われています。

[PR] Pythonで挫折しない学習方法を動画で公開中

unittestについて

unittestは、Pythonの標準モジュールで提供されているテストフレームワークです。

もともとはJavaでユニットテストを行う際に使われるJUnitに触発されて開発されており、他の言語で標準で取り入れられているテストフレームワークと同じような感じでテストを行うことができます。

つまり、このモジュールを使ったテストが分かれば他言語のユニットテストで使われるフレームワークでもテストも書きやすくなります。

ユニットテストではいくつかの重要な概念をオブジェクト指向によってサポートすることになります。

以下のコードは公式ドキュメントで紹介されている文字列メソッドのユニットテストの例です。ファイル名はword_test.pyとします。

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

任意のコードに保存したら、以下の1行で実行します。

python word_test.py

 

pytestについて

pytestはサードパーティーのPythonのテストフレームワークです。

使うときには以下のpipコマンドでライブラリをインストールする必要があります。

pip install pytest

pytestでテストを行うときはとてもシンプルで、テストコード内の関数名の頭にtestがつく関数が自動的にテストの対象として認識されます。そして各テストで期待する結果をassert文で定義します。

先程紹介した文字列メソッドのテストをpytestで書くと以下の通りになります。ファイル名はword_pytest.pyとします。

import pytest

def test_upper():
    assert 'foo'.upper() == 'FOO'

def test_isupper():
    assert 'FOO'.isupper() == True
    assert 'Foo'.isupper() == False

def test_split():
    s = 'hello world'
    assert s.split() == ['hello', 'world']
    with pytest.raises(TypeError):
        s.split(2)

pytestで動かすために作成したコードの場合、テストを実行するときはpytestコマンドを使用します。上記のコードであれば、以下の1行でテストを実行することになります。

pytest word_pytest.py

 

unittestとpytestの比較

さて、2種類のPythonのテストフレームワークを紹介してきましたが、ここからはこの2種類のフレームワークの比較をしていきたいとおもいます。

インストール

まずはインストールの有無です。unittestは標準モジュールなので当然インストールは必要ありませんが、pytestについてはインストールが必要になります。そのため、導入するためにpytestのほうが多少手間がかかります

記法

さきほど紹介した2つのサンプルコードはやっているテストの内容は全く同じですが、明らかにコードの書き方に違いがあります。unittestの場合はオブジェクト指向で書くため、クラスを使用してテストパターンを書いています。assert文に関してもメソッドを呼び出す形で実行しています。

一方でpytestではユニットテストをそれぞれ関数単位で定義をしており、さらにassert文については比較演算子で実行結果を比較するようになっています。

まとめると、pytestではPythonらしい書き方でテストを書くことができます。一方unittestでは学習コストが高いですが、先程述べたように他の言語で標準で使われているテストフレームワークに近い記法になっているので、Python以外の言語でユニットテストを書くことがある方はunittestを覚えておくといいでしょう。

実行結果

unittestの実行結果はとてもシンプルでテストを実行したときに結果、及びテストが通らなかったときはどこのテストが通らなかったのかを行番号で示すしくみです。

一方pytestについては、テストに失敗したときに失敗した箇所を細かく表示するため、テストに失敗した原因を特定しやすいです。それに加えてテストを実行しているPythonのバージョン、pytestのバージョン、テストを実行しているディレクトリなどのテスト実行時の環境を出力するため、テストに失敗したときの原因を実行環境から推測することもできます。

ただ、その分pytestのほうが実行時間が遅いのがデメリットになります。

まとめ

今回はPythonで使われるテストフレームワークについて紹介してきました。

テストフレームワークは現場で開発を担当しているエンジニアであれば必ず覚えておきたいスキルの1つなので、現役エンジニアの皆さんはもちろんのこと、これからエンジニアとしてのキャリアをスタートさせようとしている皆さんは要チェックです!

監修してくれたメンター

メンター三浦

モバイルゲームを運用している会社のエンジニアをしています。趣味でWEB開発やクラウドコンピューティングもやっており、ソフトもハードもなんでもやります。

TechAcademyジュニアではPythonロボティクスコースを担当しています。好きな言語はPython, Node.js。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間で、Pythonを使った人工知能(AI)や機械学習の基礎を習得できる、オンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。