.NET & Xunit 最佳实践的单元测试
之前我们介绍了如何在单元测试中设置优先级,以一定的顺序执行单元测试。但根据对单元测试排序和.NET Core 和 .NET Standard 单元测试最佳做法我们可以知道,这并不是最佳做法。
那么最佳做法是什么呢?我们应该保证每一个单元测试都是自包含的。
以StudentServiceWithPriorityUnitTest的测试为例,
在测试修改学生信息的方法中,我们应该先新增一个学生信息,然后再修改学生信息,
在测试删除学生信息的方法中,我们应该先新增一个学生信息,然后再删除学生信息,
以此为思路,则修改和删除的测试方法,不再需要依赖于新增学生的测试方法,则每个测试可以独立进行。
现在我们将StudentServiceWithPriorityUnitTest进行改写:
public class StudentServiceWithoutPriorityUnitTest
{
StudentService _studentService;
public StudentServiceWithoutPriorityUnitTest()
{
_studentService = new StudentService();
}
[Fact]
public Student Insert_A_Student()
{
var data = new Student()
{
Name = "test name"
};
_studentService.Insert(data);
data.ShouldNotBeNull();
return data;
}
[Fact]
public void Update_A_Student()
{
var data = Insert_A_Student();
data.Name = "update student name";
_studentService.Update(data).ShouldBeTrue();
}
[Fact]
public void Update_A_Student_Failed()
{
var data = new Student()
{
Id = Guid.NewGuid(),
Name = "test name"
};
Should.Throw<DataNotExistException>(() => _studentService.Update(data));
}
[Fact]
public void Get_A_Student()
{
var data = Insert_A_Student();
var getData = _studentService.Get(data.Id);
getData.ShouldNotBeNull();
getData.Id.ShouldBeEquivalentTo(data.Id);
}
[Fact]
public void Get_A_Student_Failed()
{
Should.Throw<DataNotExistException>(() => _studentService.Get(Guid.NewGuid()));
}
[Fact]
public void Delete_A_Student()
{
var data = Insert_A_Student();
_studentService.Delete(data.Id);
}
[Fact]
public void Delete_A_Student_Failed()
{
Should.Throw<DataNotExistException>(() => _studentService.Delete(Guid.NewGuid()));
}
}
示例代码
StudentServiceWithoutPriorityUnitTest
参考资料
学习技术最好的文档就是【官方文档】,没有之一。
还有学习资料【Microsoft Learn】、【CSharp Learn】、【My Note】。
如果,你认为阅读这篇博客让你有些收获,不妨点击一下右下角的【推荐】按钮。
如果,你希望更容易地发现我的新博客,不妨点击一下【关注】。