diff --git a/Server/ServerTest/DirFileOpTest.cs b/Server/ServerTest/DirFileOpTest.cs index a401fad..4776d29 100644 --- a/Server/ServerTest/DirFileOpTest.cs +++ b/Server/ServerTest/DirFileOpTest.cs @@ -1,24 +1,36 @@ using Common; -using Xunit; - +using XUnit.Project.Attributes; /*using Newtonsoft.Json;*/ namespace ServerTest; - +/// +/// xUnit将会对每个测试方法创建一个测试上下文,IClassFixture可以用来创建类中共享测试上下文, +/// +/// XUnit 的测试方法不是按照顺序执行,所以注意对象状态 +/// +/// 一般单元测试,每个测试函数应当是独立的,不让它们按照顺序执行,在一般情况下是最好的做法,参考 +/// https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices +/// 目前涉及到一些文件的同步,所以按照顺序执行相对较好,这使用了xUnit的方法使它们按照顺序执行 +/// +/// +[TestCaseOrderer( + ordererTypeName: "XUnit.Project.Orderers.PriorityOrderer", + ordererAssemblyName: "ServerTest" +)] public class DirFileOpTest : IDisposable { private readonly FilesSeed filesSeed = new(); public void Dispose() { - //filesSeed.Dispose(); + filesSeed.Dispose(); GC.SuppressFinalize(this); } /// /// 测试文件目录写入和提取 /// - [Fact] + [Fact, TestPriority(0)] public void FileDirWriteExtract() { filesSeed.NewDir.WriteByThisInfo(filesSeed.fileDirOp); @@ -34,7 +46,7 @@ public class DirFileOpTest : IDisposable /// /// 测试文件差异比较 /// - [Fact] + [Fact, TestPriority(1)] public void FileDirDiff() { var cDDir = filesSeed.NewDir.Diff(filesSeed.OldDir); @@ -49,7 +61,7 @@ public class DirFileOpTest : IDisposable /// /// 测试同步是否成功 /// - [Fact] + [Fact, TestPriority(2)] public void SyncFileDir() { filesSeed.OldDir.WriteByThisInfo(filesSeed.fileDirOp); @@ -63,7 +75,7 @@ public class DirFileOpTest : IDisposable /// /// 测试文件合并 /// - [Fact] + [Fact, TestPriority(3)] public void DirsCombine() { filesSeed.OldDir.CombineJustObject(filesSeed.DiffDir); @@ -73,18 +85,18 @@ public class DirFileOpTest : IDisposable Assert.True(filesSeed.OldDir.IsEqual(filesSeed.NewDir), "合并结果不一致!"); } - [Fact] - public void Tt() - { - filesSeed.NewDir.WriteByThisInfo(filesSeed.fileDirOp); - var c = new FileDirOpForPack(filesSeed.NewDir.FormatedPath, filesSeed.TestPath + "/"); - c.FinallyCompress(); + // [Fact] + // public void Tt() + // { + // filesSeed.NewDir.WriteByThisInfo(filesSeed.fileDirOp); + // var c = new FileDirOpForPack(filesSeed.NewDir.FormatedPath, filesSeed.TestPath + "/"); + // c.FinallyCompress(); - var d = new FileDirOpForUnpack( - filesSeed.TestPath + "/", - filesSeed.TestPath + "/", - c.SyncId - ); - d.FirstUnComparess(); - } + // var d = new FileDirOpForUnpack( + // filesSeed.TestPath + "/", + // filesSeed.TestPath + "/", + // c.SyncId + // ); + // d.FirstUnComparess(); + // } } diff --git a/Server/ServerTest/PriorityOrderer.cs b/Server/ServerTest/PriorityOrderer.cs new file mode 100644 index 0000000..519cd6d --- /dev/null +++ b/Server/ServerTest/PriorityOrderer.cs @@ -0,0 +1,41 @@ +using Xunit.Abstractions; +using Xunit.Sdk; +using XUnit.Project.Attributes; + +namespace XUnit.Project.Orderers; + +public class PriorityOrderer : ITestCaseOrderer +{ + public IEnumerable OrderTestCases( + IEnumerable testCases) where TTestCase : ITestCase + { + string assemblyName = typeof(TestPriorityAttribute).AssemblyQualifiedName!; + var sortedMethods = new SortedDictionary>(); + foreach (TTestCase testCase in testCases) + { + int priority = testCase.TestMethod.Method + .GetCustomAttributes(assemblyName) + .FirstOrDefault() + ?.GetNamedArgument(nameof(TestPriorityAttribute.Priority)) ?? 0; + + GetOrCreate(sortedMethods, priority).Add(testCase); + } + + foreach (TTestCase testCase in + sortedMethods.Keys.SelectMany( + priority => sortedMethods[priority].OrderBy( + testCase => testCase.TestMethod.Method.Name))) + { + Console.WriteLine(testCase); + yield return testCase; + } + } + + private static TValue GetOrCreate( + IDictionary dictionary, TKey key) + where TKey : struct + where TValue : new() => + dictionary.TryGetValue(key, out TValue? result) + ? result + : (dictionary[key] = new TValue()); +} diff --git a/Server/ServerTest/TestPriorityAttribute.cs b/Server/ServerTest/TestPriorityAttribute.cs new file mode 100644 index 0000000..690076b --- /dev/null +++ b/Server/ServerTest/TestPriorityAttribute.cs @@ -0,0 +1,9 @@ +namespace XUnit.Project.Attributes; + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] +public class TestPriorityAttribute : Attribute +{ + public int Priority { get; private set; } + + public TestPriorityAttribute(int priority) => Priority = priority; +}