单个测试通过批量运行失败:KeyenceExport类列表属性数据污染
测试间sequence_numbers数据污染的原因分析
这大概率是类静态属性复用或者实例属性初始化错误导致的,以下是具体场景和解决办法:
1. 最常见原因:sequence_numbers是类级静态属性
如果KeyenceExport中的sequence_numbers被声明为static,那么它属于类本身而非实例——不管你new多少个KeyenceExport对象,所有实例都会共享同一个列表内存地址。第一个测试往列表里添加的数据,会一直保留到第二个测试执行,自然会出现在新实例的sequence_numbers中。
错误代码示例:
public class KeyenceExport : IExport { // 静态属性导致所有实例共享 public static List<int> sequence_numbers = new List<int>(); }
2. 初始化逻辑错误:复用外部共享列表
如果sequence_numbers在构造时没有创建新的列表实例,而是引用了一个外部的共享集合(比如类外的静态列表、全局变量),同样会导致不同实例复用同一数据。
错误代码示例:
// 外部定义的共享列表 private static readonly List<int> _globalSequenceList = new List<int>(); public class KeyenceExport : IExport { public List<int> sequence_numbers; public KeyenceExport() { // 直接引用共享列表,而非创建新实例 sequence_numbers = _globalSequenceList; } }
解决办法
- 移除
sequence_numbers的static修饰符,将其改为实例属性; - 在KeyenceExport的构造函数中,每次实例化都创建新的列表,确保每个实例拥有独立的集合:
public class KeyenceExport : IExport { public List<int> sequence_numbers; public KeyenceExport() { // 每次实例化都初始化新列表 sequence_numbers = new List<int>(); } }
- 如果必须复用外部数据,在构造时创建列表的副本(比如
sequence_numbers = new List<int>(_globalSequenceList)),避免直接引用原集合。
内容的提问来源于stack exchange,提问作者Jeffrey Whitney
相关产品推荐
相关产品推荐

