问题 使用HttpServer或HttpSelfHostServer对Web API进行单元测试


我正在尝试为Web API项目进行一些单元测试。我要模拟Web API托管环境。好像我可以使用内存主机(HttpServer)或自主机(HttpSelfHostServer)。

只是想知道有什么区别,哪种技术对什么有好处,并且对这些选项有任何限制。


4196
2018-02-05 00:18


起源



答案:


您应该在内存主机中使用端到端测试,然后单独测试环境的网络连接。

出于多种原因:

  • 在内存主机中,顾名思义,完全在内存中运行,因此会更快

  • 自托管需要以提升的权限运行,因此您的测试需要在“管理员”身份的上下文中执行。这远非期望。如果你想从构建脚本或PowerShell执行测试,这尤其麻烦,因为这些进程也必须以提升的权限启动。此外,这必须在您测试的任何服务器上进行。

  • 在自托管中,您最终会测试给定操作系统的网络堆栈,这实际上是不应该测试的 - 因为它可能在不同的环境(开发,登台,QA,生产等)之间有所不同。例如 - 给定端口可能不可用。因此,您可能会被拖入不同机器的不必要的调试工作,甚至可以运行测试。

  • 最后,使用自托管进行测试仍然无法保证服务在Web托管时能够正常运行,反之亦然 - 所以你不妨在内存中进行测试


12
2018-02-05 00:45



您始终无需管理员权限即可运行自托管主机。你必须添加 config.HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.Exact; 如果您在本地收听,则以非管理员身份运行。 - RaghuRam Nadiminti
是的好点 - 尽管仍然有很多痛苦 - Filip W
建议使用Owin TestServer。链接: juliencorioland.net/archives/... - Youngjae
如果您使用HttpSelfHostServer,您可以以只更改URL的方式编写测试,并且您的测试可以针对您的dev / stage服务器运行。 - tymtam


答案:


您应该在内存主机中使用端到端测试,然后单独测试环境的网络连接。

出于多种原因:

  • 在内存主机中,顾名思义,完全在内存中运行,因此会更快

  • 自托管需要以提升的权限运行,因此您的测试需要在“管理员”身份的上下文中执行。这远非期望。如果你想从构建脚本或PowerShell执行测试,这尤其麻烦,因为这些进程也必须以提升的权限启动。此外,这必须在您测试的任何服务器上进行。

  • 在自托管中,您最终会测试给定操作系统的网络堆栈,这实际上是不应该测试的 - 因为它可能在不同的环境(开发,登台,QA,生产等)之间有所不同。例如 - 给定端口可能不可用。因此,您可能会被拖入不同机器的不必要的调试工作,甚至可以运行测试。

  • 最后,使用自托管进行测试仍然无法保证服务在Web托管时能够正常运行,反之亦然 - 所以你不妨在内存中进行测试


12
2018-02-05 00:45



您始终无需管理员权限即可运行自托管主机。你必须添加 config.HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.Exact; 如果您在本地收听,则以非管理员身份运行。 - RaghuRam Nadiminti
是的好点 - 尽管仍然有很多痛苦 - Filip W
建议使用Owin TestServer。链接: juliencorioland.net/archives/... - Youngjae
如果您使用HttpSelfHostServer,您可以以只更改URL的方式编写测试,并且您的测试可以针对您的dev / stage服务器运行。 - tymtam