stdoutに書き込む約500行のPythonプログラムがあります(printステートメントを使用)。ここで、いくつかの変更を加えてプログラムのリファクタリングを実行したいと思いますが、その過程で、同じ出力(もちろん、同じ入力が与えられた場合)を取得し続けることを確認したいと思います。
print
現在の-ingの代わりに文字列を返すように関数を書き直さずに(テストを簡単にするために)、そうするための良い戦略は何でしょうか?
(変更を開始する前に)初期出力をテキストファイルにリダイレクトすることを考えました。次に、変更したプログラムの出力をテキストファイルで簡単かつ自動的に確認するにはどうすればよいですか(その出力を一時的なテキストファイルに再度リダイレクトしてファイルを比較することなく)?
編集:これは私が決めた解決策です:
def test_something():
# using lambda because we might test function with parameters
f = lambda: thing_to_test
test_generic('expect_output.txt', f)
def test_generic(filename_expected, function_to_test):
#Run and write to tmp file
tmpfile = 'test-tmp.txt'
sys.stdout = open(tmpfile, 'w')
function_to_test()
sys.stdout = sys.__stdout__
#compare with expected output
expected = open(filename_expected).read()
result = open(tmpfile).read()
d = difflib.Differ()
diff = d.compare(expected.splitlines(), result.splitlines())
#print result (different lines only)
diff_lines_only = [line for line in diff if line[0] in "+-?"]
if not diff_lines_only:
print "Test succeeded (%s)\n" % filename_expected
os.remove(tmpfile)
else:
print "Test FAILED (%s):\n" % filename_expected
print '\n'.join(list(diff_lines))
編集2:実際、私doctest
が以下の答えとして提供した解決策ははるかに優れていると思います。