使用Visual Studio在C#中开始单元测试

17

我知道Visual Studio提供了一些单元测试工具。如何使用它们,你如何使用它们?关于单元测试,我应该知道什么(假设我什么都不知道)。

这个问题类似,但它没有涉及到Visual Studio可以做什么,请不要因此将其标记为重复。我发布为社区Wiki,因为我不想成为声望猎人。

3个回答

7
最显著的区别是MSTest支持内置在Visual Studio中,直接提供单元测试、代码覆盖和模拟支持。而在外部(第三方)单元测试框架中进行相同类型的操作通常需要多个框架(一个单元测试框架和一个模拟框架)和其他工具来进行代码覆盖分析。
最简单的使用MSTest单元测试工具的方法是打开要为其创建单元测试的文件,在编辑器窗口中右键单击并从上下文菜单中选择“创建单元测试…”菜单。我更喜欢将我的单元测试放在一个独立的项目中,但这只是个人偏好。这将创建一种“模板”测试类,其中包含测试方法,以允许您测试类的每个函数和属性。此时,您需要确定测试通过或失败的意义(换句话说,确定在给定某些输入时应该发生什么)。
通常,您最终编写类似于以下内容的测试:
string stringVal = "This";
Assert.IsTrue(stringVal.Length == 4);

这意味着在赋值后,名为stringVal的变量的Length属性应该等于4。

其他线程中列出的资源应该为了解单元测试提供一个很好的起点。


我知道(认为)微软收购了 TypeMock,但我理解它仍然是一个附加组件。我有团队套件版本,没有内置的模拟框架。我使用 RhinoMocks 进行模拟。 - tvanfosson
@tvanfosson 也许这就不是真正的 mock 了。我提到的是创建“私有访问器”对象的能力,以允许你测试私有和内部方法。 - Scott Dorman

2

Visual Studio中的单元测试结构在使用上与NUnit相似。然而,它有一个非常有趣(和有用)的特性,这个特性与NUnit存在显著的不同。VS单元测试可以用于那些没有考虑单元测试的代码。

你可以在应用程序编写完成之后构建一个单元测试框架,因为测试结构允许你外部引用方法调用,并使用ramp-up(上升)和tear-down(下降)代码来准备测试环境。例如:如果你在一个类中有一个使用外部资源的方法,你可以在ramp-up类中创建这些资源(由VS为您创建),然后在单元测试类(同样由VS为您创建)中进行测试。当测试完成时,tear-down类(同样由VS提供)将释放资源并进行清理。整个过程存在于您的应用程序之外,因此不会干扰代码库。

Visual Studio的单元测试框架实际上是非常好的实现和易于使用。最重要的是,你可以使用它来对那些没有设计单元测试的应用程序进行测试(这是使用NUnit不容易做到的)。


为什么在NUnit中这不容易实现呢?NUnit提供了相同的测试设置/拆卸功能。您也可以使用NUnit对没有考虑单元测试的代码进行单元测试。 - Scott Dorman
也许我误解了 NUnit 的工作原理,但我认为您必须在要测试的代码中放置声明性语句,以便 NUnit 知道在哪里找到测试对象。使用内置于 VS 中的测试框架,这是不必要的。虽然我可能对 NUnit 有所误解。 :) - Eric
NUnit是一个代码库,旨在促进对.NET代码库进行自动化单元测试(也有其他语言的版本)。您可以在此处找到它:http://www.nunit.org - Eric

2
首先,我会下载TestDriven.Net作为测试运行器。这将添加一个右键菜单,使您可以通过右键单击测试方法并选择运行测试来运行单个测试。这也适用于类中的所有测试(在方法之外右键单击类),命名空间(在项目或类之外的命名空间上右键单击)或整个解决方案(右键单击解决方案)。它还添加了从同一右键单击菜单运行带覆盖率(内置或nCover)或调试器的能力。
至于设置测试,通常情况下,我坚持每个项目一个测试项目,每个被测试类一个测试类。有时我会为跨多个类运行的方面创建测试类,但通常不会这样做。我创建它们的典型方式是首先创建类的框架 - 没有属性,没有构造函数,但具有我要测试的第一个方法。此方法只是抛出NotImplementedException。
创建类框架后,我使用右键单击在要测试的方法中创建单元测试。这会弹出一个对话框,让您创建新的测试项目或选择现有项目。我创建并适当命名一个新的测试项目,并让向导创建类。完成后,您可能还需要在测试项目中创建该类的私有访问器函数。如果类发生了实质性的更改,有时需要更新(重新创建)这些访问器函数。
现在您拥有一个测试项目和第一个测试。首先修改测试以定义方法的预期行为。编写足够的代码(仅仅)通过测试。继续编写测试/编写代码,为该方法指定更多的行为,直到定义了该方法的所有行为。然后根据需要移动到下一个方法或类,直到您拥有足够的代码来完成您正在工作的功能。
您可以根据需要添加更多不同类型的测试。您还可以设置源代码控件以要求在检入之前通过某些或所有测试。

为什么要使用TestDriven.Net?这根本没有回答问题(问题是关于使用内置测试工具的)。 - Scott Dorman
你仍在使用微软的测试框架,但只是使用TestDriven.Net的测试运行器。我更喜欢它,因为直接从代码中运行测试更加方便。 - tvanfosson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接