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

Popular posts from this blog

how to insert data php javascript mysql with multiple array session 2 -

multithreading - Exception in Application constructor -

windows - CertCreateCertificateContext returns CRYPT_E_ASN1_BADTAG / 8009310b -