编写单元测试是一个很好的软件工程实践。在本文中,我们将学习如何创建一个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应用程序!