自定義xunit測試用例的執行順序

来源:https://www.cnblogs.com/CollapseNav/archive/2023/11/06/17812235.html
-Advertisement-
Play Games

有的時候我們會對程式進行單元測試, 為了測試的效果以及後期的維護, 我一般會將各個測試拆開, 根據需要測試的類分到各個類型中, 不過在實際操作的時候就出現了一些意想不到的問題, 各個測試的執行是亂序的, 按照我自己寫測試的習慣, 假如我需要測試新寫的增刪改查的功能, 我會將增刪改查分開測試, 會按照 ...


有的時候我們會對程式進行單元測試, 為了測試的效果以及後期的維護, 我一般會將各個測試拆開, 根據需要測試的類分到各個類型中, 不過在實際操作的時候就出現了一些意想不到的問題, 各個測試的執行是亂序的, 按照我自己寫測試的習慣, 假如我需要測試新寫的增刪改查的功能, 我會將增刪改查分開測試, 會按照 新增-->查詢-->修改-->刪除 這樣的順序編寫, 在我的預想中新增操作應當是最先執行的, 但是在實際的運行過程中完全不是這樣, 隨機的順序對這樣的測試會有巨大的影響

所以就需要控制測試的執行順序

為測試用例排序

一般而言, 我們會將增刪改查全都放在一個測試集中

public class UserInfoTest
{
    [Fact]
    public void AddTest()
    {
    }
    [Fact]
    public void ReadTest()
    {
    }
    [Fact]
    public void UpdateTest()
    {
    }
    [Fact]
    public void DeleteTest()
    {
    }
}

上面就是增刪查改的測試用例, 儘管在寫的時候看起來是按照我所希望的那樣進行排序的, 但是在實際的執行過程卻有可能是完全亂序的, 而我需要他們按照上面的順序執行

實現ITestCaseOrderer

Xunit 中有一個 TestCaseOrdererAttribute, 加在測試類上時可以對測試類中包含的測試用例進行排序

但若是需要讓 TestCaseOrdererAttribute 起效, 我們還需要實現一個介面 ITestCaseOrderer

public class TestOrders : ITestCaseOrderer
{
    public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
    {
        var result = testCases.ToList();
        return result;
    }
}

通過實現 ITestCaseOrderer 我們可以獲取到測試用例, 之後只需要將測試用例重新進行排序, 排序成預期中需要的順序即可

最簡單的就是根據名字來進行排序, 此時只需要使用 result.OrderBy(item => item.DisplayName) 就差不多可以了

但是為了嚴謹以及後續的可維護性, 最好在做一個新的 Attribute 對需要排序的測試用例進行標記

新建OrderAttribute

[AttributeUsage(AttributeTargets.Method)]
public class OrderAttribute : Attribute
{
    public int Sort { get; set; }
    public OrderAttribute(int sort)
    {
        this.Sort = sort;
    }
}

OrderAttribute 的構成非常簡單, 其中只包含一個 Sort 用來進行排序

完善TestOrders的實現

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 的實現, 使得測試用例可以按照順序進行排序

測試用例打標

[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 接收兩個參數, 一個是可以用來確定之前實現的 TestOrders 的完整命名空間, 第二個是 TestOrders 所在的命名空間

這兩個參數主要的功能就是確定 TestOrders 的位置, Xunit會根據這兩個參數找到 TestOrders 並且調用排序的方法

然後在需要進行排序的測試用例上使用 [Order] 打標, 傳入自定義的排序, 然後在我們使用 dotnet test 就會按照傳入的排序執行測試用例了


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 插值運算是一種數據處理方法,主要用來填補數據之間的空白或缺失值。因為在實際應用中,數據往往不是完整的,而是存在著空白或缺失值,這些空白或缺失值可能是由於數據採集困難、數據丟失或數據處理錯誤等原因造成的。如果直接使用這些空白或缺失值進行分析和預測,將會對結果造成很大的影響。 插值運算可以用來填補這些空 ...
  • 是極致魅惑、灑脫自由的Java heap space?是知性柔情、溫婉大氣的GC overhead limit exceeded?是純真無邪、活潑可愛的Metaspace?如果以上不是你的菜,那還有……刁蠻任性,無跡可尋的CodeCache!性感火辣、心思細膩的Direct Memory高貴冷艷,獨... ...
  • JMM 請你談談對Volatile的理解 Volatile是java虛擬機提供的輕量級的同步機制 1、保證可見性 2、不保證原子性 3、禁止指令重排 什麼是JMM JVM->java虛擬機 JMM->java記憶體模型,不存在的東西,概念!約定 關於JMM的一些同步的約定: 線程解鎖前,必須把共用變數 ...
  • Go 介面-契約介紹 目錄Go 介面-契約介紹一、介面基本介紹1.1 介面類型介紹1.2 為什麼要使用介面1.3 面向介面編程1.4 介面的定義二、空介面2.1 空介面的定義2.2 空介面的應用2.2.1 空介面作為函數的參數2.2.2 空介面作為map的值2.3 介面類型變數2.4 類型斷言三、盡 ...
  • 實踐環境 Python 3.6.2 confluent-kafka 2.2.0 confluent-kafka簡介 Confluent在GitHub上開發和維護的confluent-kafka-python,Apache Kafka®的一個python客戶端,提供了一個與所有brokers>=v0. ...
  • 一:背景 1. 講故事 這段時間分析了幾個和網路故障有關的.NET程式之後,真的越來越體會到電腦基礎課的重要,比如 電腦網路 課,如果沒有對 tcpip協議 的深刻理解,解決這些問題真的很難,因為你只能在高層做黑盒測試,你無法看到 tcp 層面的握手和psh通訊。 這篇我們通過兩個小例子來理解一 ...
  • Span 提供任意記憶體的連續區域的類型安全和記憶體安全表示形式。它是在堆棧而不是托管堆上分配的ref結構,是對任意記憶體塊的抽象 。 1.關於Span 在NET Core 2.1中首次引入 提供對任意記憶體上的連續區域的讀寫視圖 利用索引/迭代來修改範圍內的記憶體 幾乎無開銷 2.和記憶體的關係 Span 表 ...
  • Nexus 是支持 Nuget、Docker、Npm 等多種包的倉庫管理器,可用做私有包的存儲分發,緩存官方包。本篇將手把手教學使用 Nexus 搭建自己的 NuGe t& Docker 私有倉庫。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...