Util應用框架快速入門(4) - 集成測試開發入門

来源:https://www.cnblogs.com/xiadao521/archive/2023/10/26/17789607.html
-Advertisement-
Play Games

本文演示Util應用框架開發的項目中如何編寫集成測試. 準備 完成 Web Api 快速入門,本文將在之前生成的示例項目上講解集成測試的開發. 測試概述 自動化測試對於Util應用框架的開發非常重要,它能保證基礎功能的穩定性. 對於使用 Util 開發的業務項目,自動化測試不是必須的,但掌握它可能很 ...


本文演示Util應用框架開發的項目中如何編寫集成測試.

準備

完成 Web Api 快速入門,本文將在之前生成的示例項目上講解集成測試的開發.

測試概述

自動化測試對於Util應用框架的開發非常重要,它能保證基礎功能的穩定性.

對於使用 Util 開發的業務項目,自動化測試不是必須的,但掌握它可能很有用.

如果你使用 Util 開發 Web API,可能會使用 Swagger 進行測試.

將 Swagger 提供給前端人員是合適的,但後端人員使用它卻不夠省力.

原因很簡單,使用 Swagger 測試 API,需要設置一堆參數,這些參數無法保存,每次運行都需要設置.

使用 .Net 自動化測試會更加方便,並且現在開發集成測試的成本很低.

專業測試的分類非常細,下麵簡要討論自動化功能測試.

測試分類

這裡粗略的對自動化功能測試概括為兩類:

  • 單元測試

    • 隔絕外部依賴,僅測試自身的某些功能.
    • 如果需要訪問外部依賴,通過定義抽象介面的方式使用,不能直接引用.
    • 在 Util 分層架構中,一般對領域層實體,值對象,領域服務實施單元測試.
  • 集成測試

    • 直接訪問外部依賴,對關聯的所有類型進行測試.
    • 在 Util 分層架構中,一般對基礎設施層倉儲,應用層應用服務和API介面進行集成測試.

測試的好處

修改任何一行業務代碼,都有可能影響之前的邏輯.

自動化測試基於對業務功能的預期反應,如果預期未發生變化,但你的代碼邏輯出現變化,就能幫你攔截這個錯誤.

測試的弊端

  • 除了開發自動化測試本身的成本以外,更大的成本在於維護.

  • 每當需求變更,需要刪除已經過時的測試,開發新的測試,修改之前的測試以符合當前預期.

測試編寫條件

自動化測試的語法非常簡單,但並不是掌握了測試語法就能編寫出有效的測試.

編寫單元測試需要開發人員有一定抽象思維,能夠抽象和隔離依賴,還需要瞭解一些單元測試技巧.

不要在公司全面推行單元測試,容易變成形式主義,僅讓團隊核心骨幹對高價值業務模塊編寫單元測試.

集成測試則要簡單得多,只要懂得測試語法就可以編寫.

集成測試由於直接訪問外部依賴,運行緩慢,而且任何環節變更都可能導致測試失敗,所以不宜大量編寫.

你是否需要它?

  • 如果你僅負責編寫 Web API ,手頭沒有現成的UI進行測試,編寫集成測試比使用 Swagger 省力.

  • 如果你沒有打算持續維護這些測試,不要編寫它們,那隻會浪費時間.

  • 如果你的團隊精力有限,無法維護大量的測試,可以僅對高業務價值的模塊編寫測試.

測試框架選型

  • 測試框架

  • 模擬框架

    • Moq - 為依賴服務介面創建模擬實現.
  • 數據偽造框架

Util集成測試開發入門

單元測試用於測試複雜的業務邏輯,由於快速入門Demo僅包含簡單CRUD操作,無法演示單元測試的用法.

下麵介紹在Util項目中如何開發集成測試.

運行示例項目

打開示例項目解決方案 Demo.sln,查看 test 子目錄,它包含4個測試項目.

image

生成的測試項目已經將環境配置完成,你可以直接開始編寫測試.

Demo.Domain.Tests 是領域層的單元測試項目,如果你不需要編寫單元測試,直接刪掉它.

