バックグラウンド
複数の入力値に対して単一の単体テストを実行し、失敗を表示する方法を見つけようとしています。これは、私が考えていることの簡単なデモです。
from time import time
import unittest
def demo():
while True:
count = 0
for i in xrange(10):
count += 1
yield int(time() * 1000) + count
count = 0
class TestDemo(unittest.TestCase):
def setUp(self):
self.gen = demo()
self.prev = next(self.gen)
def test_always_bigger(self):
for cycle in xrange(1000):
curr = next(self.gen)
self.assertGreater(curr, self.prev)
self.prev = curr
if __name__ == '__main__':
unittest.main()
私が見つけた最も類似した質問は、ある種の動的test_<something>
メソッド作成 (例: 1、2、3 ) またはノーズ ジェネレータ(例: 1、2 ) で回答されています。標準ライブラリに固執しながら、予測不可能な入力に基づいて何千もの反復を実行しようとしているため、どちらのソリューションも最適ではありません。単純なループ (上に示したように) は 2 つの制限がありますがうまく機能します。そして、メソッド内の 1 つの失敗test_<...>
がテスト全体に失敗します。
質問
私は初期の失敗に耐えることができますが、成功時に何千行もの出力を作成せずに、失敗を引き起こす入力に到達するにはどうすればよいでしょうか?
無回答
assert...
メソッドkwargを試してみmsg
ましたが、実際には、ライブラリが既に適切に処理しているような些細なケースでのみうまく機能します。上記の例では、unittestlong
は、アサーションの失敗の原因となった 2 つの を表示することを知っています。これに注釈を付けて、`self.assertGreater(curr, self.prev, msg="cycle %s" % cycle) で失敗について多くの洞察を提供できますが、assertDictEquals で深くネストされた dict を表示するのは面倒です。
望ましい解決策
この回答は logging モジュールの興味深い使用法を示していますが、成功したテストごとに数千行の出力が生成されます。テストメソッド内から障害を検出することは可能ですか? 何かのようなもの:
def test_always_bigger(self):
for cycle in xrange(1000):
curr = next(self.gen)
fail = self.assertGreater(curr, self.prev)
if fail:
log.debug('...')
self.prev = curr