using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; using Xunit.Extensions; using Xunit.Sdk; using xUnitStudy.Model; namespace xUnitStudy.WebApi.Test { /// /// 类内所有测试,共享一个实例 /// 注意:因为不能保证各个单元测试的执行先后顺序或者特别是并行单元测试时, /// 很容因共享类的并发操作导致单元测试失败。共享须谨慎。 /// 适合读,不适合写 /// public class UseXUnitIClassFixtureTest:IClassFixture, IDisposable { FixtureDemo fixtureDemo; public UseXUnitIClassFixtureTest(FixtureDemo fixture) { this.fixtureDemo = fixture; } [Fact] public void NotNull_Test() { Assert.NotNull(fixtureDemo); } [Fact] public void GetPersons_Test() { var persons = fixtureDemo.Persons; //因为共享,所以数量不一定是初始值3 //Assert.Equal(3,fixtureDemo.Persons.Count); } [Fact] public void AddPerson_Test() { var callTimes_start = fixtureDemo.CallTimes; var person1 = new Person() { Id=1,FirstName="first",LastName="last"}; var person2 = new Person() {Id=200}; //因为共享,在不能保证单元测试的执行先后顺充时,或者并行执行单元测试时,可能id=1的项已被删除,也可能没被删除 //所以,result1可能失败,也可能成功 var result1 = fixtureDemo.AddPerson(person1); var result2 = fixtureDemo.AddPerson(person2); //Assert.False(result1.result); 执行成功与否,取决于添加和删除单元测试的执行顺序。因为执行顺序不能确定,所以结果不定。 Assert.True(result2.result); Assert.Equal(4, fixtureDemo.Persons.Count); Assert.Contains(person2, fixtureDemo.Persons); var callTimes_end = fixtureDemo.CallTimes; Assert.Equal(2, callTimes_end - callTimes_start); } [Fact] public void RemovePerson_Test() { var person1 = new Person() { Id = 1, FirstName = "first", LastName = "last" }; var person2 = new Person() { Id = 100 }; var result1 = fixtureDemo.RemovePerson(person1); var result2 = fixtureDemo.RemovePerson(person2); Assert.True(result1.result); Assert.False(result2.result); Assert.DoesNotContain(person1, fixtureDemo.Persons); Assert.DoesNotContain(person2, fixtureDemo.Persons); } public void Dispose() { } } }