4

Pythonスクリプト内から単一の単体テストを実行して結果を収集する方法がわかりません。

シナリオ:さまざまなオブジェクトのさまざまな統計分布を生成するさまざまな方法をチェックする一連のテストがあります。基本的に特定の種類のランダム性をチェックしていることを考えると、テストが失敗することがあります。スクリプトまたはインタプリタからテストを繰り返し実行し、さらに分析するために結果を収集したいと思います。

次のモジュールmyTest.pyがあるとします。

class myTest(unittest.TestCase):
    def setup(self):
       ...building objects, etc....
    def testTest1(self):
           ..........
    def testTest2(self):
           ..........

基本的に私はする必要があります:

  1. セットアップメソッドを実行します
  2. testTest1(たとえば)を100回実行します
  3. 失敗を収集する
  4. 失敗を返す

私が最も近かったのは(同様の質問のコードを使用して):

from unittest import TextTestRunner, TestSuite
runner = TextTestRunner(verbosity = 2)
tests = ['testTest1']
suite = unittest.TestSuite(map(myTest, tests))
runner.run(suite)

しかし、これは機能しません。理由は次のとおりです。

runner.run(suite) セットアップメソッドを実行しません

testTest1が失敗したときにスローされる例外をキャッチできません

4

1 に答える 1

2

複数回実行するテストをスイートに追加するだけです。

これが完全なコード例です。このコードがインタラクティブなPythonコンソールで実行されていることを確認して、実際に機能することを証明することもできます。

import unittest
import random

class NullWriter(object):
    def write(*_, **__):
        pass

    def flush(*_, **__):
        pass

SETUP_COUNTER = 0

class MyTestCase(unittest.TestCase):

    def setUp(self):
        global SETUP_COUNTER
        SETUP_COUNTER += 1

    def test_one(self):
        self.assertTrue(random.random() > 0.3)

    def test_two(self):
        # We just want to make sure this isn't run
        self.assertTrue(False, "This should not have been run")


def suite():
    tests = []
    for _ in range(100):
        tests.append('test_one')

    return unittest.TestSuite(map(MyTestCase, tests))

results = unittest.TextTestRunner(stream=NullWriter()).run(suite())
print dir(results)
print 'setUp was run', SETUP_COUNTER, 'times'
于 2013-03-26T09:34:41.260 に答える