运行测试时如何实现整数自增解决数据库插入测试唯一名称冲突问题
可行解决办法
- 方案1:使用全局唯一标识符(GUID)拼接名称,完全避免重复
该方案不依赖变量持久化,每次运行生成的GUID唯一,不会出现name重复问题,修改后代码如下:
public async Task CanCreateStringSignal() { // 生成无横杠格式的唯一后缀拼接到名称中 string uniqueName = $"Signal_{Guid.NewGuid():N}"; var s = new SignalsDTO() { Name = uniqueName, TagType = "String", Description = "Foo" }; var idReturn = await _handler.Create(s); var signal = await _handler.GetSignalsByName(uniqueName); Assert.IsNotNull(signal); Assert.IsInstanceOfType(signal, typeof(SignalsDTO)); Assert.AreEqual(uniqueName, signal.Name); Assert.AreEqual(idReturn, signal.IDTag); }
- 方案2:测试执行完成后清理测试数据
在测试的收尾逻辑(如xUnit的Dispose方法、NUnit的[TearDown]标记方法)中删除本次插入的测试数据,保证每次测试运行前数据库表中无残留的同名数据:
// 示例为xUnit测试类的清理逻辑 public class SignalTest : IDisposable { private SignalsDTO _testSignal; // 其余初始化逻辑省略 public async Task CanCreateStringSignal() { var s = new SignalsDTO() { Name = "Signal", TagType = "String", Description = "Foo" }; var idReturn = await _handler.Create(s); _testSignal = s; var signal = await _handler.GetSignalsByName("Signal"); Assert.IsNotNull(signal); Assert.IsInstanceOfType(signal, typeof(SignalsDTO)); Assert.AreEqual("Signal", signal.Name); Assert.AreEqual(idReturn, signal.IDTag); } public async void Dispose() { // 测试结束后删除插入的测试数据 if (_testSignal != null) { await _handler.Delete(_testSignal.IDTag); } } }
- 方案3:使用静态自增变量
如果你的测试是在同一个进程内多次运行,把自增变量定义为静态即可避免每次运行被重置:
// 定义为类的静态字段 private static int _signalIndex = 0; public async Task CanCreateStringSignal() { // 线程安全的自增操作 string uniqueName = $"Signal_{Interlocked.Increment(ref _signalIndex)}"; var s = new SignalsDTO() { Name = uniqueName, TagType = "String", Description = "Foo" }; var idReturn = await _handler.Create(s); var signal = await _handler.GetSignalsByName(uniqueName); Assert.IsNotNull(signal); Assert.IsInstanceOfType(signal, typeof(SignalsDTO)); Assert.AreEqual(uniqueName, signal.Name); Assert.AreEqual(idReturn, signal.IDTag); }
注:如果每次测试都会启动独立进程,该方案的静态变量仍会被重置,建议搭配数据清理逻辑使用
优先推荐方案1和方案2组合使用,既保证单次运行无重复,也不会在数据库中残留大量测试垃圾数据。
内容的提问来源于stack exchange,提问作者Weenhallo
相关产品推荐
相关产品推荐

