背景
最近在看单元测试,因为公司要求使用语言为C#,所以探索了一下微软自带的一个单元测试框架MSTest,研究了半天终于跑通了,决定记下来,供自己日后参考
单元测试简介
所谓单元测试(unit testing),就是开发者编写的一小段代码,用于对软件中的最小单元进行检查和验证,其一般验证对象是一个函数或者一个类。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。
所用环境
VS2019
MSTest
一个实例
1. 创建一个被测项目
- 首先需要一个被测项目,进入VS2019, file -> new ->project,选择 Console App(.net Core),如下图,点击next,create,一路创建就可以
- 打开项目中的.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));
}
}
}
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. 调试
程序出现问题我们会去调试,单元测试没通过也可以进行调试,由于和编写代码调试大同小异,故只简单叙述步骤
- 在想要调试的测试方法行中打断点
- 在测试资源管理器中选择测试方法,右击,选择Debug即可
- 进入调试模式
F5 继续。
F10 执行下一行代码,但不执行任何函数调用。
F11 在执行进入函数调用后,逐条语句执行代码。
Shift + F11 执行当前执行点所处函数的剩余行。
Shift + F5 停止运行程序中的当前应用程序。可用于“中断”模式和“运行”模式。
转载:https://blog.csdn.net/run_bear/article/details/116641314