其它三個項目用於集成測試,下麵分別介紹.

數據訪問層集成測試

Demo.Data.SqlServer.Tests 是數據訪問層 Sql Server 集成測試項目.

如果支持多種資料庫,則每種資料庫應包含一個數據訪問層集成測試項目.

數據訪問層測試的重點是倉儲.

打開 StudentRepositoryTest 學生倉儲測試類.

image

在 StudentRepositoryTest 的構造方法中註入了依賴介面 IDemoUnitOfWork 和 IStudentRepository.

Util 代碼生成模板預設會創建 TestAddAsync 方法,它用於測試添加實體.

該測試使用偽數據生成框架創建學生實體,並通過倉儲保存到資料庫.

不宜編寫過多的CRUD集成測試,通常保留一兩個即可.

它們的作用不是測試邏輯,而是迅速識別開發環境是否通暢.

特別是當你升級框架或類庫時,有幾個簡單的集成測試非常有用.

運行數據訪問層集成測試

打開 appsettings.Development.json 配置文件,檢查連接字元串是否正確.

{
    "ConnectionStrings": {
        "connection": "Server=.;Database=Demo.Data.Test;uid=sa;pwd=Pass@word;TrustServerCertificate=true"
    }
}

Demo示例的數據訪問層測試資料庫名為 Demo.Data.Test ,運行測試時, EntityFrameworkCore 會自動創建和刪除測試資料庫,非常方便.

使用 Visual Studio 運行測試

右鍵單擊 TestAddAsync 方法,彈出菜單選擇 運行測試.

image

彈出 測試資源管理器 視窗,並自動運行測試.

image

使用 Resharper 運行測試

如果你安裝了Resharper, VS中的測試方法會在左側顯示測試圖標,如下圖所示.

image

點擊 Run 按鈕,運行測試.

image

應用層集成測試

應用層集成測試包含 Demo.Application.TestsDemo.Api.Tests 兩個測試項目.

應用服務集成測試

Demo.Application.Tests 側重於測試應用服務,並且沒有Asp.Net Core相關環境干擾.

對於普通項目,大多業務邏輯會寫到應用服務中, 所以它是比較理想的測試場所.

如果你不想維護太多測試項目,那麼僅保留應用服務集成測試即可.

打開 StudentServiceTest 測試類,代碼生成模板預設也創建了一個 TestCreateAsync 測試方法.

/// <summary>
/// 學生服務測試
/// </summary>
public class StudentServiceTest {
    /// <summary>
    /// 學生服務
    /// </summary>
    private readonly IStudentService _service;

    /// <summary>
    /// 測試初始化
    /// </summary>
    public StudentServiceTest( IStudentService service ) {
        _service = service;
    }

    /// <summary>
    /// 測試創建
    /// </summary>
    [Fact]
    public async Task TestCreateAsync() {
        //創建
        var dto = StudentDtoFakeService.GetStudentDto();
        var id = await _service.CreateAsync( dto );

        //驗證
        var result = await _service.GetByIdAsync( id );
        Assert.NotNull( result );
        Assert.Equal( id, result.Id );
    }
}

StudentServiceTest 從構造方法註入了 IStudentService 應用服務介面.

使用偽數據生成框架創建DTO,並調用服務保存數據.

Web Api集成測試

Demo.Api.Tests 用於測試 Web Api控制器,它的測試環境要複雜一些.

打開 StudentControllerTest 測試類.

/// <summary>
/// 學生控制器測試
/// </summary>
public class StudentControllerTest : TestBase {
    /// <summary>
    /// 輸出工具
    /// </summary>
    private readonly ITestOutputHelper _testOutputHelper;

    /// <summary>
    /// 測試初始化
    /// </summary>
    public StudentControllerTest( ITestOutputHelperAccessor testOutputHelperAccessor,IHttpClient client ) : base( client ){
        _testOutputHelper = testOutputHelperAccessor.Output;
    }

