writing a pytest function to check outputting to a file in python?
Question:
I asked this question about how to write a pytest to check output in stdout
and got a solution. Now I need to write a test case
, to check if the contents are written to the file and that the contents are written as expected
eg:
def writetoafile():
file = open("output.txt",w)
file.write("hellon")
file.write("worldn")
file.close()
now a pytest function to check if it written:
def test_writeToFile():
file = open("ouput.txt",'r')
expected = "hellonworldn"
assert expected==file.read()
while this seems to work, I do not think this is ideal, especially hard-coding. how are these kind of test functions
of writing to a file usually written?
Answers:
There is the tmpdir fixture which will create you a per-test temporary directory. So a test would look something like this:
def writetoafile(fname):
with open(fname, 'w') as fp:
fp.write('Hellon')
def test_writetofile(tmpdir):
file = tmpdir.join('output.txt')
writetoafile(file.strpath) # or use str(file)
assert file.read() == 'Hellon'
Here you’re refactoring the code to not be hardcoded either, which is a prime example of how testing your code makes you design it better.
Suppose you have this “amazing” piece of software in a file called 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.")
To test the write_to_file
method, you can write something like this in a file in the same folder called 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")
I always try to avoid writing files to disk, even if it’s a temporary folder dedicated to my tests: not actually touching the disk makes your tests much faster, especially if you interact with files a lot in your code.
I asked this question about how to write a pytest to check output in stdout
and got a solution. Now I need to write a test case
, to check if the contents are written to the file and that the contents are written as expected
eg:
def writetoafile():
file = open("output.txt",w)
file.write("hellon")
file.write("worldn")
file.close()
now a pytest function to check if it written:
def test_writeToFile():
file = open("ouput.txt",'r')
expected = "hellonworldn"
assert expected==file.read()
while this seems to work, I do not think this is ideal, especially hard-coding. how are these kind of test functions
of writing to a file usually written?
There is the tmpdir fixture which will create you a per-test temporary directory. So a test would look something like this:
def writetoafile(fname):
with open(fname, 'w') as fp:
fp.write('Hellon')
def test_writetofile(tmpdir):
file = tmpdir.join('output.txt')
writetoafile(file.strpath) # or use str(file)
assert file.read() == 'Hellon'
Here you’re refactoring the code to not be hardcoded either, which is a prime example of how testing your code makes you design it better.
Suppose you have this “amazing” piece of software in a file called 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.")
To test the write_to_file
method, you can write something like this in a file in the same folder called 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")
I always try to avoid writing files to disk, even if it’s a temporary folder dedicated to my tests: not actually touching the disk makes your tests much faster, especially if you interact with files a lot in your code.