之前我们介绍了如何在单元测试中设置优先级,以一定的顺序执行单元测试。但根据对单元测试排序和.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