编写pytest函数来检查输出到python中的文件?

时间:2013-12-11 22:15:35

标签: python function file-io pytest

我问this有关如何编写pytest以检查stdout中的输出并获得解决方案的问题。现在我需要写一个test case,检查内容是否写入文件,内容是否按预期写入 例如:

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 functions写入文件通常是如何编写的?

2 个答案:

答案 0 :(得分:15)

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'

在这里,您重构代码也不是硬编码,这是测试代码如何让您更好地设计代码的一个主要示例。

答案 1 :(得分:0)

假设您在名为main.py的文件中拥有此“惊人”软件:

"""
main.py
"""

def write_to_file(text):
    with open("output.txt", "w") as h:
        h.write(text)

if __name__ == "__main__":
    write_to_file("Every great dream begins with a dreamer.")

要测试write_to_file方法,您可以在名为test_main.py的同一文件夹中的文件中写入如下内容:

"""
test_main.py
"""
from unittest.mock import patch, mock_open

import main


def test_do_stuff_with_file():
    open_mock = mock_open()
    with patch("main.open", open_mock, create=True):
        main.write_to_file("test-data")

    open_mock.assert_called_with("output.txt", "w")
    open_mock.return_value.write.assert_called_once_with("test-data")

即使它是专用于我的测试的临时文件夹,我也始终尝试避免将文件写入磁盘:不实际接触磁盘会使您的测试更快,尤其是当您与代码中的文件交互很多时。