python - Writing tests for file parser functions in a modular way -
i writing piece of python code parses formatted file python object. file can vary, i'm working based off subset of file , hoping tests can me extend of these files.
the file consists of header containing metadata, followed several data blocks.
[general header, describes length of header 1 & header 2] [header describing data block 1] [header describing data block 2] [data block 1] [data block 2] currently code outlined in following way
with datafile open(filename, 'r'): gen_header_obj = parse_gen_header(datafile) header1_obj = parse_header1(datafile, gen_header_obj.header1_len) header2_obj = parse_header2(datafile, gen_header_obj.header2_len) data1_obj = parse_data1(datafile, header1_obj.datalen) data2_obj = parse_data2(datafile, header2_obj.datalen) where each parse*(file) function calls file.readline() several times, depending on size of specified data length.
ideally have @ least 5 separate tests, provide fake portion of file , sees if gets information correctly. except in case portions of data quite large (megabytes).
would possible write tests resemble following?
class testparser(unittest.testcase) filename = 'locally_stored_file.txt' def setup(self): self.file = open(filename, 'r') def teardown(self): self.file.close() def test_gen_header_parse(self): result = parse_gen_header(datafile) self.header1_len = result.header1_len self.header2_len = result.header2_len expected = ... assertisequal(result, expected) def test_header1_parse(self): # datafile.seek() left of test_gen_header_parse result = parse_header1(datafile, self.header1_len) self.data1_len = result.data1_len expected = ... assertisequal(result, expected) def test_header2_parse(self): # datafile.seek() left of test_header1_parse result = parse_header2(datafile, self.header2_len) self.data2_len = result.data2_len expected = ... assertisequal(result, expected) def test_data1_parse(self): # datafile.seek() left of test_header2_parse result = parse_data1(datafile, self.data1_len) expected = ... assertisequal(result, expected) def test_data2_parse(self): # datafile.seek() left of test_data1_parse result = parse_data2(datafile, self.data2_len) expected = ... assertisequal(result, expected) # code force tests run sequentially laid out above as can see i'm trying write 5 seperate tests, fail individually if breaks in future. i'm not able test parse_header2 without running parse_gen_header , parse_header1 beforehand.
not sure if there's better way approach this.
it better if declare lengths before hand , use seek function move file pointer appropriately each test. can use expected lengths , test those
class testparser(unittest.testcase) filename = 'locally_stored_file.txt' expected_gen_header_length = 42 # correct number should expected_header1_length = 42 # correct number should # , lengths of other things def test_gen_header_parse(self): datafile = open(filename, 'r'): result, len_header = parse_gen_header(datafile) # output len_header if want assert self.header1_len = result.header1_len self.header2_len = result.header2_len expected = ... assertisequal(self.expected_gen_header_length, len_gen_header) assertisequal(result, expected) def test_header1_parse(self): datafile = open(filename, 'r'): # force datafile.seek() begin after gen_header datafile.seek(self.expected_gen_header_length) result = parse_header1(datafile, self.expected_header1_length) self.data1_len = result.data1_len expected = ... assertisequal(result, expected) # , on ....
Comments
Post a Comment