    /// <summary>
    /// 測試創建
    /// </summary>
    [Fact]
    public async Task TestCreateAsync() {
        //服務地址
        var url = "/api/student";

        //創建實體
        var dto = StudentDtoFakeService.GetStudentDto();
        var result = await PostAsync<StudentDto>( url, dto );

        //驗證
        Assert.Equal( StateCode.Ok, result.Code );
        Assert.NotEmpty( result.Data.Id );
        _testOutputHelper.WriteLine( Json.ToJson( result ) );
    }
}

Web Api的測試需要發送請求給控制器,並接收響應結果,所以需要一個Http客戶端.

StudentControllerTest 構造方法註入 Util Http客戶端介面,將介面傳遞給 TestBase 基類.

TestBase 進一步封裝對 GET, POST ,PUT ,DELETE 操作請求,以簡化測試的編寫.

預設生成的 TestCreateAsync 方法,使用偽數據生成框架創建DTO, 並使用 Post 請求指定 Url.

Web Api 控制器返回 Util 約定的特定消息.

對於開發 Web Api, 該集成測試能更好的反映與前端的交互.

運行 Web Api集成測試,如下所示.

image

Util應用框架交流群: 24791014 版權所有,轉載請註明出處 何鎮汐的技術博客 微信掃描二維碼支持Util
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 頁面路由指在應用程式中實現不同頁面之間的跳轉和數據傳遞。HarmonyOS提供了Router模塊,通過不同的url地址,可以方便地進行頁面路由,輕鬆地訪問不同的頁面。 一、基礎使用 Router模塊提供了兩種跳轉模式,分別是router.pushUrl()和router.replaceUrl()。這 ...
  • ArkTS是HarmonyOS優選的主力應用開發語言。ArkTS圍繞應用開發在TypeScript(簡稱TS)生態基礎上做了進一步擴展,繼承了TS的所有特性,是TS的超集。 ArkTS在TS的基礎上主要擴展瞭如下能力: 基本語法:ArkTS定義了聲明式UI描述、自定義組件和動態擴展UI元素的能力,再 ...
  • 01. 背景 最近項目需求里有個文件上傳功能,而客戶需求里的文件基本上是比較大的,基本上得有 1 GiB 以上的大小,而上傳大文件尤其是讀大文件,可能會造成卡 UI 或者說點不動的問題。而用後臺的 Worker 去實現是一個比較不錯的解決辦法。 02. 原理講解 02.01. Shared Work ...
  • 在前端編程中,處理一些簡短、快速的操作,在主線程中就可以完成。 但是,在處理一些耗時比較長以至於比較明顯的事情,比如讀取一個大文件或者發出一個網路請求,就需要子線程來完成,以避免只用單線程時造成頁面一時無法響應的事情。 以發送網路請求為例,在以往的JavaScript中,使用多個回調函數來處理請求返 ...
  • 本文簡介 帶尬猴,我是德育處主任 Fabric.js 有圖案畫筆功能,這個功能可以簡單理解成“刮刮卡”效果。 如果只是看 Fabric.js 文檔可能還不太明白 圖案畫筆 PatternBrush 是如何使用。 本文將講解如何配置這款畫筆的基礎屬性。 圖案畫筆(筆刷) PatternBrush 先看 ...
  • 一、什麼是JavaScript JavaScript是用於實現用戶交互、動態控制文檔的外觀和內容,動態控制瀏覽器操作、創建cookies等網頁行為的跨平臺、跨瀏覽器的由瀏覽器解釋執行的客戶端腳本語言 二、JavaScript的三種引入方式 1、引入.js尾碼的文件,註意一般外部引入js的文件,放在b ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 業務場景: 產品有個功能是設置主題。類似手機自動切換壁紙,以及其他功能顏色,icon,字體等。 管理員需要在後端管理系統多次下載不同主題,(至於要幹啥就不說了...),主題中可能有 30 ~ 100個高清壁紙, icon 等。現在每次下載 ...
  • Kafka 介紹 Kafka 是一個開源的分散式流式平臺,它可以處理大量的實時數據,並提供高吞吐量,低延遲,高可靠性和高可擴展性。Kafka 的核心組件包括生產者(Producer),消費者(Consumer),主題(Topic),分區(Partition),副本(Replica),日誌(Log), ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...