使用 NUnit 进行单元测试






4.83/5 (58投票s)
使用 NUnit 进行单元测试。
引言
在本文中,我将对单元测试进行基本描述,并介绍 .NET 的单元测试框架 NUnit。本文是对单元测试的介绍,并解释了一个用于单元测试的工具。
什么是单元测试?
单元测试是在开发人员端进行的测试。它用于测试方法、属性、类和程序集。单元测试不是由质量保证部门进行的测试。要了解单元测试在开发中的位置,请看下图
单元测试用于测试一小块可运行的代码(操作性)称为单元。这鼓励开发人员修改代码,而无需立即担心这些更改可能如何影响其他单元或整个程序的运行。单元测试可能耗时且乏味,但应该耐心而彻底地进行。
什么是 NUnit?
NUnit 是一个基于 .NET 平台的单元测试框架。它是广泛使用的单元测试工具,受到许多开发人员的青睐。NUnit 是免费使用的。NUnit 本身不创建任何测试脚本。您需要自己编写测试脚本,但 NUnit 允许您使用其工具和类来简化单元测试。以下是关于 NUnit 需要记住的要点
- NUnit 不是自动化的 GUI 测试工具。
- 它不是一种脚本语言,所有测试都用 .NET 支持的语言编写,例如 C#、VC、VB.NET、J# 等。
NUnit 是 eXtreme Programming (XP) 中使用的流行测试框架的衍生。它由 Philip Craig 为 .NET 创建。它也以 jUnit 的名称用于 Java 代码测试。
NUnit 通过提供一个类框架和一个测试运行器应用程序来工作。它们可以从此处下载。类框架允许基于应用程序编写测试用例。使用从上述链接下载的测试运行器应用程序运行测试。
使用 NUnit 的步骤
首先,需要从上述网站下载最新版本的 NUnit 框架。
- 在开发工作室中,创建一个新项目。在本例中,我创建了一个控制台应用程序。
- 在 program.cs 文件中,写入以下代码
- 然后,在项目的解决方案中,添加一个新的类库项目,并将其命名为后跟“
.Test
”(这是单元测试使用的命名约定)。将下载的 DLL 文件导入到项目中,然后按照下面的步骤进行操作。 - 在新添加的项目中,添加一个类并将其命名为 TestClass.cs。
- 在类文件中,写入以下代码
- 现在打开测试运行器(测试运行器与 NUnit DLL 一起从 NUnit 站点下载)。在 NUnit API 中,点击文件 > 打开项目。会出现一个文件打开对话框。提供 NUnit 测试项目 DLL 的路径。然后运行测试。如果测试通过,则会显示以下测试屏幕
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter two numbers\n");
int number1;
int number2;
number1 = int.Parse(Console.ReadLine());
number2 = int.Parse(Console.ReadLine());
MathsHelper helper = new MathsHelper();
int x = helper.Add(number1, number2);
Console.WriteLine("\nThe sum of " + number1 +
" and " + number2 + " is " + x);
Console.ReadKey();
int y = helper.Subtract(number1, number2);
Console.WriteLine("\nThe difference between " +
number1 + " and" + number2 + " is " + y);
Console.ReadKey();
}
}
public class MathsHelper
{
public MathsHelper() { }
public int Add(int a, int b)
{
int x = a + b;
return x;
}
public int Subtract(int a, int b)
{
int x = a - b;
return x;
}
}
[TestFixture]
public class TestClass
{
[TestCase]
public void AddTest()
{
MathsHelper helper = new MathsHelper();
int result = helper.Add(20, 10);
Assert.AreEqual(30, result);
}
[TestCase]
public void SubtractTest()
{
MathsHelper helper = new MathsHelper();
int result = helper.Subtract(20, 10);
Assert.AreEqual(10, result);
}
}
否则,会显示以下屏幕
重要属性
1. [SetUp]
SetUp
通常用于初始化目的。在执行测试之前必须初始化或设置的任何代码都放在带有此属性标记的函数中。因此,它避免了每个测试中代码重复的问题。
[SetUp]
public void Xyz()
{
.
.
}
在 Xyz
方法中编写的代码将在测试运行之前执行,并且它会避免调用此方法中的代码。
2. [Ignore]
此属性用于需要绕过的代码。
3. [ExpectedException]
此属性用于测试在某些情况下需要抛出异常的方法。这些情况可能是 FileNotFoundException
等。
[Test]
[ExpectedException(typeof(MissingFileException))]
public void CheckException()
{
......
......
}
代码不应包含任何 Assert
语句。如果测试通过,代码应抛出异常,否则不会抛出异常。
4. [TearDown]
这是一个与 [SetUp]
相反的属性。这意味着带有此属性的代码最后执行(在通过其他代码行之后)。因此,通常在此处执行清理操作,即关闭文件系统、数据库连接等。
模拟对象
模拟对象是真实对象的模拟。模拟对象就像真实对象一样,但以受控的方式运行。创建模拟对象是为了测试真实对象的行为。在单元测试中,模拟对象用于审查真实对象的性能。简单来说,模拟对象只是真实对象的模仿。模拟对象的一些重要特征是它们轻量级、易于创建、快速且确定性强等等。
存根对象
存根对象是实现组件接口的对象。可以配置存根对象以返回所需的值。存根对象提供有效的响应,但它是静态的,意味着无论输入什么,我们总是得到相同的响应。
模拟对象 vs. 存根对象
模拟对象在某些方面与存根对象不同。它们列在下面
- 第一个区别因素是模拟对象会测试自身,即它们会检查被测试的对象是否在正确的时间以正确的方式调用了它们。存根通常只返回存根数据,这些数据可以根据它们的调用方式进行配置。
- 其次,模拟对象相对于存根通常更轻量级,因为每个测试都为模拟对象设置了不同的实例,而存根经常在测试之间重复使用。
结论
这些是使用 NUnit 框架进行单元测试的基本步骤。编码愉快。