2017-05-04 2 views
0

テストに重大な変更を加えずに一連のテストのカスタムロガーを作成したいとします。私はテストメソッドに渡すことができる什器のようなものを使用したいと思います。そして、テストの全期間中、stdoutとstderrをキャプチャしてそれをカスタムメッセージに変更する間、フィクスチャはバックグラウンドで実行されます。これはどうすればできますか?私が欲しいものバックグラウンドで実行されるフィクスチャを使用してpythonでstdoutとstderrをキャプチャする方法

def test_1(): 
    blah 
    blah 
    print('Some msg') 
    blah 
    assert something, assert_msg 

Output: 
Some msg (if assert fails, then assertion error too) 

はあなたがsys.stdoutprintのいずれかを再定義することなく、モジュール内からの標準出力をキャプチャすることはできません

@fixture 
def logger(): 
    capture stdout, stderr 
    custom_msg = cust_msg(stdout, stderr) 
    print(custom_msg) 


def test_1(logger): 
    blah 
    blah 
    print('Some msg') 
    blah 
    assert something, assert_msg 

Output: 
Custom msg (if assert fails, then custom assertion error too) 

答えて

0

です。既に関数であるため、印刷の再定義が容易です。そして、失敗したassertをキャッチするには、ちょうどAssertionErrorをキャッチします。

import functools 
import sys 

def fixture(f): 
    old_print = print 
    @functools.wraps(f) 
    def wrapped(*args, **kwargs): 
     global print 
     def print(*value, sep=' ', end='\n', file=sys.stdout, flush=False): 
      msg = sep.join(map(str, value)) + end 

      # Manipulate msg here 

      file.write(manipulated) 
      if flush: 
       file.flush() 
     try: 
      return f(*args, **kwargs) 
     except AssertionError as e: 

      # Custom message on failed assertion 
      msg = e.args[0] if len(e.args) == 1 else None 
      old_print(manipulated) 

     finally: 
      print = old_print 
    return wrapped 

しかし、assertは実際にはあまり有益な情報を提供しません。 unittestのような実際のテストライブラリを使用します。

代わりに、サブプロセスとして実行することもできます。

関連する問題