2012-05-03 12 views
4

私はPythonを使ってプログラミングを始めることを検討しています。軽量なユニットテストフレームワークを探しています。私はunittestを見てきました - 私が言うことができる限り - それは微妙に見える - ライトウェイト。Pythonの軽量ユニットテスト

は例えば、ここで私が書くことができるようにしたいものです。

import unittest 

def f(x): 
    return x+2 

checkEqual(f(3),5) 

...、他何を。

(define (f x) 
    (+ x 2)) 

(check-expect (f 3) 5) 

...と、それはそれだ:私はから来ているところをお見せするために、これは私がラケットの始まる学生の言語で記述しますものです。確かに誰かがこのツールを書いていますが、私はそれを見つけていませんか?

(難苦しませるのいずれかの外観を事前に謝罪これは深刻な問題である。。)

SELF-EDIT:

誰もがこれを指摘する前に:はい、私は(DEF checkEqualを書くことができ、A 、b):print(a == b);私はもう少しで何かを探しています:それは公差で数字をチェックできるはずです、失敗したテストケースだけを印刷するためのサポートを持っていなければなりません、いくつのテストケースが失敗したかを教えてください。繰り返しますが、私はこのコードを書くことができると確信しています。私はただホイールを再発明しないようにしようとしています。

+0

あなたは次のように書くつもりです: 'from unittest import checkEqual' –

+0

私のマシンでは、" ImportError:name checkEqualをインポートできません "というエラーが表示されます。 –

+0

私のマシンで、 'import unittest' ...' NameError:name 'checkEqual'が定義されていません。 –

答えて

4

のdoctestは素晴らしい提案ですが、あなたが近いあなたのサンプルコードに取得したい場合、私は(pytest.org)py.testをお勧めします。私が変更された場合

w:\tmp>py.test tt.py 
============================= test session starts ============================= 
platform win32 -- Python 2.6.6 -- pytest-2.2.3 
collected 1 items 

tt.py . 

========================== 1 passed in 0.01 seconds =========================== 

:私はtt.pyというファイルにし、py.testでそれを実行し、それはこのようになっていることを置けば

def f(x): 
    return x+2 

def test_equal():  # py.test looks for functions that start with test_ 
    assert f(3) == 5 

:あなたの例は次のように書かれることになりますFに主張(3)== 6を、そして再びそれを実行私が手:

w:\tmp>py.test tt.py 
============================= test session starts ============================= 
platform win32 -- Python 2.6.6 -- pytest-2.2.3 
collected 1 items 

tt.py F 

================================== FAILURES =================================== 
_________________________________ test_equal __________________________________ 

    def test_equal():  # py.test looks for functions that start with test_ 
>  assert f(3) == 6 
E  assert 5 == 6 
E  + where 5 = f(3) 

tt.py:5: AssertionError 
========================== 1 failed in 0.01 seconds =========================== 

py.testもスケールアップ、そしてあなたはそれがカバレッジを実行させることができ、複数のCPU上でのテストを配布するなどそれはまた見つけて、 unittestテストを実行し、doctestを実行することもできます。

+0

これは最高のもののように見えます。私は、反射風味の「機能 - 始まって - テスト_」に完全に恋しているわけではありませんが、それ以外の素晴らしい解決策に見えます。ありがとう! –

+0

私は同意します(両方の点で:-) – thebjorn

5

Doctestをお勧めします。

あなたの例では、次のようになります。

def f(x): 
    """ 
    >>> f(3) 
    5 
    """ 
    return x + 2 

なぜ?:

  1. それは超簡単です:それは上で動作
  2. 「私はこの事を実行したとき、私は戻って、この答えを得る必要があります」関数レベル - クラス前でもテストを導入できる可能性があります
  3. 対話的なPythonエクスペリエンスを反映します。
+0

おっと!私の非価値中立的な言い回しを許しますが、私が座っている場所から、それは...まあ...ただ、非常に、非常に、最適ではないと言いましょう。文字列の解析に基づくものは、非常に壊れやすいものです。私はここで間違っている13の事について見ることができます。非常に良い。私は本当にここで私の舌を噛んでいます。 –

+0

@JohnClements Doctestはもっとも堅牢なユニットテストフレームワークではありませんが、文字列を不正確にすることは大きな問題ではありません。なぜなら、インタプリタからの正確な入力と出力をドキュメント文字列に渡してしまうからです。私はそれがあなたの状況に合っているとは思っていません。なぜなら、単純な回帰テストでは他の何よりもうまくいくからです。もっとTDDスタイルで教えたいと思っています。しかし、フレームワークを打ち砕かないでください。これは、小規模なプロジェクトで作業することを確認する非常に簡単な方法です。 – Wilduck

1
import unittest 

def f(x): 
    return x + 2 

class TestFunctionF(unittest.TestCase): 
    def test_f(self): 
     self.assertEqual(f(3), 5) 

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

が生成されます

---------------------------------------------------------------------- 
Ran 1 test in 0.000s 
OK 
+0

Blecch!あなたはその最初の日に生徒にそのgoopのすべてを入力するように言うことを想像できますか? –

+2

なぜでしょうか。はい、私はそれを想像することができます。 OK、おそらく2日目:) – alan

+1

あなたの気持ちの良い返答に感謝します!私はあなたを怒らせるだけではないことを嬉しく思います。 :) –

2

2つの一般的な選択肢は、nosepy.testです。どちらも非常に軽量な構文を持っていますが、フル機能も備えています。ここで

は鼻に延長紹介です:http://ivory.idyll.org/articles/nose-intro.html

そして、ここではpy.testを使ってサンプル機能とテストです:

# content of test_sample.py 
def func(x): 
    return x + 1 

def test_answer(): 
    assert func(3) == 5 

は、コマンドラインからテストを実行します:

$ py.test 
=========================== test session starts ============================ 
platform darwin -- Python 2.7.1 -- pytest-2.2.2 
collecting ... collected 1 items 

test_sample.py F 

================================= FAILURES ================================= 
_______________________________ test_answer ________________________________ 

    def test_answer(): 
>  assert func(3) == 5 
E  assert 4 == 5 
E  + where 4 = func(3) 

test_sample.py:5: AssertionError 
========================= 1 failed in 0.02 seconds =========================