有的時候我們會對程序進(jìn)行單元測試, 為了測試的效果以及后期的維護(hù), 我一般會將各個測試拆開, 根據(jù)需要測試的類分到各個類型中, 不過在實(shí)際操作的時候就出現(xiàn)了一些意想不到的問題, 各個測試的執(zhí)行是亂序的, 按照我自己寫測試的習(xí)慣, 假如我需要測試新寫的增刪改查的功能, 我會將增刪改查分開測試, 會按照 新增-->查詢-->修改-->刪除 這樣的順序編寫, 在我的預(yù)想中新增操作應(yīng)當(dāng)是最先執(zhí)行的, 但是在實(shí)際的運(yùn)行過程中完全不是這樣, 隨機(jī)的順序?qū)@樣的測試會有巨大的影響
所以就需要控制測試的執(zhí)行順序
為測試用例排序
一般而言, 我們會將增刪改查全都放在一個測試集中
public class UserInfoTest
{
[Fact]
public void AddTest()
{
}
[Fact]
public void ReadTest()
{
}
[Fact]
public void UpdateTest()
{
}
[Fact]
public void DeleteTest()
{
}
}
上面就是增刪查改的測試用例, 盡管在寫的時候看起來是按照我所希望的那樣進(jìn)行排序的, 但是在實(shí)際的執(zhí)行過程卻有可能是完全亂序的, 而我需要他們按照上面的順序執(zhí)行
實(shí)現(xiàn)ITestCaseOrderer
Xunit 中有一個 TestCaseOrdererAttribute
, 加在測試類上時可以對測試類中包含的測試用例進(jìn)行排序
但若是需要讓 TestCaseOrdererAttribute
起效, 我們還需要實(shí)現(xiàn)一個接口 ITestCaseOrderer
public class TestOrders : ITestCaseOrderer
{
public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
{
var result = testCases.ToList();
return result;
}
}
通過實(shí)現(xiàn) ITestCaseOrderer
我們可以獲取到測試用例, 之后只需要將測試用例重新進(jìn)行排序, 排序成預(yù)期中需要的順序即可
最簡單的就是根據(jù)名字來進(jìn)行排序, 此時只需要使用 result.OrderBy(item => item.DisplayName)
就差不多可以了
但是為了嚴(yán)謹(jǐn)以及后續(xù)的可維護(hù)性, 最好在做一個新的 Attribute
對需要排序的測試用例進(jìn)行標(biāo)記
新建OrderAttribute
[AttributeUsage(AttributeTargets.Method)]
public class OrderAttribute : Attribute
{
public int Sort { get; set; }
public OrderAttribute(int sort)
{
this.Sort = sort;
}
}
OrderAttribute
的構(gòu)成非常簡單, 其中只包含一個 Sort
用來進(jìn)行排序
完善TestOrders的實(shí)現(xiàn)
public class TestOrders : ITestCaseOrderer
{
public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
{
var typeName = typeof(OrderAttribute).AssemblyQualifiedName;
var result = testCases.ToList();
result.Sort((x, y) =>
{
var xOrder = x.TestMethod.Method.GetCustomAttributes(typeName)?.FirstOrDefault();
if (xOrder == null)
{
return 0;
}
var yOrder = y.TestMethod.Method.GetCustomAttributes(typeName)?.FirstOrDefault();
if (yOrder == null)
{
return 0;
}
var sortX = xOrder.GetNamedArgument<int>("Sort");
var sortY = yOrder.GetNamedArgument<int>("Sort");
return sortX - sortY;
});
return result;
}
}
完善 TestOrders
的實(shí)現(xiàn), 使得測試用例可以按照順序進(jìn)行排序
測試用例打標(biāo)
[TestCaseOrderer("TestOrders這個類型所在的namespace.TestOrders", "TestOrders這個類型所在的namespace")]
public class UserInfoTest
{
[Fact, Order(0)]
public void AddTest()
{
}
[Fact, Order(1)]
public void ReadTest()
{
}
[Fact, Order(2)]
public void UpdateTest()
{
}
[Fact, Order(3)]
public void DeleteTest()
{
}
}
TestCaseOrdererAttribute
接收兩個參數(shù), 一個是可以用來確定之前實(shí)現(xiàn)的 TestOrders
的完整命名空間, 第二個是 TestOrders
所在的命名空間
這兩個參數(shù)主要的功能就是確定 TestOrders
的位置, Xunit會根據(jù)這兩個參數(shù)找到 TestOrders
并且調(diào)用排序的方法文章來源:http://www.zghlxwxcb.cn/news/detail-745391.html
然后在需要進(jìn)行排序的測試用例上使用 [Order]
打標(biāo), 傳入自定義的排序, 然后在我們使用 dotnet test
就會按照傳入的排序執(zhí)行測試用例了文章來源地址http://www.zghlxwxcb.cn/news/detail-745391.html
到了這里,關(guān)于自定義xunit測試用例的執(zhí)行順序的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!