如何在CollectionPerAssembly测试模式下使用ICollectionFixture?
实现方案
你使用CollectionBehavior.CollectionPerAssembly配置时,xUnit会自动将当前程序集内所有测试归到同一个默认测试集合中,完全不需要自定义[CollectionDefinition]类,按以下步骤操作即可实现程序集级别的实例共享:
- 保留你现有的程序集级集合行为配置:
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly, DisableTestParallelization = true)]
- 在同一程序集级别,直接注册你要共享的Fixture类型:
// 直接给全局默认测试集合注册共享实例,无需定义CollectionDefinition [assembly: CollectionFixture(typeof(MySingleton))]
- 编写你的共享实例类,xUnit会自动管理其生命周期:整个程序集运行期间只会初始化一次,所有测试执行完毕后自动销毁:
public class MySingleton : IDisposable { public MySingleton() { // 全局仅执行一次的初始化逻辑 } public void Dispose() { // 所有测试跑完后仅执行一次的清理逻辑 } }
- 测试类直接通过构造函数注入即可拿到全局唯一实例,所有测试类获取到的都是同一个对象:
public class TestDemo1 { private readonly MySingleton _sharedInstance; public TestDemo1(MySingleton sharedInstance) { _sharedInstance = sharedInstance; } [Fact] public void Test1() { // 直接使用共享实例 } } // 其他测试类注入的也是同一个实例 public class TestDemo2 { private readonly MySingleton _sharedInstance; public TestDemo2(MySingleton sharedInstance) { _sharedInstance = sharedInstance; } }
补充说明
- 如果需要同时共享多个不同类型的全局实例,多加几个
[assembly: CollectionFixture(typeof(你的Fixture类型))]标注即可。 - 该方案和你配置的
DisableTestParallelization = true完全匹配,整个程序集的测试串行执行,不会出现共享实例的线程安全问题。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

