如何创建和运行一个.Net单元测试项目
所有应用程序都必须经过某种形式的测试。单元测试是在测试应用程序的一个单元时利用的。一个单元是在系统中可以逻辑分离的一部分代码。
在本教程中,我们将使用Visual Studio来测试ASP.Net应用程序。它也被用来运行一个ASP.Net应用程序的测试代码。这样一来,检查ASP.Net应用程序中的故障就变得容易多了。
Visual Studio中的测试模块提供了内置的功能。一个ASP.Net项目的测试马上就能运行。
前提条件
要跟上本教程,你需要具备以下条件。
- 对C#有一个基本的了解。
- 对ASP.Net的基本了解。
- 一个像[Visual Studio]这样的文本编辑器。
什么是单元测试
单元测试确定组件或单个软件单元是否与设计的规格和测试、附带的数据和使用程序相一致。
一个单元是一小段代码,执行一个特定的任务。单元测试是一个简短的脚本或代码,验证特定单元的行为并返回一个通过或失败的结果。
单元测试的目标是让开发人员能够在可行的情况下运行尽可能多的单元测试,找到潜在的缺陷。
在应用程序通过单元测试后,还需要其他类型的测试来进一步验证。
所有的.net语言都利用NUnit,一个广为人知的单元测试框架。它是一个免费的开源程序,可以让你手动编码脚本。它允许同时进行数据驱动的测试的性能。
单元测试的方法类型
可用的单元测试方法包括。
-
手动:对于使用手工方法的人来说,你需要创建一个解释性的文件,描述过程中的每一步。
-
自动的:自动化的单元测试仍然是最流行的方法。当使用自动化方法时,通常是在测试框架内创建测试案例。
所有失败的测试都会被记录和报告,以及所有成功测试的描述。
测试单元的技术
黑盒测试涉及测试用户界面和输入输出,而白盒测试侧重于软件应用的功能行为。
测试套件、方法、测试用例和风险评估是使用灰盒测试进行的。软件程序的用户界面是通过黑盒测试进行的。
以下是单元测试技术。
- 包括在范围内的声明。
- 对决策过程的覆盖。
- 对不同分支的覆盖。
- 对情况的覆盖。
- 通过有限状态机的覆盖。
单元测试的好处
-
更大的进步率:编写单元测试可以减少开发人员花在故障排除上的时间,从而节省时间。如果开发人员对可能出现的故障有信心,那么为产品添加新的功能,然后重构代码就会更容易。没有单元测试,这是不可能的。
-
新的和改进的概念:创建单元测试有助于开发人员看到他们的代码将如何在整个系统中被使用,从而导致更好的整体设计。
-
使用更强大的反馈机制:在所有单元测试完成后,将有可能评估系统的当前状态。这些测试为程序员提供了一个关于代码状态的更好的想法,比如它是否已经完成。测试环境的修改可能会影响到代码基础,但反馈系统可以协助沟通测试环境的表现。
-
它是一个有用的预回归工具:在所有单元测试完成后,开发者将能够轻松地重组或重新组织代码。开发人员可能会高枕无忧,因为他们的改变不会损害其他模块或整个系统。
-
削减成本:如果在开发过程的后期发现问题,可能需要一个昂贵的补丁。使用一套精心设计的单元测试,及早发现基本问题(这些问题以后可能会对系统产生重大影响),有助于从长远来看降低维护成本。
创建一个项目
- 当创建一个新项目时,我们将使用Visual Studio并从开始菜单中创建一个新项目。

- 一旦完成,我们就需要找到我们的.NET Core的C#控制台应用程序项目模板,并点击那里出现的图标。

- 为你的努力决定一个名字。对于这个项目,我决定将其称为
Collegefinance。必须选择.NET Core 3.1或.NET 5目标框架。
当你在学校项目中工作时,Program.cs 文件将在代码编辑器中打开。

如果你不能直接打开Program.cs文件;你可以在Solution Explorer中通过双击它来实现。
- 要使用
CollegeFinance类,请将以下C#代码添加到Program.cs。
using System;
namespace BankAccountNS
{
public class CollegeFinance
{
private readonly string n_studentIdentity;
private double n_Remainder;
private CollegeFinance() { }
public CollegeFinance(string studentIdentity, double Remainder)
{
n_studentIdentity = studentIdentity;
n_Remainder = Remainder;
}
public string studentIdentity
{
get { return n_studentIdentity; }
}
public double Remainder
{
get { return n_Remainder; }
}
public void Arrears(double total)
{
if (total > n_Remainder)
{
throw new ArgumentOutOfRangeException("total");
}
if (total < 0)
{
throw new ArgumentOutOfRangeException("total");
}
n_Remainder += total; // intentionally incorrect code
}
public void Solvency(double total)
{
if (total < 0)
{
throw new ArgumentOutOfRangeException("total");
}
n_Remainder += total;
}
public static void Main()
{
CollegeFinance dc = new CollegeFinance("Anthony Lincons", 12.88);
dc.Solvency(6.88);
dc.Arrears(12.54);
Console.WriteLine("Current remainder is ${0}", dc.Remainder);
}
}
}
- 在Solution Explorer中右击该文件,从Build菜单中选择Build Solution(或Ctrl + SHIFT + B),将其重命名为
CollegeFinance.cs。现在我们有一个可以投入测试的项目。
如何创建一个单元测试项目
- 从文件菜单添加一个新项目。

