ラベル tips の投稿を表示しています。 すべての投稿を表示
ラベル tips の投稿を表示しています。 すべての投稿を表示

2011年7月2日土曜日

Pythonで動的にサブクラスを生成

excelとかDBとかにテストケース用のデータを追加したら
勝手にテストクラスにテストケース(つまりテストメソッド)が追加される、
とかそういうことをやりたい。

で、unittest.TestCaseクラスのサブクラスを
テストデータから動的に生成して実行したいと思ったときに、
どうやれば良いのかちょっと悩んだので、メモ。

動的にサブクラスを生成するのは、
非常に単純でtype関数を使えばできる。
type関数は[クラス名]、[親クラスのタプル(多重継承も可)]、[付与したい属性の辞書]で
動的にクラス生成をできる。


import unittest

def create_testmethod():
    """
    テストメソッドを動的に生成
    """
    def testMethod(self):
        self.assertEquals(1,1)
    return testMethod

def create_testclass():
    """
    TestCaseのサブクラスを動的に生成
    """
    test_class = type('TestA', (unittest.TestCase,), {})
    setattr(test_class,'testMethod',create_testmethod())
    return test_class

def suite():
    """
    テストスイートを生成
    """
    suite = unittest.TestSuite()
    test_class = create_testclass()
    suite.addTest(unittest.makeSuite(test_class))
    return suite

if __name__ == "__main__":
    unittest.TextTestRunner().run(suite())


動的にテストクラス(unittest.TestCaseのサブクラス)を生成して、
動的にテストメソッドを追加することができる。
これを応用すればソースコード書かずにテストクラス、テストメソッドを動的に追加するようなプログラムができる。



Quick Lookup:

2010年6月27日日曜日

PythonStartup

Pythonのコマンドラインでの開発の際に過去のコマンドヒストリや補完のやり方は以下のとおり。

.pythonstartupファイルをhomeに作成し下記の内容にする。


# -*- coding: utf-8 -*-
import readline
import rlcompleter
import atexit
import os

readline.parse_and_bind('Tab: complete')
# osxの場合は下記でないと動かないかも
#readline.parse_and_bind("bind ^I rl_complete")
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
readline.read_history_file(histfile)
except IOError:
pass
atexit.register(readline.write_history_file,histfile)
del os, histfile, readline, rlcompleter, atexit


で環境変数に以下を追加。
PYTHONSTARTUP=~/.pythonstartup


これでコマンドラインでタブ補完と上下キーでヒストリが表示されるようになる。
ipythonも素敵だけど、サーバでのインストールが面倒なときや、
windowsではこっちの方が良いかも(windowsのipythonは表示がおかしなことになる。自分だけか)