Nasledujúca funkcia sa otvorí a načíta súbor Json. Moja otázka je, aký je najlepší prístup k jeho otestovaniu?
def read_file_data(filename, path):
os.chdir(path)
with open(filename, encoding="utf8") as data_file:
json_data = json.load(data_file)
return json_data
filename
a path
sa odovzdávajú ako sys.argv.
Myslel som si, že na úvod budem potrebovať ukážkové dáta v testovacom prípade, ale nie som si istý, ako ich vlastne použijem na otestovanie funkcie
class TestMyFunctions(unittest.TestCase):
def test_read_file_data(self):
sample_json = {
"name" : "John",
"shares" : 100,
"price" : 1230.23
}
Každý ukazovateľ bude ocenený.
odpovede:
0 pre odpoveď č. 1Myslím, že to, čo by ste chceli urobiť, by bolo vytvoriť súbor JSON, napevno vložiť do pamäte verziu tohto súboru JSON a presadiť medzi nimi rovnaké hodnoty.
Na základe vášho kódu:
class TestMyFunctions(unittest.TestCase):
def test_read_file_data(self):
import json
sample_json = {
"name" : "John",
"shares" : 100,
"price" : 1230.23
}
sample_json = json.dump(sample_json, ensure_ascii=False)
path = /path/to/file
filename = testcase.json
self.assertEqual(read_file_data(filename, path), sample_json)
0 pre odpoveď č. 2
Ako je uvedené vyššie, nemusíte znovu testovaťštandardný kód knižnice python funguje správne, takže vytvorením súboru s pevným kódom, ako je tiež uvedené, prekonávate bod jednotkového testu testovaním mimo jednotku kódu.
Namiesto toho by správnym prístupom bolo zosmiešnenie otvorenia súboru pomocou výsmechového rámca pythons. A tak otestujte, či vaša funkcia vracia JSON, ktorý je správne načítaný.
napr.
from unittest.mock import patch, mock_open
import json
class TestMyFunctions(unittest.TestCase):
@patch("builtins.open", new_callable=mock_open,
read_data=json.dumps({"name" : "John","shares" : 100,
"price" : 1230.23}))
def test_read_file_data(self):
expected_output = {
"name" : "John",
"shares" : 100,
"price" : 1230.23
}
filename = "example.json"
actual_output = read_file_data(filename, "example/path")
# Assert filename is file that is opened
mock_file.assert_called_with(filename)
self.assertEqual(expected_output, actual_output)