什么是单元测试
单元测试是对软件中的最小可测试单元进行检查和验证。对于单元测试,要保证测试粒度足够小,才能准确定位问题。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致。我们在编写测试代码时,应该要保证代码的自动执行,并非交互式的,保证测试用例的自动执行,不需要对测试结果进行人工验证。
单元测试除了协助本地开发,通常还放在持续集成中。每次有代码签入,单元测试都会被执行。因此单元测试要保证可重复执行,不能受外界环境影响。我们在编码设计时,可将外部依赖项通过DI容器注入。比如,我们有一个接口,依赖日志中间件,数据库等,我们就可以通过DI注入一个内存数据库和Mock对象来实现。
.NET Core中的测试框架
一个最基础的单元测试
编写一段代码,实现一个功能:判断一个字符串是否时长文本(约定长度大于6即为长文本)
public class UnitTestSample
{
public static bool IsStringLong(string val)
{
return val.Length > 6;
}
}
我们现在编写一个单元测试,测试长文本
本测试用例使用xUnit
Install-Package xunit -Version 2.4.1
测试方法名建议:待测试方法名+预期结果+参数
using Xunit;
public class UnitTestSampleTest
{
[Fact]
public void IsStringLong_ReturnTrue_WithExpectedParameters()
{
// Arrange
string val = "1234567";
// Act
var actual = UnitTestSample.IsStringLong(val);
// Assert
Assert.True(actual);
}
}
如果你使用的Visual Studio
进行开发,你可以选择开启Live Unit Testing
当你编写完测试代码后,Visual Studio会自动运行测试,如下(通过测试的代码会有一个勾):
当然,你也可以打开测试资源管理器运行测试
我们再看看上面的代码
上面我们只对正常情况下进行了测试,如果我们传入null值呢?对于null值,其实我们是期望返回false,我们编写以下测试代码
[Fact]
public void IsStringLong_ReturnTrue_WithNullParameters()
{
// Arrange
string val = null;
// Act
var actual = UnitTestSample.IsStringLong(val);
// Assert
Assert.False(actual);
}
我们发现测试未通过:
查看测试结果发现产生了一个System.NullReferenceException
异常
我们看前面编写的功能代码,发现return val.Length > 6
并没有对null值进行处理,现在修改此代码:
public static bool IsStringLong(string val)
{
return val?.Length > 6;
}
测试通过