diff --git a/xUnitStudy.Model/xUnitStudy.Model.csproj b/xUnitStudy.Model/xUnitStudy.Model.csproj
index 0c99b2e..cf2080f 100644
--- a/xUnitStudy.Model/xUnitStudy.Model.csproj
+++ b/xUnitStudy.Model/xUnitStudy.Model.csproj
@@ -46,6 +46,7 @@
+
diff --git a/xUnitStudy.Model/xUnitStudy/FixtureDemo.cs b/xUnitStudy.Model/xUnitStudy/FixtureDemo.cs
new file mode 100644
index 0000000..49b6ddb
--- /dev/null
+++ b/xUnitStudy.Model/xUnitStudy/FixtureDemo.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace xUnitStudy.Model
+{
+ ///
+ /// 测试方法共享对象实例
+ ///
+ public class FixtureDemo : IDisposable
+ {
+ public int CallTimes { get; private set; }
+ public List Persons;
+ public FixtureDemo()
+ {
+ Persons = new List()
+ {
+ new Person(){ Id=1, FirstName="first1",LastName="last1" },
+ new Person(){ Id=2, FirstName="first2",LastName="last2" },
+ new Person(){ Id=3, FirstName="first3",LastName="last3" },
+ };
+ }
+
+ public (bool result, Person person) AddPerson(Person person)
+ {
+ CallTimes += 1;
+
+ var exist = Persons.FirstOrDefault(p => p.Id == person.Id);
+ if (exist == null)
+ {
+ Persons.Add(person);
+ return ValueTuple.Create(true, person);
+ }
+ else
+ {
+ return ValueTuple.Create(false, person);
+ }
+ }
+
+ public (bool result, Person person) RemovePerson(Person person)
+ {
+ CallTimes += 1;
+
+ var exist = Persons.FirstOrDefault(p => p.Id == person.Id);
+ if (exist == null)
+ {
+ return ValueTuple.Create(false, person);
+ }
+ else
+ {
+ Persons.Remove(exist);
+ return ValueTuple.Create(true, exist);
+ }
+ }
+
+ public void Dispose()
+ {
+ Persons = null;
+ }
+ }
+}
diff --git a/xUnitStudy.WebApi.Test/TestCaseOrdererTest.cs b/xUnitStudy.WebApi.Test/TestCaseOrdererTest.cs
new file mode 100644
index 0000000..d96b072
--- /dev/null
+++ b/xUnitStudy.WebApi.Test/TestCaseOrdererTest.cs
@@ -0,0 +1,34 @@
+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;
+
+namespace xUnitStudy.WebApi.Test
+{
+ ///
+ /// 输出窗口的测试选项,显示测试相关信息
+ ///
+ public class TestCaseOrdererTest: ITestCaseOrderer
+ {
+ private readonly IMessageSink diagnosticMessageSink;
+
+ public TestCaseOrdererTest(IMessageSink diagnosticMessageSink)
+ {
+ this.diagnosticMessageSink = diagnosticMessageSink;
+ }
+
+ public IEnumerable OrderTestCases(IEnumerable testCases) where TTestCase : ITestCase
+ {
+ var result = testCases.ToList(); // Run them in discovery order
+ var message = new DiagnosticMessage("Ordered {0} test cases", result.Count);
+ diagnosticMessageSink.OnMessage(message);
+ return result;
+ }
+ }
+}
diff --git a/xUnitStudy.WebApi.Test/UseXUnitIClassFixtureTest.cs b/xUnitStudy.WebApi.Test/UseXUnitIClassFixtureTest.cs
index 6ea420b..c7deab7 100644
--- a/xUnitStudy.WebApi.Test/UseXUnitIClassFixtureTest.cs
+++ b/xUnitStudy.WebApi.Test/UseXUnitIClassFixtureTest.cs
@@ -4,9 +4,87 @@ 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
+ ///
+ /// 类内所有测试,共享一个实例
+ /// 注意:因为不能保证各个单元测试的执行先后顺序或者特别是并行单元测试时,
+ /// 很容因共享类的并发操作导致单元测试失败。共享须谨慎。
+ /// 适合读,不适合写
+ ///
+ 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()
+ {
+
+ }
}
}
diff --git a/xUnitStudy.WebApi.Test/UseXUnitOutputTest.cs b/xUnitStudy.WebApi.Test/UseXUnitOutputTest.cs
index 0c917e3..116d5dd 100644
--- a/xUnitStudy.WebApi.Test/UseXUnitOutputTest.cs
+++ b/xUnitStudy.WebApi.Test/UseXUnitOutputTest.cs
@@ -3,10 +3,25 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using Xunit;
+using Xunit.Abstractions;
namespace xUnitStudy.WebApi.Test
{
public class UseXUnitOutputTest
{
+ private readonly ITestOutputHelper output;
+ public UseXUnitOutputTest(ITestOutputHelper output)
+ {
+ this.output = output;
+ }
+
+ [Fact]
+ public void Test()
+ {
+ Assert.True(true, "输出测试");
+
+ output.WriteLine("我是输出测试信息哦。");
+ }
}
}
diff --git a/xUnitStudy.WebApi.Test/app.config b/xUnitStudy.WebApi.Test/app.config
index 564f9c6..88b58bf 100644
--- a/xUnitStudy.WebApi.Test/app.config
+++ b/xUnitStudy.WebApi.Test/app.config
@@ -1,5 +1,8 @@
+
+
+
diff --git a/xUnitStudy.WebApi.Test/xUnitStudy.WebApi.Test.csproj b/xUnitStudy.WebApi.Test/xUnitStudy.WebApi.Test.csproj
index 20ec6eb..4b3f0dc 100644
--- a/xUnitStudy.WebApi.Test/xUnitStudy.WebApi.Test.csproj
+++ b/xUnitStudy.WebApi.Test/xUnitStudy.WebApi.Test.csproj
@@ -84,6 +84,7 @@
+