如何在vscode中为c#编写单元测试

如何从零开始创建一个单元测试工程

创建测试单元工程

创建测试文件的方法和新建项目类似,都是使用dotnet new命令。

dotnet new xunit

为测试单元工程添加需要测试的工程的项目引用

dotnet add reference ..\program\program.csproj

为sln文件添加测试单元工程的项目引用

dotnet sln add ..\program.test\program.test.csproj

文件的目录结构应大致如下树状图所示。

project/
├─program/
│ ├─src/
│ └─program.csproj
├─program.test/
│ ├─src/
│ └─program.test.csproj
└─program.sln

运行测试单元

dotnet test

单元测试中如何输出日志

Q:xUnit为什么没有办法直接打印输出?

A:xUnit的测试会新开一个进程进行测试,因此运行dotnet test命令的进程没有办法捕获xUnit进程的输出。

解决方案:在测试代码中添加ITestOutputHelper接口,并在构造函数中将其初始化,之后使用该接口的WriteLine方法输出文本。

using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
// 定义接口
private readonly ITestOutputHelper output;

public MyTestClass(ITestOutputHelper output)
{
// 初始化接口
this.output = output;
}

[Fact]
public void MyTest()
{
var temp = "my class!";
output.WriteLine("This is output from {0}", temp);
}
}

在这里要注意的是,vscode中如果想要看到标准输出,需要在dotnet test命令后添加额外的参数--logger "console;verbosity=detailed",也就是运行以下命令。

dotnet test --logger "console;verbosity=detailed"

参考文章

Microsoft:使用 dotnet test 和 xUnit 在 .NET 中对 C# 进行单元测试

知乎:VSCode + xUnit 编写 C# 单元测试

xUnit:Capturing Output

博客园:终于解决 xUnit.net 测试中无法输出到控制台的问题