如何使用Pytest创建临时CSV文件,用于测试CSV解析代码?
使用Pytest创建虚拟CSV文件进行测试的方案
我编写了一段可根据传入ID号解析CSV文件特定值的代码,现在需要开展测试工作,希望使用Pytest创建虚拟CSV数据文件,以下是我写的部分代码(存在一些待修正的问题):
import pytest import csv @pytest.fixture def client(): return Client('FOO, BAR', 98763, 1986, '08/19/91', 'MALE') @pytest.fixture(scope='session') def file_name(tmpdir_factory): fn = tmpdir_factory.mktemp('data'.join('csvNg.csv')) headers = ['NAME','PN','MRN','DOB','GENDER'] with open(fn,'w') as csvfile: writer = csv.Dict(csvfile,fieldnames=heade...
修正后的完整Fixture实现
针对代码里的问题(比如临时文件路径创建错误、CSV写入器使用不当),我帮你完善了可直接使用的版本:
import pytest import csv # 假设你的Client类定义如下(如果没定义需要补充) class Client: def __init__(self, name, pn, mrn, dob, gender): self.NAME = name self.PN = pn self.MRN = mrn self.DOB = dob self.GENDER = gender @pytest.fixture def client(): return Client('FOO, BAR', 98763, 1986, '08/19/91', 'MALE') @pytest.fixture(scope='session') def test_csv_file(tmpdir_factory): # 先创建临时目录,再在目录内生成CSV文件 temp_directory = tmpdir_factory.mktemp('test_data') csv_file_path = temp_directory.join('csvNg.csv') # 定义CSV表头和测试数据 csv_headers = ['NAME', 'PN', 'MRN', 'DOB', 'GENDER'] test_records = [ {'NAME': 'FOO, BAR', 'PN': 98763, 'MRN': 1986, 'DOB': '08/19/91', 'GENDER': 'MALE'}, {'NAME': 'Jane Smith', 'PN': 54321, 'MRN': 4567, 'DOB': '03/15/88', 'GENDER': 'FEMALE'}, {'NAME': 'John Doe', 'PN': 99999, 'MRN': 1111, 'DOB': '12/31/95', 'GENDER': 'MALE'} ] # 写入CSV内容,注意newline=''避免跨平台换行问题 with open(csv_file_path, 'w', newline='') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=csv_headers) writer.writeheader() # 写入表头 writer.writerows(test_records) # 写入所有测试数据 # 返回文件的字符串路径,供测试函数调用 return str(csv_file_path)
如何在测试中使用这个Fixture
你可以在测试函数里引入test_csv_file和client fixture,来验证你的CSV解析逻辑:
def test_parse_csv_by_id(test_csv_file, client): # 这里替换成你自己的CSV解析函数,传入文件路径和要查询的ID(比如MRN) parsed_client_data = your_csv_parser(test_csv_file, client.MRN) # 断言解析结果与预期一致 assert parsed_client_data['NAME'] == client.NAME assert parsed_client_data['PN'] == client.PN assert parsed_client_data['DOB'] == client.DOB
几个关键注意点
scope='session':这个fixture只会在整个测试会话开始时创建一次,避免重复生成文件,提升测试效率newline='':这是Python写入CSV文件的最佳实践,能避免Windows和Linux系统下的换行符不一致问题- 多测试数据:你可以在
test_records里添加更多条目,覆盖边界情况(比如特殊字符、空值等)
内容的提问来源于stack exchange,提问作者user8128927
相关产品推荐
相关产品推荐

