跳至正文
首页 » 博客 » How to write Unit Tests for a .NET Core Application

How to write Unit Tests for a .NET Core Application

编写单元测试是一个很好的软件工程实践。在本文中,我们将学习如何创建一个C #。NET Core应用程序,同时坚持测试驱动开发 (TDD) 方法。在TDD方法中,在实现功能之前,您需要为它编写一个单元测试。例如,如果你想编写一个函数来添加两个数字,首先你将编写一个失败的单元测试,然后实现通过测试的功能。

在这篇文章中,我们将创建一个计算器应用程序。首先,让我们按照下面概述的文件夹结构:

  • CalculatorApp-解决方案
  • CalculatorApp.Services-应用程序项目
  • CalculatorApp.Services.Tests-测试项目

您可以使用Visual Studio创建项目; 但是,在这篇文章中,我将使用.NET Core命令创建我的项目、添加测试和运行测试。您也可以使用MSTest或NUnit来编写单元测试,但在本例中,我将使用xUnit和dotnet test来编写和运行我的单元测试。

让我们从打开一个命令shell开始,然后继续:

创建应用程序项目

首先,您需要创建一个名为CalculatorApp的目录。请记住,您可以遵循您想要的目录的任何命名约定,但如果您想遵循这篇文章,我建议您遵循相同的目录名称。因此,让我们创建CalculatorApp目录并导航到它。

在CalculatorApp目录中,我们将通过运行以下命令创建一个新的解决方案:

dotnet新sln

成功运行该命令后,您应该会收到消息 “模板解决方案文件已成功创建”。同样在CalculatorApp目录中,您将找到一个名为calculatorapp.sln的文件。

接下来,创建一个名为 “ CalculatorApp.Services” 的目录。此目录将保留应用程序源,即计算器应用程序的所有类。导航到Calculatorapp.Services目录,并通过运行以下命令创建类库:

dotnet新classlib

成功运行此命令后,您应该会收到消息 “模板类库已成功创建”。您还可以在calculatorapp.services目录中找到一个名为CalculatorApp.Services.csproj的文件。接下来,您需要将这个类库项目添加到calculatorapp解决方案中。为此,请导航回calculatorapp目录,并运行以下命令:

dotnet sln添加。\ calculatorapp.services \ calculatorapp.services.csproj

成功运行命令后,您应该会收到消息 “项目已添加到解决方案”。

在CalculatorApp.Services文件夹中,您将找到一个类Class1 -将其重命名为Calculator并修改该类,如下所示:

计算器.cs

使用系统; 命名空间calculatorapp.services{公共计算器{ public int Add( int num1, int num2){抛出NotImplementedException ();} 公共int Sub( int num1, int num2){抛出notimplexentedexception (); }}} 

在上面的清单中,您会注意到Add和Sub函数没有实现。首先,我们将编写一个单元测试,然后实现这些功能。

创建测试项目

若要添加测试项目,请创建名为CalculatorApp.Services.Tests的目录并导航到该目录。在此目录中,我们将通过运行以下命令创建一个MS测试项目:

dotnet新mstest

此命令创建使用MS test作为测试库的测试项目。创建测试项目后,在测试项目中添加源项目库。要做到这一点,运行命令:

dotnet添加引用。./CalculatorApp.Services/CalculatorApp.Services.csproj

命令会将CalculatorAppService项目的引用添加到测试项目中。添加引用后,通过导航到calculatorapp根目录将测试项目添加到解决方案中,然后运行命令:

dotnet sln添加。\ CalculatorAppServices.tests \ CalculatorAppServices.Tests.csproj

此命令会将测试项目添加到解决方案中。成功运行命令后,您应该会收到消息 “项目已添加到解决方案”。

编写单元测试

到目前为止,我们已经创建了应用程序源项目和测试项目。在应用程序源项目中,存在未实现的功能。现在让我们为这些函数编写测试。

在测试项目中,我已将文件UnitTest1.cs重命名为Calculator.Test.cs,并将类名重命名为CalculatorTest。在CalculatorTest的构造函数中,我们需要创建一个Calculator类的对象。这可以如下面的清单所示:

计算器.Test.cs

使用Microsoft.VisualStudio.TestTools.UnitTesting;使用calculatorapp.services;命名空间CalculatorApp.Services.Tests{[TestClass]CalculatorTest公共{ 计算器 _calc; 公共CalculatorTest(){_Calc = 计算器 ();}}} 

单元测试添加功能

在CalculatorTest类中,添加一个单元测试方法来测试添加功能,如下所示:

[测试方法]public void shouldaddtwonumbers(){int res = _calc.Add(5, 3);断言。面积相等 (res,8);} 

要运行测试,请导航到CalculatorApp.Services.Tests目录并执行以下命令:

dotnet测试

你会得到一个 “测试失败” 的输出,因为添加功能没有实现,如下图所示:

要通过测试,请在Calculator类中实现Add函数,如下所示:

public int Add( int num1, int num2){ int结果 = num1 num2;返回结果;} 

要立即运行测试,请导航到CalculatorApp.Services.Tests控制器并执行以下命令:

dotnet测试

作为输出,您将获得 “test passed” 消息,如下图所示:

现在,您已经实现了Add功能,同时遵循了TDD方法。NET Core应用程序!

单元测试子功能

在CalculatorTest类中,添加一个单元测试方法来测试子功能,如下所示:

[测试方法]public void shouldsubstracttwonumbers(){int res = _calc.Sub(5, 3);断言。面积相等 (res,2);} 

要运行测试,请导航到CalculatorApp.Services.Tests目录并执行以下命令:

dotnet测试

在这里,您的测试将失败,因为子功能未实现。您将得到一个失败的测试结果,如下图所示:

要通过测试,请在Calculator类中实现子函数,如下所示:

public int Sub( int num1, int num2){int结果 = num1 - num2;返回结果; } 

现在,通过导航到CalculatorApp.Services.Tests目录并执行以下操作,再次运行测试:

dotnet测试

现在你会发现两个测试都通过了,如下所示:

现在,您已经实现了子功能,同时遵循了a中的TDD方法。NET Core应用程序。

包扎起来

到目前为止,在这篇文章中,我们已经创建了一个.NET Core计算器应用程序,同时遵循TDD方法。为了创建测试,我们使用了XUnit和dotnet测试。供您参考,这里是Calculator类及其测试类的源代码:

计算器.cs

使用系统; 命名空间calculatorapp.services{公共计算器{ public int Add( int num1, int num2){ int结果 = num1 num2;返回结果;} 公共int Sub( int num1, int num2){int结果 = num1 - num2;返回结果; }}} 

计算器.test.cs

使用Microsoft.VisualStudio.TestTools.UnitTesting;使用calculatorapp.services;命名空间CalculatorApp.Services.Tests{[TestClass]CalculatorTest公共{ 计算器 _calc; 公共计算器测试 (){_Calc = 计算器 ();} [测试方法]public void shouldaddtwonumbers(){int res = _calc.Add(5, 3);断言。面积相等 (res,8);} [测试方法]public void shouldsubstracttwonumbers(){int res = _calc.Sub(5, 3);断言。面积相等 (res,2);}  }}

这就是你如何编写单元测试,然后实现它们的功能。我希望这篇文章能帮助你开始为你的下一个编写单元测试。NET Core应用程序!

</p