使用C#泛型和方法链接排列测试种子数据
我是一个有点编码经验的测试人员。我必须编写一堆自动化测试,测试现有的遗留业务层。大约有1000个业务逻辑类,大致分为30个逻辑模块,尽管业务类可以被任何模块的业务逻辑引用,而不仅仅是它们自己的模块 系统的数据库(SQL Server)包含约800个表,并使用SQL脚本进行定义和更新。对于测试,我使用的是完整数据库的备份、还原和截断版本,我将其加载为测试的空LocalDB。然后,我为LocalDB植入测试中涉及的每个业务类所需的测试数据——为此,我创建了一个新的业务类对象,并调用业务类的使用C#泛型和方法链接排列测试种子数据,c#,generics,method-chaining,test-data,C#,Generics,Method Chaining,Test Data,我是一个有点编码经验的测试人员。我必须编写一堆自动化测试,测试现有的遗留业务层。大约有1000个业务逻辑类,大致分为30个逻辑模块,尽管业务类可以被任何模块的业务逻辑引用,而不仅仅是它们自己的模块 系统的数据库(SQL Server)包含约800个表,并使用SQL脚本进行定义和更新。对于测试,我使用的是完整数据库的备份、还原和截断版本,我将其加载为测试的空LocalDB。然后,我为LocalDB植入测试中涉及的每个业务类所需的测试数据——为此,我创建了一个新的业务类对象,并调用业务类的DoSav
DoSave()
函数
可以理解,一些业务类在测试中会非常频繁地使用(例如客户、合同、交付、产品、价格等)。因此,我想创建一个TestData类,在其中定义这些实体的良好示例列表,并根据需要在测试中重用它们
我还希望能够利用方法链接,使我自己和其他测试人员能够从每个类的记录列表中找到并加载我们所针对的特定实体。最后,我正在寻找一种使用泛型实现这一点的方法,这样我就可以使用泛型代码实现数据种子设定
因此,我尝试了两种类似的方法来实现这一点,但我找不到解决某些问题的方法。我甚至不确定这是否可能,但我觉得应该是这样
一个简化的测试用例看起来像这样。调用DataBuilder()
是为了指示代码返回定义的记录。但是我希望通过泛型使用DataBuilder()
或DataBuilder()
等类似方法访问其他类的记录
using System;
using Old.System.ClientModule;
using Xunit;
namespace Old.System.Client.Tests
{
public class ClientTests
{
[Fact]
public void ClientDoSave_ShouldCreateAClient_WhenValidClientDetailsSet()
{
// Arrange
SetupLocalDBWithConnectionString(@"Server=(LocalDB)\MSSQLLocalDB;Integrated Security=true;AttachDbFileName=.\Path\To\LOCAL_DB.MDF");
var client1 = new DataBuilder<Client>().First();
var client2 = new Client();
client2.ClientId = client.ClientId;
// Act
client1.DoSave();
client2.DoRead();
// Assert
Assert.Equal(client1.ClientLongName, client2.ClientLongName);
}
}
}
使用System.Collections.Generic;
使用Old.System.ClientModule;
命名空间Old.System.Tests
{
静态类测试数据
{
公共静态列表GetRecords(客户端实体)
{
返回新列表
{
新客户端{ClientId=“12345678”,ClientShortName=“JohnJ”,ClientLongName=“John Johnson”},
新客户端{ClientId=“23456789”,ClientShortName=“PeterP”,ClientLongName=“Peter Peterson”}
};
}
公共静态列表记录(合同实体)
{
返回新列表
{
新合同{contracd=“123”},
新合同{contracd=“234”}
};
}
}
}
请忽略测试的Act和Assert的内容,以及链式方法的不合逻辑的方面——我只是将这里的内容作为我意图的指示。我的问题是基于如何在这个场景中使用泛型。对于传递到DataBuilder的类型,如何调用特定于类型的TestData.GetRecords()
非常感谢您的帮助,但我真的很想用这种模式找到解决方案,而不是求助于Key=BusinessClass
和Value=List of Records
之类的解决方案
using System.Collections.Generic;
namespace Old.System.Tests
{
public class DataBuilder<T>
{
private List<T> DataSet = new List<T>();
public DataBuilder()
{
DataSet = TestData.GetRecords<T>();
}
// i know these chained methods aren't great - they're just here for display
public List<T> All()
{
return DataSet;
}
public T First()
{
return DataSet[0];
}
// many other (proper) chained methods
}
}
using System.Collections.Generic;
using Old.System.ClientModule;
namespace Old.System.Tests
{
static class TestData
{
public static List<Client> GetRecords<Old.System.ClientModule.Client>()
{
return new List<Client>
{
new Client { ClientId = "12345678", ClientShortName = "JohnJ", ClientLongName = "John Johnson" },
new Client { ClientId = "23456789", ClientShortName = "PeterP", ClientLongName = "Peter Peterson" }
};
}
public static List<Contract> GetRecords<Old.System.ClientModule.Contract>()
{
return new List<Contract>
{
new Contract { ContractId = "123" },
new Contract { ContractId = "234" }
};
}
}
}
using System.Collections.Generic;
namespace Old.System.Tests
{
public class DataBuilder<T>
{
private List<T> DataSet = new List<T>();
public DataBuilder()
{
// DataSet = TestData.GetRecords(T);
// DataSet = TestData.GetRecords(new T());
DataSet = TestData.GetRecords(???);
}
// i know these chained methods aren't great - they're just here for display
public List<T> All()
{
return DataSet;
}
public T First()
{
return DataSet[0];
}
// many other (proper) chained methods
}
}
using System.Collections.Generic;
using Old.System.ClientModule;
namespace Old.System.Tests
{
static class TestData
{
public static List<Client> GetRecords(Client Entity)
{
return new List<Client>
{
new Client { ClientId = "12345678", ClientShortName = "JohnJ", ClientLongName = "John Johnson" },
new Client { ClientId = "23456789", ClientShortName = "PeterP", ClientLongName = "Peter Peterson" }
};
}
public static List<Contract> GetRecords(Contract Entity)
{
return new List<Contract>
{
new Contract { ContractId = "123" },
new Contract { ContractId = "234" }
};
}
}
}