技術

PythonでTDD その3

PythonでTDD その2で、気に入らない点の大部分は解決したのですが、まだtestsディレクトリのサブディレクトリにtests_を付ける必要があるという点が気に入らないのでそこも解決してみた。

そもそもなぜtests_を付けてたかと言うと、テストコードからテスト対象のコードをimportするときに同じディレクトリ名(パッケージ名)だとテストコード側が優先されてテスト対象がimport出来ないって事になるからでした。
つまり、ディレクトリ名(パッケージ名)を変えた上で、カレントディレクトリを前々回のディレクトリ構成図で示すところのsourceにして実行することで(sys.pathにはカレントディレクトリが含まれますので)、そこからテスト対象のパッケージ・モジュールが辿れるという仕組みだった訳ですな。

で、ディレクトリ名(パッケージ名)は被ってもモジュール名は被ってない(b.pyに対するbtest.pyのように)なら、然るべき検索パスを追加した上で、パッケージ名を使わずにimportしたらいいんじゃないか?
ということに気づいたので試してみました。

例えば、前々回のディレクトリ構成図で示すところのbtest.pyからb.pyをimportするにはbtest.pyに以下のように書くことになります。

import os, sys
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(CURRENT_DIR, '../../libs'))
import b

これで、テストコード側からテスト対象を直接import出来ました。めでたしめでたし、とはいかずorz
実はこの方法だと、テスト対象側のパッケージ自体をimportするにはどうしたらいいかという問題が残ります。
後ほど解決方法を考えてみよう。

あと、テストとテスト対象のソースファイル名(例えばbtest.pyとb.py)が違うのが少し気になりますが、これは同じにしてしまうとエディタ上で混同しやすくなり逆に利便性が下がる気がします。
実際よく使ってるTextWranglerではドキュメント一覧でファイル名しか表示されないので区別がつかないという事になります。

実はビルトイン関数のexecfileを使う方法も試してみたところうまくいったように見えたのですが、読み込んだソースの中で相対importを使ってると検索起点がexecfileを実行したモジュールになってしまって問題が出ます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください