【发布时间】:2016-01-06 02:21:15
【问题描述】:
我正在编写一段 python 代码,它将格式化文件解析为 python 对象。该文件可能会有所不同,但目前我正在根据文件可能的一个子集进行工作,并希望测试可以帮助我为所有这些文件扩展它。
文件本身由一个包含元数据的标头组成,后跟几个数据块。
[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]
目前我的代码大致如下
with datafile as 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)
其中每个 parse*(file) 函数调用 file.readline() 多次,具体取决于指定数据长度的大小。
理想情况下,我将至少进行 5 次单独的测试,在其中我提供文件的虚假部分并查看它是否正确获取信息。除了在这种情况下,数据部分非常大(兆字节)。
是否可以编写类似于以下内容的测试?
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() is left of from 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() is left of from 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() is left of from test_header2_parse
result = parse_data1(datafile, self.data1_len)
expected = ...
assertIsEqual(result, expected)
def test_data2_parse(self):
# datafile.seek() is left of from test_data1_parse
result = parse_data2(datafile, self.data2_len)
expected = ...
assertIsEqual(result, expected)
# Some code to force the tests to run sequentially as laid out above
如您所见,我正在尝试编写五个单独的测试,如果将来出现问题,它们有望单独失败。但是,如果不事先运行 parse_gen_header 和 parse_header1,我将无法测试 parse_header2。
不确定是否有更好的方法来解决这个问题。
【问题讨论】:
-
您可以更改数据文件格式以方便测试,还是由其他人/其他人确定,您必须调整代码来适应它?因为我真的建议在文件正文中引入一些标准标志来表示标题/数据块的开始和结束,但是在你的情况下这可能是不可能的。
-
它是一个可执行程序的输出,更具体地说,它是一个格式化的中子截面数据文件,其中数据格式取决于几个物理事物(同位素、迁移态、可用测量值)。
标签: python file unit-testing testing automated-tests