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;
+}