2013-12-11 31 views
8

私はthisstdoutの出力をチェックするpytestを書く方法について質問し、解決策を得ました。それが書かれているかどうかを確認するためにPythonでファイルへの出力をチェックするpytest関数を記述していますか?

def writetoafile(): 
    file = open("output.txt",w) 
    file.write("hello\n") 
    file.write("world\n") 
    file.close() 

今pytest機能:

def test_writeToFile(): 
    file = open("ouput.txt",'r') 
    expected = "hello\nworld\n" 
    assert expected==file.read() 
今、私は内容がファイルに書き込まれた内容が期待 などのように書かれていることをされているかどうかを確認するために、 test caseを作成する必要があります

これはうまくいくと思われますが、これは理想的ではないと思います。特にハードコーディングです。どのようにこれらの種類のファイルに通常書かれたtest functions書かれていますか?

+0

なぜこれは理想的ではないでしょうか?あなたは内容が期待どおりに書かれているかチェックしたいと書いていますので、ファイルを調べてチェックするのが最善の選択肢です。一連のランダムな文字で変数を作成し、それが正常に書き込まれたかどうかを確認することができます。 "file.read()"でデータが追加されたかどうかを調べることができます(ただし、フラグ 'w'を使用すると、ここで悪いテストになります)。あなたが何かをテストしたいのですが?おそらく、あなたが望むものを知っていることは、ほとんどのテストのように、ここで真の問題です。 –

答えて

12

tmpdir fixtureがあり、テストごとの一時ディレクトリが作成されます。

def writetoafile(fname): 
    with open(fname, 'w') as fp: 
     fp.write('Hello\n') 

def test_writetofile(tmpdir): 
    file = tmpdir.join('output.txt') 
    writetoafile(file.strpath) # or use str(file) 
    assert file.read() == 'Hello\n' 

ここでは、あなたのコードをテストすることは、あなたがより良い、それを設計作る方法の典型的な例である、いずれかのハードコードされないようにコードをリファクタリングしている:だからテストは、次のようになります。

+0

tmpdirは何をしますか?それは実際にメモリにファイルを作成するのですか? –

+1

それはあなたが後で調べることができる実際のディレクトリを作成します。UNIXの場合、通常は '/ tmp/pytest-xxxx'で見つけることができます。 fixturesについては、 'py.test --fixtures'を呼び出すことによっていつでも知ることができ、tmpdirの場合は、詳細についてはhttp://pytest.org/latest/tmpdir.htmlを参照してください。 – flub

関連する問題