Pythonネタ:unittestを使う

[]
2009年7月27日 17:50

 Python標準のユニットテスト機能、「unittest」の使い方メモ。

目的

 unittestはPythonで作成したクラスの特定の関数や、機能の動作確認に利用できる機能だ。詳しくは ドキュメントを読めばすぐに分かる が、unittestクラスの派生クラスを作り、そのクラスの関数としてテストコードを記述してやると、簡単にユニットテストができる、というもの。

 メインの実装コードにprint文などを挿入したり、テストコードを挿入しても良いのだが、それだとテストコードの再利用が難しかったり、いったんバグ修正を行ってテストコードを削除した後に再度バグが発生したりした場合に二度手間になったりする。そのため、テストコードはなるべくunittestにまとめて記述しておくとデバッグや実装、テストが楽になりますよ、というお話。

使い方

 基本的な使い方はこれまたオンラインドキュメントにあるのだが、自分は下記の形をよく使っている。

import random
import unittest

class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        # ここに各テスト関数を実行する前に呼び出す処理を書く。
        # 通常は共通のデータの準備とかを書くことが多い


   def tearDown(self):
        # ここに各テスト関数を実行した後に呼び出す処理を書く。
        # 通常は共通のデータの後片付けとかを書くことが多い


    def test_hogehoge(self):
        """test for hogehoge テストの内容をコメントに入れる"""
        # テストコード1をここに書く


    def test_foobar(self):
        """test for foobar テストの内容をコメントに入れる"""
        # テストコード2をここに書く


# do unittest
# テストオブジェクトを作成
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)

# テスト実行。出力するメッセージレベルはverbosity引数で設定できる
unittest.TextTestRunner(verbosity=2).run(suite)

 テストコード内でテストが期待したとおりの処理を行っているかどうかは、unittest.TestCaseクラス内で用意されているasert/fail関数を使うのが好ましい。詳しくは「pydoc unittest」等で確認できるが、たとえば二つの引数の値が等しくない場合にエラーを出すには「assertEqual(引数1、引数2、エラーメッセージ)」関数を使う。

 そのほか、unittestにはレポート機能などもあるが、基本的には上記さえ押さえておけば事足りるはず。

MSys&MinGWをインストール

2009年7月7日 18:30

  MinGW でのビルドを前提とされたツールをCygwin上でビルドするのが面倒だったので全力で MSys とMinGWをインストールした。MSysGitも入っているので環境汚れまくり。

  SourceForge.JP のミラーからMinGW 5.1.4.exeとMSYS-1.0.11-rc-1.exeをダウンロードしてそれぞれインストール。MSYSは結構下の方(MSYS Base Systemの中)にあるので探す。

 それぞれインストール後、「C:\msys\1.0\etc\fstab.sample」を同じディレクトリに「fstab」という名前にコピー、下記のようにMinGWとActivePerlをインストールしているディレクトリに対応付ける。

c:/MinGW		/mingw
c:/Perl	/perl

 あとはスタートメニューの「MinGW」?「MSYS」?「MSYS」などからシェルを起動。gccがエラーを日本語で吐いてくれるのだがWindowsのコマンドプロンプトだと化けるのでexport LANG=Cを適宜設定。

GCC 4.4系を使う

 GCC 4.4系を使うには別途インストールが必要。「gcc-4.4.0-mingw32-notes.txt」に解説があるが、下記をMinGWのインストールディレクトリで展開すればよい。

GMP Runtime [REQUIRED]
gmp-4.2.4-mingw32-dll.tar.gz
MPFR Runtime [REQUIRED]
mpfr-2.4.1-mingw32-dll.tar.gz
POSIX Threads for Win32 Runtime [REQUIRED]
pthreads-w32-2.8.0-mingw32-dll.tar.gz
Core (C) [REQUIRED]
gcc-core-4.4.0-mingw32-bin.tar.gz、gcc-core-4.4.0-mingw32-dll.tar.gz
C++ [OPTIONAL]
gcc-c++-4.4.0-mingw32-bin.tar.gz、gcc-c++-4.4.0-mingw32-dll.tar.gz

 なお、ドキュメントにはgcc-full-4.4.0-mingw32-bin.tar.lzmaに全部入っていると書いてあるが、GMPとMPFRとPOSIX Threadは入っていなかった……(汗)。