1

特に長いfibアサーションを実行しても失敗しない次のテストがあります。

正しく失敗しないテスト

#!/usr/env/bin python2.7

import unittest
from fib import fib
from nose.tools import timed


def test_gen(expected, actual):
    @timed(.001)
    def test_method(self):
        return self.assertEqual(expected, actual)
    return test_method

if __name__ == '__main__':
    all_cases = {
        'user': ((fib(40), 102334155), (fib(2), 1), (fib(5), 5)),
    }
    fails = {}
    for username, cases in all_cases.items():
        class FibTests(unittest.TestCase):
            pass

        for index, case in enumerate(cases):
            test_name = 'test_{0}_{1}'.format(username, index)
            test = test_gen(case[1], case[0])
            setattr(FibTests, test_name, test)

        suite = unittest.TestLoader().loadTestsFromTestCase(FibTests)
        result = unittest.TextTestRunner(verbosity=2).run(suite)
        fails[username] = len(result.failures)
    print fails

(遅い)Fib.pyの実装

def fib(x):
    if x == 0:
        return 0
    elif x == 1:
        return 1

    return fib(x - 2) + fib(x - 1)

適切に失敗するテスト

import unittest
from fib import fib
from nose.tools import timed


def test_gen(expected, actual):
    @timed(.001)
    def test_method(self):
        time.sleep(.2)
        return self.assertEqual(expected, actual)
    return test_method
4

1 に答える 1

1

あなたは間違ったタイミングをとっていて、実際にテストメソッドを呼び出すことはありません。また、nose がジェネレーター テスト ケースをサポートしている場合、テストのコンテナーとして機能するだけのケースを動的に作成してクラスに追加するために、非常に多くの労力を費やすことになります。ここ。また、これはテスト ファイルですか、それとも製品コードですか? それがテスト ファイルである場合、そのすべてのコードを含むことif __name__ == '__main__'は一種の奇妙であり、製品コード ファイルである場合、無条件に実行される部分にtest_genfunction および the unittestand noseimport ステートメントを含めることはあまり意味がありません。テスト スクリプトを自己実行可能にしようとせずに、次のようにすることをお勧めします。鼻で発射するだけです。

from fib import fib
from nose.tools import timed

fib = timed(.001)(fib)

def execute(username, fib_arg, expected_output):
    result = fib(fib_arg)
    assert result == expected_output, ('%s fib(%d) got %d, expected %d'
                                       % (username, fib_arg, result, expected_output))

def test_fib():
    for name, datasets in (('user', ((40, 102334155), (2, 1), (5, 5))),):
        for arg, expected in datasets:
            yield execute, name, arg, expected
于 2013-01-18T00:06:16.570 に答える