3

TestCase 派生クラスのバリエーションのジェネレーターを作成したいと考えています。

私が試したのはこれです:

import unittest

def create_class(param):
    class Test(unittest.TestCase):
        def setUp(self):
            pass

        def test_fail(self):
            assert False
    return Test

def test_basic():
    for i in range(5):
        yield create_class(i)

私が得るものはこれです:

======================================================================
ERROR: test_1.test_basic
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.3/site-packages/nose/case.py", line 268, in setUp
    try_run(self.test, names)
  File "/usr/lib/python3.3/site-packages/nose/util.py", line 478, in try_run
    return func()
TypeError: setUp() missing 1 required positional argument: 'self'

クラス ( yield create_class(i)()) の代わりにインスタンスを生成すると、次のエラーが発生します。

======================================================================
ERROR: test_1.test_basic
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.3/site-packages/nose/case.py", line 198, in runTest
    self.test(*self.arg)
  File "/usr/lib/python3.3/unittest/case.py", line 492, in __call__
    return self.run(*args, **kwds)
  File "/usr/lib/python3.3/unittest/case.py", line 423, in run
    testMethod = getattr(self, self._testMethodName)
AttributeError: 'Test' object has no attribute 'runTest'

何か案は?

4

2 に答える 2

5

インスタンス化するときTestCaseは、テストのメソッド名に合格する必要があります。

yield create_class(i)('test_fail')

それ以外の場合、名前はデフォルトでrunTest(したがって、最後に発生したエラー)になります。

また、テストジェネレータとの間には奇妙な相互作用があることに注意してくださいTestCase。次のコードで:

import unittest

def create_class(param):
    class Test(unittest.TestCase):
        def setUp(self):
            pass

        def test_fail(self):
            print('executed')
            assert False
            print('after assert')

    return Test

def test_basic():
    for i in range(5):
        yield create_class(i)('test_fail')

私はこの出力を取得します:

$ nosetests -s
executed
.executed
.executed
.executed
.executed
.
----------------------------------------------------------------------
Ran 5 tests in 0.004s

OK

ご覧のとおり、テストは機能しますが失敗しませんassert。これはおそらく、をTestCase処理するAssertionErrorが、noseこれが処理されることを期待していないため、テストが失敗したことを確認できないという事実が原因です。

これは、次のドキュメントから確認できますTestCase.run

テストを実行し、として渡されたテスト結果オブジェクトに結果を収集しますresult。resultが省略されているか、Noneの場合、一時的な結果オブジェクトが(defaultTestResult()メソッドを呼び出すことによって)作成され、使用されます。結果オブジェクトはrun()の呼び出し元に返されません。

The same effect may be had by simply calling the TestCase instance.

したがって、noseジェネレーターによって生成されTestCaseたオブジェクトが特別な方法で処理されるべきであるとは見なされません。単に呼び出し可能であることが期待されます。はTestCase実行されますが、結果は失われた一時オブジェクトに入れられ、これにより、テスト内で発生するすべてのテストの失敗が食い尽くされます。したがって、TestCaseesを生成することは単に機能しません。

于 2013-03-07T21:31:40.980 に答える
0

あなたが提供するコードを実行しました。エラーはありませんでした。私が使用しているバージョンはpython2.7です。システムはubuntu12.10です。おそらく、python2.7 で確認する必要があります。

于 2013-03-07T21:25:28.930 に答える