Pytest如何按指定位置校验文件行内文本并优化现有断言代码
实现指定位置文本校验
首先明确索引转换规则:
- Notepad++列号从1开始计数,Python字符串索引从0开始,所以第101列对应索引为
100 - 文件全局第1683个字符对应Python全局读取的字符串索引为
1682
分两种常用场景实现:
场景1:校验指定行的第101列附近文本
如果你需要校验第21行(原有代码取的[20]对应第21行)第101列开始的内容,比如要校验的123456是从该位置开始的6个字符,写法如下:
import pytest # 常量统一管理,后续修改无需调整逻辑代码 TEST_FILE = "my_file.html" TARGET_LINE_INDEX = 20 # 对应文件第21行 TARGET_COLUMN_START = 100 # 对应Notepad++第101列 EXPECTED_CONTENT = "123456" CONTENT_LENGTH = len(EXPECTED_CONTENT) def test_check_line_specific_position(): # 用with上下文管理器自动关闭文件,避免文件句柄泄漏 with open(TEST_FILE, "r", encoding="utf-8") as f: lines = f.readlines() # 边界判断:避免文件行数不足导致报错 assert len(lines) > TARGET_LINE_INDEX, f"文件不足{TARGET_LINE_INDEX+1}行,无法完成校验" target_line = lines[TARGET_LINE_INDEX] # 边界判断:避免目标行长度不足导致报错 assert len(target_line) >= TARGET_COLUMN_START + CONTENT_LENGTH, f"目标行长度不足,无法校验第{TARGET_COLUMN_START+1}列内容" # 截取指定位置内容做精准校验 actual_content = target_line[TARGET_COLUMN_START:TARGET_COLUMN_START+CONTENT_LENGTH] assert actual_content == EXPECTED_CONTENT, f"校验失败,预期内容为{EXPECTED_CONTENT},实际内容为{actual_content}"
场景2:校验文件全局第1683个字符位置的文本
如果要按全局字符位置校验,直接读取整个文件内容后截取对应位置即可:
import pytest TEST_FILE = "my_file.html" GLOBAL_POSITION_START = 1682 # 对应全局第1683个字符 EXPECTED_CONTENT = "123456" CONTENT_LENGTH = len(EXPECTED_CONTENT) def test_check_global_specific_position(): with open(TEST_FILE, "r", encoding="utf-8") as f: content = f.read() # 边界判断:避免文件总长度不足导致报错 assert len(content) >= GLOBAL_POSITION_START + CONTENT_LENGTH, f"文件总长度不足,无法校验全局第{GLOBAL_POSITION_START+1}个字符位置的内容" actual_content = content[GLOBAL_POSITION_START:GLOBAL_POSITION_START+CONTENT_LENGTH] assert actual_content == EXPECTED_CONTENT, f"校验失败,预期内容为{EXPECTED_CONTENT},实际内容为{actual_content}"
原有代码优化点
- 使用
with上下文管理器打开文件:原有代码直接调用open后没有手动关闭文件,会造成文件句柄泄漏,with会在代码块执行结束后自动关闭文件 - 增加边界判断:原有代码直接取
readlines()[20],如果文件不足21行会直接抛出索引错误,无法得到友好的测试失败提示 - 增加断言自定义提示:原有代码断言失败只会显示
AssertionError,加上自定义提示可以快速定位失败原因 - 硬编码内容抽离为常量:把文件名、行号、预期内容这些固定参数抽为常量,后续修改时不需要改动逻辑代码
- 显式指定文件编码:打开文件时指定
encoding参数,避免不同系统默认编码不一致导致读取出错
内容的提问来源于stack exchange,提问作者trr10
相关产品推荐
相关产品推荐

