集成测试

集成测试可在包含应用支持基础结构(如数据库、文件系统和网络)的级别上确保应用组件功能正常

单元测试关注是的软件最小可执行单元是否能够正常执行,但软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在开发时仅仅确保最小单元的正确往往不够,为了保证软件能够正确运行,单元与单元之间的集成测试是非常必要。

与单元测试相比,集成测试可在更广泛的级别上评估应用的组件。 单元测试用于测试独立软件组件,如单独的类方法。 集成测试确认两个或更多应用组件一起工作以生成预期结果,可能包括完整处理请求所需的每个组件。

TestServer

使用TestServer测试API接口

  1. protected TestServer CreateSingleTestServer()
  2. {
  3. if (testServer == null)
  4. {
  5. lock (singleton_Lock)
  6. {
  7. if (testServer == null)
  8. {
  9. string path = Assembly.GetAssembly(typeof(TestBase)).Location;
  10. IWebHostBuilder hostBuilder =
  11. new WebHostBuilder()
  12. .UseContentRoot(Path.GetDirectoryName(path))
  13. .ConfigureAppConfiguration(cb =>
  14. {
  15. cb.AddJsonFile("appsettings.test.json", true, true);
  16. })
  17. .UseEnvironment("Development")
  18. .UseStartup<TestStartup>();
  19. testServer = new TestServer(hostBuilder);
  20. }
  21. }
  22. }
  23. return testServer;
  24. }
  25. public class TestStartup : Startup
  26. {
  27. public TestStartup(
  28. IConfiguration configuration,
  29. IHostingEnvironment env) : base(configuration, env)
  30. {
  31. if debug
  32. string connectionString =
  33. Configuration.GetSection("Database:ConnectString").Value;
  34. testDbContext =
  35. new ApplicationDbContext(new DbContextOptionsBuilder<ApplicationDbContext>()
  36. .UseSqlServer(connectionString)
  37. .Options);
  38. endif
  39. }
  40. }
  41. }
  1. [TestClass]
  2. [TestCategory("integration")]
  3. public class ApiTest : TestBase
  4. {
  5. private HttpClient client;
  6. [TestInitialize]
  7. public void Init()
  8. {
  9. client = testServer.CreateClient();
  10. }
  11. [TestCleanup]
  12. public void Cleanup()
  13. {
  14. client.Dispose();
  15. }
  16. [TestMethod]
  17. public async Task GetAsync()
  18. {
  19. var response =
  20. await client.GetAsync($"/api/values");
  21. Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
  22. }
  23. }

参考: