2
import unittest

import HTMLTestRunner

class TestClass1(unittest.TestCase):

    def setUp(self):
        pass

    def case1(self):
        assert 4 == 3

    def case2(self):
        assert 4 == 4

    def tearDown(self):
        pass

class TestClass2(unittest.TestCase):

    def setUp(self):
        pass

    def case3(self):
        assert 1 == 2

    def tearDown(self):
        pass

def suite():

    suite = unittest.TestSuite()
    suite.addTest(TestClass1(['case1','case2']))
    suite.addTest(TestClass2('case4'))
    return suite


test_suite = suite()

unittest.TextTestRunner(verbosity=2).run(test_suite)

fp = file('my_report.html', 'wb')

runner = HTMLTestRunner.HTMLTestRunner(
                stream=fp,
                title='My unit test',
                description='This demonstrates the report output by HTMLTestRunner.'
                )

runner.run(test_suite)

両方のクラスのすべてのメソッドを 1 回の実行で実行しようとしています。ただし、上記のコードはそうしませんでした。スイート関数で、クラスから複数のテストを追加しようとしましたが、それも機能せず、エラーが発生していました。

4

1 に答える 1

2

この回答から、質問「Is test suite deprecated in PyUnit?」:

「unittest.main() は、それが呼び出されたモジュールを動的に調べ、unittest.TestCase から派生したすべてのクラスを見つけるため、単一のモジュールですべてのテストを実行する場合、unittest.TestSuite は必要ありません。」

unittest.TestSuiteがいつ役立つかについては、その回答にさらに説明があります。

とはいえ、これらのテストを機能させるには、いくつかの変更を加える必要がありました。まず、unittestは "test_" で始まる関数を探します。また、Python の assert ステートメントだけでなく、 unittest のassertEqual および同様のメソッドを使用する必要があります。それを行い、不要なコードを削除すると、次のようになりました。

import unittest
class TestClass1(unittest.TestCase):
    def test_case1(self):
        self.assertEqual(4, 3)
    def test_case2(self):
        self.assertEqual(4, 4)
class TestClass2(unittest.TestCase):
    def test_case3(self):
        self.assertEqual(1, 2)
unittest.main()

これにより適切な出力が得られました (3 回のテストで 2 回の失敗がありました) が、スペースの関係でここでは再現しません。

于 2012-09-14T19:35:37.457 に答える