C# 创建一个简单的单元测试实例(MSTest框架)

Posted run_bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 创建一个简单的单元测试实例(MSTest框架)相关的知识,希望对你有一定的参考价值。

背景

最近在看单元测试,因为公司要求使用语言为C#,所以探索了一下微软自带的一个单元测试框架MSTest,研究了半天终于跑通了,决定记下来,供自己日后参考

单元测试简介

所谓单元测试(unit testing),就是开发者编写的一小段代码,用于对软件中的最小单元进行检查和验证,其一般验证对象是一个函数或者一个类。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。

所用环境

VS2019
MSTest

一个实例

1. 创建一个被测项目

  1. 首先需要一个被测项目,进入VS2019, file -> new ->project,选择 Console App(.net Core),如下图,点击next,create,一路创建就可以
    在这里插入图片描述
  2. 打开项目中的.cs文件,可以看到他自动生成了一些代码,直接用下面的简单程序代码替换掉就可以
    这个程序就是一个简单的整数相加,下面是代码片 。
using System;

namespace Demo
{
    public class Add
    {
        public int two_number(int a, int b)
        {
            return a + b;
        }
    }
    class TestWork
    {
        static void Main(string[] args)
        {
            Add add = new Add();
            
            Console.WriteLine(add.two_number(10, 10));

        }
    }
}

3.

2. 创建一个测试项目

接着需要一个测试项目,在解决方案中添加一个新项目,选择 MSTest Test Project(.net Core),如下图,点击next,create,一路创建就可以
在这里插入图片描述
在这里插入图片描述

3. 引用

此时已经创建好了被测项目和测试项目,接着要将他俩关联起来
右击测试项目,Add -> Project Reference
在这里插入图片描述
勾选上面创建好的被测项目,点击OK
在这里插入图片描述
此时可以看到测试项目下的.cs文件中有一些内容,直接用下面的代码片替换即可

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Demo;

namespace UnitTestProject2
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void two_number()
        {
            int a = 10;
            int b = 20;
            Assert.AreEqual(30, new Add().two_number(a, b));
        }
    }
}

在这里插入图片描述

4. 执行测试

引用好之后,就可以执行测试了,上面的测试类中写了一个测试方法,就代表是一条用例,在测试方法的代码编辑窗口,右击,点击Run Test 即可执行测试
在这里插入图片描述
会弹出测试窗口,窗口中显示测试结果,第二个就是我们在执行的测试类,可以看到,一条用例已经通过
在这里插入图片描述

5. 通过代码直接生成测试用例类

上述2-3步骤,是属于手动创建测试项目并引用的,但其实VS2019是提供了通过代码直接生成单元测试用例类的,只需要修改相关的用例即可,这样操作更快也更方便
还是以上面创建的被测项目为例,进入被测项目.cs文件编辑窗口,右击,选择 Create Unit Tests,点击OK即可
在这里插入图片描述
在这里插入图片描述

6. 测试用例的写法

说完了创建单元测试的大框架,现在来说一下测试用例的写法
原则上一个测试方法就代表一条测试用例,测试用例的构成有三部分:准备 执行 断言
先简单解释一下,下面用代码举例说明:
arrange 准备部分 初始化对象并设置传递给待测试方法的数据
act 执行部分 调用具有准备参数的待测方法
assert 断言部分 验证预期和实际结果是否相同

	[TestMethod()]
        public void two_numberTest(int a, int b)
        {
            // arrange
            int a = 10;
            int b = 20;

            // act 
            int res = new Add().two_number(a, b);

            // assert
            Assert.AreEqual(a + b, res);
        }

7. 参数化

假如有好多个测试用例,只有传参不同,一个一个写测试方法会有点太过麻烦,所以MSTest提供了参数化方法 [DataRow(参数列表)],还是以代码为例,虽然只写了一个测试方法,但是其实是4个用例
可以执行一下看看结果,可以看到多条用例的参数和执行结果

		[TestMethod()]
        [DataRow(10, 0)]
        [DataRow(10, -20)]
        [DataRow(-10, -20)]
        [DataRow(10, 20)]
        public void two_numberTest(int a, int b)
        {
            Assert.AreEqual(a + b, new Add().two_number(a, b));
        }

在这里插入图片描述

8. 设置超时

由于网络或者数据、性能等各种原因,有时候我们需要给测试方法设置一个超时时间
MSTest有两种方式设置超时时间

[Timeout(2000)]   // 设置超时, 单位为毫秒,可以自己设置时间
[Timeout(TestTimeout.Infinite)]    // 将超时时间设置为允许的最大值,有一个固定的值,去到定义中可以看到

在这里插入图片描述

9. 调试

程序出现问题我们会去调试,单元测试没通过也可以进行调试,由于和编写代码调试大同小异,故只简单叙述步骤

  1. 在想要调试的测试方法行中打断点
  2. 在测试资源管理器中选择测试方法,右击,选择Debug即可
    在这里插入图片描述
  3. 进入调试模式
    F5 继续。
    F10 执行下一行代码,但不执行任何函数调用。
    F11 在执行进入函数调用后,逐条语句执行代码。
    Shift + F11 执行当前执行点所处函数的剩余行。
    Shift + F5 停止运行程序中的当前应用程序。可用于“中断”模式和“运行”模式。

以上是关于C# 创建一个简单的单元测试实例(MSTest框架)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MSTest 测试异步代码

习题-第3章单元测试

在 .net 框架中进行测试

如何使用 MOQ 框架在 c# 中模拟静态方法?

如何在 Unity 游戏引擎平台上的单元测试中实例化 MonoBehaviour 对象

如何并行运行单元测试(MSTest)?