- 你必须选择语言,在我们的例子中是C#,然后在你为.NET核心模板选择单元测试项目后继续。

- 重命名,如
CollegeTests,然后点击下一步继续。

-
创建一个新的CollegeTests项目,选择所需架构(.NET Core 3.1或.NET 5)。我们已经将
CollegeTests集成到Collegefinance。 -
确保CollegeTests项目包含对学院项目的提及。在创建的项目中点击菜单栏中的查看,从列表中点击解决方案资源管理器,点击依赖关系,然后通过右键点击引用选项添加依赖关系。
-
在引用管理器对话框中展开项目,然后是解决方案,最后是Collegefinance。

制作一个测试类
在这个阶段,我们将重命名文件CollegeFinanceTests.cs ,这比按项目重用模板来测试CollegeFinance 类更有意义。
在CollegeFinanceTests.cs文件中添加以下代码。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace CollegeTests
{
[TestClass]
public class CollegeFinanceTests
{
[TestMethod]
public void TestMethodl()
}
}
请确保包括一个using条款
如果你希望在没有适当限定标识符的情况下调入测试项目,请在测试类中添加一个using行。
在类文件的页眉处添加以下内容。
using CollegeFinanceNS;
测试类的先决条件
一个测试类必须满足以下条件。
- 任何希望在Test Explorer中运行的具有单元测试方法的类必须具有
[TestClass]属性。 - 这个属性必须存在于你计划在Test Explorer中使用的每一个方法
[TestMethod],这样它才能被工具识别。
你可以在你的单元测试项目中使用没有[TestMethod] 属性的测试类中的函数,而不是具有[TestClass] 属性的类型。你可以使用你的测试方法,从你的测试代码中调用这些新的类和函数。
在下面的方法中,我们将创建单元测试方法来验证CollegeFinance 类的行为的Fees 方法。
创建一个测试方法
作为第一步,我们将确保一个有效的付款已经进入账户。
类CollegeFinanceTests 应该有这个方法。
[TestMethod]
public void Arrears_WithValidTotal_UpdatesRemainder()
{
double beginningRemainder = 12.11;
double ArrearsTotal = 5.11;
double anticipated = 6.33;
CollegeFinance account = new CollegeFinance("Anthony Lincons", beginningRemainder);
account.Arrears(ArrearsTotal);
double attested = account.Remainder;
Assert.AreEqual(anticipated, attested, 0.002, "The account has not been charged appropriately.");
}
这个函数很简单:它创建一个新的CollegeFinance对象,有一个开始的余款,然后提取一个有效的金额。它使用Assert.AreEqual函数检查期末余款是否与预测的一样。Assert是一个方法的例子。
测试技术的规范
一个测试方法必须满足以下条件。
- 它上面有[TestMethod]属性。
- 它给出一个无效的结果。
- 它不允许有参数。
创建测试并执行它
- 从Build下拉菜单中选择Build Solution。

- 如果Test Explorer还没有打开,进入test> Windows,然后从主菜单选择Test Explorer。
- 从 "全部运行 "部分运行该测试。在运行测试时,会出现一个进度条并改变颜色。如果所有的测试都成功了,那么进度条就是绿色的;否则,就是红色的。如果我们假设我们最坏的情况下,测试会失败。
- 要探索一个技术的更多信息,打开测试资源管理器,点击技术的名称。
然后在你修复了代码后重新测试
在测试结果中包括对失败的解释。通过使用AreEqual 方法的信息,很容易看到预期的结果和获得的结果。剩余部分因支付的金额而增长而不是减少。
在单元测试中,发现了一个问题:支付的金额没有被扣除,而是被添加到账户Remainder中。
纠正这个问题。
替换CollegeFinance.cs 文件中的这一行,以解决这个问题。
n_Remainder += total;
用。
n_Remainder -= total;
结论
从本教程中可以看出,单元测试是ASP.Net项目中的第一层测试。单元测试是对一个应用程序的功能进行测试。测试的目的是为了保证应用程序按计划执行。
打开Visual Studio并创建一个测试项目是第一步。测试项目将有测试应用程序所需的所有代码。