4

Pythonを使用して入門プログラミングを教えることを検討しており、軽量の単体テストフレームワークを探しています。私はunittestを調べましたが、私が知る限り、それはめちゃくちゃ軽量ではないように見えます

たとえば、これが私が書きたいものです:

import unittest

def f(x):
  return x+2

checkEqual(f(3),5)

...そして他には何もありません。私がどこから来たのかを示すために、これは私がラケットの最初の学生の言語で書くものです:

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

(check-expect (f 3) 5)

... 以上です。確かに誰かがこのツールを書いたのですが、私はそれを見つけられませんか?

(火炎ベイトが発生した場合は、事前にお詫び申し上げます。これは深刻な問題です。)

自己編集:

誰かがこれを指摘する前に:はい、私はdef checkEqual(a、b):print(a == b);と書くことができます。もう少し何かを探しています。許容誤差のある数値をチェックできる必要があり、失敗したテストケースのみの印刷をサポートしている必要があり、失敗したテストケースの数を示すことができるはずです。繰り返しますが、私はこのコードを書くことができると確信しています。車輪の再発明を避けようとしているだけです。

4

4 に答える 4

5

Doctestをお勧めします。

あなたの例は次のようになります:

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

なぜ?:

  1. それは非常に簡単です:「私がこれを実行するとき、私はこの答えを取り戻す必要があります」
  2. 関数レベルで機能します。これにより、クラスの前でもテストを導入できる可能性があります。
  3. インタラクティブなPythonエクスペリエンスを反映しています。
于 2012-05-03T19:00:25.623 に答える
4

Doctestはすばらしい提案ですが、サンプルコードに近づきたい場合は、py.test(pytest.org)をお勧めします。あなたの例は次のように書かれます:

def f(x):
    return x+2

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

それをtt.pyというファイルに入れて、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 ===========================

アサーションを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にテストを分散したりできます。また、単体テストテストを見つけて実行し、doctestを実行することもできます。

于 2012-05-03T19:30:33.750 に答える
2

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

noseの詳細な紹介は次のとおりです: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 =========================
于 2012-05-03T20:16:20.347 に答える
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
于 2012-05-03T19:02:01.930 に答える