我有一个客户端服务器的解决方案。客户端和服务器是同一解决方案中的项目。
我想对客户端进行单元测试,这显然要求服务器正在运行。是否有一些方法可以在单元测试项目中指定在运行特定单元测试之前应该启动服务器项目?我想我可以明确地启动程序,但我宁愿让测试基础设施为我做这件事。
我想这是一个非常普遍的要求。人们通常如何接近它? (VS2010,C#,如果重要的话。)
答案 0 :(得分:4)
Pedant点:如果需要服务器,则不是单元测试 - 它是集成测试。但这并没有改变真正的需要,但是:)
当我需要这个时,我将服务器设计为可以从任何地方的几个类中启动<(更简单,更好);然后,您可以从测试套件中启动服务器(并关闭)。然后,服务器“application”只是围绕同一组类的一个瘦shell。
当然,这取决于你在做什么。
答案 1 :(得分:3)
最好的方法是实际编写REAL单元测试。您现在正在运行的内容被视为集成测试。
真正的单元测试是系统独立且可重复的,并且应该为一个组件做出一个功能断言。系统独立我的意思是它不应该依赖于服务器,Web服务,数据库,文件资源等的运行实例...
您可以通过“模拟”服务器组件来实现此单元测试,以返回可预测的受控输出,以便测试您的客户端代码。您可以使用各种模拟框架进行抽样。
答案 2 :(得分:2)
同意,您应该编写单独测试的单元测试,但最终您需要针对具体的依赖项进行测试。要编写适用于外部进程的集成测试,有几个选项可以做到这一点。
TestRun开始/停止
在MSTest中,您可以在使用AssemblyInitializeAttribute进行任何测试之前执行常规设置初始化。请注意,方法必须是静态的。
[TestClass]
public class AssemblyTestHarness
{
[AssemblyInitialize]
public static void InitializeAssembly(TestContext context)
{
// start process here
}
[AssemblyCleanup]
public static void CleanupAssembly(TestContext context)
{
// clean-up process here
}
}
测试夹具开始/停止
如果您需要在一系列测试之间启动和停止服务,您可以在夹具初始化和清理时启动和停止服务。
[TestClass]
public class MyTestFixture
{
[ClassInitialize]
public static void InitializeFixture(TestContext context)
{
// start process here
}
[ClassCleanup]
public static void CleanupFixture(TestContext context)
{
// clean-up process here
}
}
答案 3 :(得分:1)
运行服务器并不是完全必要的。事实上,最好不要让它运行(你最终会测试网络以及你的应用程序)。
另一种方法是使用模拟框架,如MoQ或RhinoMock。您可以使用这些框架有效地存根您的服务器,并使它们只返回您希望它们返回的内容,而不是为您的服务器应用程序提供一系列模糊的仅测试参数。
答案 4 :(得分:1)
没有。那不是单元测试。你不应该通过单元测试来测试客户端到服务器。为了做到这一点,你需要模拟服务器在单元测试中返回的内容。这是“单元测试”客户端服务器代码的方法。
答案 5 :(得分:0)
你应该使用隔离框架将服务器作为Moq / RhinoMock或者你喜欢的东西存根。单元测试不应该依赖于启动/运行某些东西:可能你将使用集成中的真实服务器组件测试客户端测试