【发布时间】:2019-12-06 06:39:00
【问题描述】:
我们使用 xUnit 和 Microsoft.AspNetCore.TestHost.TestServer 设置了集成测试,以针对在 ASP.NET Core 2.2 上运行的 Web API 运行测试。
我们的 Web API 是一个单一的代码库,可以根据一些配置或应用程序设置差异(例如 country、currency 等)单独部署多次。
下图试图解释我们的部署设置:
我们希望确保我们的集成测试针对所有部署运行。
对于这两种部署,X 和 X` API 端点、请求和响应绝对相同。因此,我们希望避免在每次部署的集成测试中重复自己。
这是解释我们当前测试设置的示例代码:
TestStartup.cs
public class TestStartup : IStartup
{
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", false)
.AddEnvironmentVariables()
.Build();
services.AddMvc()
.SetCompatibilityVersion(version: CompatibilityVersion.Version_2_2);
// Code to add required services based on configuration
return services.BuildServiceProvider();
}
public void Configure(IApplicationBuilder app)
{
app.UseMvc();
// Code to configure test Startup
}
}
TestServerFixture.cs
public class TestServerFixture
{
public TestServerFixture()
{
var builder = new WebHostBuilder().ConfigureServices(services =>
{
services.AddSingleton<IStartup>(new TestStartup());
});
var server = new TestServer(builder);
Client = server.CreateClient();
}
public HttpClient Client { get; private set; }
}
MyTest.cs
public class MyTest : IClassFixture<TestServerFixture>
{
private readonly TestServerFixture _fixture;
public MyTest(TestServerFixture fixture)
{
_fixture = fixture;
}
[Fact]
public void ItShouldExecuteTwice_AgainstTwoSeparateConfigurations()
{
//...
}
}
现在,我希望在 MyTest 类中针对两个不同的配置/应用设置或换句话说针对 Visual Studio 中的两个不同的测试部署多次运行 ItShouldExecuteTwice_AgainstTwoSeparateConfigurations 测试。
我知道,我应该能够使用构建配置(如
DEBUG_SETTING1、DEBUG_SETTING2)和预处理器指令(#if DEBUG_SETTING1)的组合来实现这一点。另一种选择可能是拥有一个包含常用方法的基本测试帮助程序项目,并为每个部署创建一个单独的集成项目。
有没有更好更优雅的方法来实现这一点?
【问题讨论】:
-
通过配置,您的意思是 1) 构建配置,如发布与调试? 2)或运行时的配置文件 3)或预处理器宏? #1 和 #2 只是编译时,你需要不同的程序集。此外,#3 不受欢迎,您应该首先考虑编写多个测试或重构代码以避免需要。
-
@TanveerBadar 我已经用更多信息更新了这个问题。希望它更清楚。我也很惊讶为什么我投了反对票,这个问题不是很好吗? downvoter 可以解释如何改进这个问题吗?
-
我没有否决你的问题,但你永远不认识人。这取决于遇到它的人的心情。在我上面的评论中还发现了一个错字,它应该是“#1 and #3 are compile time”。
-
我明白这一点。感谢您的澄清。我只是不知道我可以做些什么来解释我的问题。
-
您的部署管道设置如何?为什么不通过触发它作为部署脚本的一部分来运行具有不同设置的测试呢?我相信在 CI/CD 级别,您可以决定需要进行哪些部署。然后为每个部署运行集成测试也很有意义。因此,只需在您的部署设置中运行一个新任务,该任务将为给定部署设置环境变量并运行测试。对每个部署重复此操作。这样,当有不同设置的新部署时,您无需更改测试代码。
标签: c# asp.net-core .net-core integration-testing xunit