2009-08-20 15 views
4

私は、自動システムテストのために「テストフレームワーク」を評価しています。これまで私はPythonフレームワークを探しています。 py.testやnoseでは、私はGoogleテストフレームワークから知っているEXPECTマクロのようなものを見ることができません。 最初の失敗時にテストを中止しないで、1回のテストで複数のアサーションを作成したいと思います。 これらのフレームワークで何か不足しているのですか?これは機能しませんか? 自動システムテストに使用できるpythonテストフレームワークの提案はありますか?致命的ではない障害をサポートするPythonテストフレームワーク

+0

に包まれているように、あなたの実装MyTestCaseを想定しては、私の答えにあなたのコメントを見ました。私は正確に何をしようとしているのか分かりません。「最初の失敗時にテストを中断せずに、あるテストでいくつかのアサーションをしたいと思います」と答えました。私はちょうど骨格のアプローチを与えた、明らかにあなたが例外ハンドラにしたい場合は、リスト内のすべての例外情報をキャプチャすることができます。私は自分の答えを更新しました。 –

+0

答えはどこにありますか? 削除しましたか?また、(複数のユーザーから、私が正しくリコールしたときの)コメントも表示されますか? – housemaister

答えて

2

私は鼻を使って機能テストをしたいと思っていました。私は最終的にこれを思いつきました:

def raw_print(str, *args): 
    out_str = str % args 
    sys.stdout.write(out_str) 

class DeferredAsserter(object): 
    def __init__(self): 
     self.broken = False 
    def assert_equal(self, expected, actual): 
     outstr = '%s == %s...' % (expected, actual) 
     raw_print(outstr) 
     try: 
      assert expected == actual 
     except AssertionError: 
      raw_print('FAILED\n\n') 
      self.broken = True 
     except Exception, e: 
      raw_print('ERROR\n') 
      traceback.print_exc() 
      self.broken = True 
     else: 
      raw_print('PASSED\n\n') 

    def invoke(self): 
     assert not self.broken 

つまり、テストが合格したか失敗したかを示す文字列が出力されています。テストの終わりに、実際にアサーションを実行するinvokeメソッドを呼び出します。確かに好ましくないですが、この種のテストに対応できるPythonのテストフレームワークは見ていません。この種のことをするために鼻のプラグインを書く方法を知りたかったわけでもありません。 :/

+0

良いアイデア。 私たちは鼻を使うことにしたので、プラグインは素晴らしいでしょう。 – housemaister

-1

ノーズは、コマンドラインで-xオプションを渡すと、最初の失敗時にのみ中止されます。

test.py:-xオプションなし

def test1(): 
    assert False 

def test2(): 
    assert False 

 
C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py 
FF 
====================================================================== 
FAIL: test.test1 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line 
183, in runTest 
    self.test(*self.arg) 
    File "C:\temp\py\test.py", line 2, in test1 
    assert False 
AssertionError 

====================================================================== 
FAIL: test.test2 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line 
183, in runTest 
    self.test(*self.arg) 
    File "C:\temp\py\test.py", line 5, in test2 
    assert False 
AssertionError 

---------------------------------------------------------------------- 
Ran 2 tests in 0.031s 

FAILED (failures=2) 

-xオプション付き:

 
C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py -x 
F 
====================================================================== 
FAIL: test.test1 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line 
183, in runTest 
    self.test(*self.arg) 
    File "C:\temp\py\test.py", line 2, in test1 
    assert False 
AssertionError 

---------------------------------------------------------------------- 
Ran 1 test in 0.047s 

FAILED (failures=1) 

あなたはthe nose documentationの見直しを検討する必要があります。

+3

質問は、* one *テストでの複数のアサーションについてですが、複数のテストではなく、失敗する可能性があります。 –

1

提案がありましたので、robot frameworkを提案します。

+0

何らかの理由で、私はキーワード駆動型テストフレームワークatmを使用できません。しかし、今後のプロジェクトでは、このことを念頭に置いていきます。ありがとう。 – housemaister

1

奇妙なことに、私のclaft(コマンドラインとフィルタテスター)のようなものを探しているようです。それは似ているが、はるかに成熟している。

claftは(これまでのところ)私がプログラミング演習で生徒を助けるために書いたおもちゃです。この考え方は、自動テストにも適している一方で、プログラムの要件を合理的に人間が読める(そしてプログラム的ではなく宣言的な)観点で表す簡単な構成ファイルを演習に提供することです。

claftすべての定義済みのテストを実行し、引数と入力をそれぞれに提供し、戻りコードをチェックし、出力(stdout)とエラーメッセージ(stderr)を正規表現パターンと照合します。リスト内のすべての失敗を収集し、各スイートの終わりにリスト全体を表示します。

入力/出力シーケンスの任意のダイアログをまだ実行していません。これまでのところ、データをフィードしてすべてのデータ/エラーを読み取ります。また、タイムアウトも実装されておらず、実際には失敗した実行の試行もキャプチャされません。 (私はちょうどおもちゃだと言っていましたが、これまでのところ、私はしていませんでした)。私はまだセットアップ、ティアダウン、および外部チェックスクリプトのサポートを実装していません(私はそうする計画があります)。

「ロボットのフレームワーク」についてのブライアンの提案は、あなたのニーズに適しているかもしれません。それを見てみると、私の目的よりもはるかに関与していることが示唆されています。(私は、プログラミングに慣れていない生徒が自分のエクササイズに集中でき、テストハーネスを設定することで多くの時間を費やさずに済むように、物事をシンプルに保つ必要があります)。

claftをご覧になるか、そこから独自のソリューション(BSDライセンス)を使用してください。明らかにあなたは歓迎して元気になれるでしょう。 (これは[bitbucket] :(http://www.bitbucket.org/)にありますので、Mercurialを使ってクローンを作成し、自分のリポジトリをフォークしてください...あなたの変更を自分のレポにマージすることを望むなら、 "pull request"

また、おそらく私はあなたの質問を誤解しています。

0

なぜ(unittestで、これは任意の枠組みの中で動作するはずです):

class multiTests(MyTestCase): 
    def testMulti(self, tests): 
     tests(a == b) 
     tests(frobnicate()) 
     ... 

機能が

testlist = [] 
x.testMulti(testlist.append) 
assert all(testlist) 
関連する問題