从零开始学习 NUnit






4.27/5 (4投票s)
在本文中,我们将了解 DotNet 中最重要的单元测试框架之一。
引言
每一个成功的软件开发都遵循一个称为 SDLC(软件开发生命周期)的生命周期。根据 Wikipedia
"SDLC 是软件组织中为软件项目遵循的一个过程。它包含一个详细的计划,说明如何开发、维护、替换、修改或增强特定软件。生命周期定义了一种提高软件质量和整体开发过程的方法。"
(一张来自 Wiki 的图片)
作为开发者,我们通常理解需求并编写代码。除了这些,我们有时也会参与软件测试。
软件测试 是一个执行程序或应用程序以查找软件错误的過程。
也可以说它是验证和确认软件程序、应用程序或产品的过程。
我搜索并尝试找出开发者可以进行的测试类型。我在网上找到了很多解决方案,其中最好的一个在 这里。
所以,开发者主要必须了解单元测试。
什么是单元测试?
让我们尝试找到“单元”的确切定义。
单元:-在这个 IT 行业,单元指的是代码中最小的、接收输入、进行特定操作并产生输出的一块代码。
而对这块小代码进行测试就称为 单元测试。
如今,.Net 有很多单元测试框架可用。如果我们查看 Visual Studio,会发现 Microsoft 集成的 MSTest 。
一些第三方框架有:-
NUnit
MbUnit
在所有这些框架中, Nunit 是最常用的测试框架。
什么是 NUnit?
NUnit 是一个适用于所有 .Net 语言的单元测试框架。
NUnit 是开源软件,NUnit 3.0 在 MIT 许可证下发布。 这个框架非常易于使用,并且具有用户友好的属性。
您可以在 这里 查看 Nunit 的详细信息。
如果您想了解 MsTest 和 Nunit 之间的主要区别,我建议您查看以下 链接 。
您还可以查看互联网上提供的许多其他链接。我在网上进行了一些小调研,发现了关于使用不同测试框架的以下结果。根据 Slant 网站的说法,这是大多数人推荐使用不同单元测试框架的建议。
此图片来自 Slant。
为了使用 Nunit,我们来设置一个简单的控制台应用程序,如下所示。
在此项目中编写以下类。
public class EmployeeDetails
{
public int id { get; set; }
public string Name { get; set; }
public double salary { get; set; }
public string Geneder { get; set; }
}
}
现在,在 Program 类中编写一些需要测试的条件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoProject
{
public class Program
{
public string Login(string UserId,string Password)
{
if(string.IsNullOrEmpty(UserId) || string.IsNullOrEmpty(Password))
{
return "Userid or password could not be Empty.";
}
else
{
if(UserId=="Admin" && Password=="Admin")
{
return "Welcome Admin.";
}
return "Incorrect UserId or Password.";
}
}
public List<EmployeeDetails> AllUsers()
{
List<EmployeeDetails> li = new List<EmployeeDetails>();
li.Add(new EmployeeDetails { id = 100, Name = "Bharat", Geneder = "male", salary = 40000 });
li.Add(new EmployeeDetails { id = 101, Name = "sunita", Geneder = "Female", salary = 50000 });
li.Add(new EmployeeDetails { id = 103, Name = "Karan", Geneder = "male", salary = 40000 });
li.Add(new EmployeeDetails { id = 104, Name = "Jeetu", Geneder = "male", salary = 23000 });
li.Add(new EmployeeDetails { id = 105, Name = "Manasi", Geneder = "Female", salary = 80000 });
li.Add(new EmployeeDetails { id = 106, Name = "Ranjit", Geneder = "male", salary = 670000 });
return li;
}
public List<EmployeeDetails> getDetails(int id)
{
List<EmployeeDetails> li1 = new List<EmployeeDetails>();
Program p = new Program();
var li = p.getUserDetails();
foreach (var x in li)
{
if(x.id==id)
{
li1.Add(x);
}
}
return li1;
}
static void Main(string[] args)
{
}
}
}
因此,我在这里编写了 3 个方法,或者说我们想要通过单元测试来测试的一些需求。
所以请按照以下方式在解决方案资源管理器中添加一个新的项目(类库类型)。
Nunit 框架不需要任何特定的项目类型,但大多数时候人们会添加一个类库来将他们的代码与单元测试分开。您需要自己引用 nunit.framework.dll。但是,如果您使用 nuget,在安装 NUnit 时会自动完成。
所以,为了使用 Nunit,我们需要进入 Nuget 包管理器并下载它。
下载后,我们将在项目中找到 nunit 引用。
现在,安装 Nunit 后,我们还需要另一个需要安装到项目中的 dll。
NUnit Test Adapter for Visual Studio
NUnit Test Adapter 允许您在 Visual Studio 中运行 NUnit 测试。
注意:-如果您不在项目中添加此组件,您将无法在测试资源管理器中找到您的测试。
注意:-您只需要在你编写测试方法的项目中安装这两个库。
在开始编写任何测试用例之前,让我们先了解 Nunit 中使用的所有组件。如果您查看 Nunit 网站,您可以在那里找到所有属性和其他组件的详细信息。
https://www.nunit.org/.
现在,我们的下一步是将 Demo Project 的 dll 添加到 DemoProjectTest 的引用中。
这将把以下 dll 添加到引用中。
所以,这是我为测试我们的需求而编写的测试用例。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;
using DemoProject;
namespace DemoProjectTest
{
[TestFixture]
public class DemoTests
{
List<EmployeeDetails> li;
[Test]
public void Checkdetails()
{
Program pobj = new Program();
li = pobj.AllUsers();
foreach(var x in li)
{
Assert.IsNotNull(x.id);
Assert.IsNotNull(x.Name);
Assert.IsNotNull(x.salary);
Assert.IsNotNull(x.Geneder);
}
}
[Test]
public void TestLogin()
{
Program pobj = new Program();
string x = pobj.Login("Ajit", "1234");
string y = pobj.Login("", "");
string z = pobj.Login("Admin", "Admin");
Assert.AreEqual("Userid or password could not be Empty.",y);
Assert.AreEqual("Incorrect UserId or Password.", x);
Assert.AreEqual("Welcome Admin.", z);
}
[Test]
public void getuserdetails()
{
Program pobj = new Program();
var p= pobj.getDetails(100);
foreach(var x in p)
{
Assert.AreEqual(x.id, 100);
Assert.AreEqual(x.Name,"Bharat");
}
}
}
}
TestFixture:-要使用 Nunit 进行测试的类应使用 TextFixture 进行装饰。
Test:-此属性标识要测试的方法。如果我们不写此属性,我们就无法在 Test Explorer 中识别测试。
我们有一个 Assert 类,其中包含以下方法,用于验证 TestFixture 中的不同条件。
每个方法都有不同的功能。要了解这些,请查看 Nunit 主页。
现在,让我们检查我们的测试。转到 Visual Studio 测试资源管理器。
这是我们的测试资源管理器,我们在这里看到所有的测试用例。
现在,如果您想单独运行一个测试,只需右键单击它并运行测试。
所以,我们可以这样运行测试。
如果测试成功运行,将显示如下勾号。
除了这些属性,我们还有一些其他属性,例如:-
1)SetUp:-当您想在每个测试用例中执行一段代码时,使用此属性。
它标识一个方法,该方法将在每次执行 TestMethod/Test 之前执行。
让我们通过一个例子来检查一下。我在这里创建了一个新的测试项目。我在这里创建了四个测试方法。
现在,让我们检查一下这些方法。
所以我在这里有使用 setUp 属性的方法。让我们尝试调试并检查 SubMethod。要调试,只需右键单击并调试选定的测试。
现在,如果我们注意到顺序,它将首先进入 Addmethod,如下所示。
因此,编写了 setup 属性的方法将在任何测试方法之前执行。
2)TearDown:-在完全执行每个测试后,如果您想执行一段代码,那么您必须将此代码写在 TearDown 属性下。
所以,让我们再次检查一下。我们设置了断点来检查执行顺序。
如果我们检查执行顺序,使用 TearDown 属性的方法将在测试用例执行完毕后最后执行。
需要记住的点
注意:-如果存在 2 个 SetUp 类,则第一个编写的类将首先执行,然后执行下一个类(从上到下)。
同样,在 TearDown 中,顺序是相反的,它将遵循从下到上的方法。
参考
所以,通过这种方式,我们可以使用 Nunit Testing 来测试我们的需求。我将在我的下一篇文章中解释 所有剩余的属性。希望这篇文章能帮助您学习 Nunit 的基本概念。
http://nunit.org
https://www.slant.co/topics/543/~unit-testing-frameworks-for-net