最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中實現(xiàn)契約測試的方法

 更新時間:2023年09月15日 09:02:19   作者:楊中科  
這篇文章主要介紹了C#中實現(xiàn)契約測試,在本文中,我將揭開契約測試的神秘面紗,并向您展示如何在 C# 項目中實現(xiàn)它,需要的朋友可以參考下

在軟件開發(fā)中,確保微服務(wù)和API的可靠性和穩(wěn)定性非常重要。 隨著應(yīng)用程序變得越來越復(fù)雜,對強(qiáng)大的測試策略的需求也越來越大,這些策略可以幫助團(tuán)隊在不犧牲敏捷性的情況下交付高質(zhì)量的代碼。 近年來獲得廣泛關(guān)注的一種方法是契約測試(Contract Testing)。 在本文中,我將揭開契約測試的神秘面紗,并向您展示如何在 C# 項目中實現(xiàn)它。

1. 術(shù)語

消費(fèi)者(Consumer):對服務(wù)進(jìn)行消費(fèi)的代碼,通常指的是客戶端。

提供者(Provider): 提供服務(wù)的代碼,通常指的是服務(wù)器端。

契約(Contract): 消費(fèi)者和提供者之間商定的協(xié)議。 它包括預(yù)期的請求(輸入)和響應(yīng)(輸出)。

2. 為什么需要契約測試?

構(gòu)建和維護(hù)微服務(wù)是一項艱巨的任務(wù)。 在眾多服務(wù)必須彼此無縫交互的世界中,確保對一項服務(wù)的更改不會破壞另一項服務(wù)的功能是很讓人頭疼的。 傳統(tǒng)的集成測試針對的是整個系統(tǒng)之間的交互,工作量太大、速度太慢,甚至無法直接識別問題。 與之相反的是,契約測試側(cè)重于測試各個服務(wù)之間的契約。 合同測試根據(jù)消費(fèi)者和提供商之間商定的契約分別對消費(fèi)者和提供商進(jìn)行測試。

3. 如何執(zhí)行契約測試

在契約測試中,消費(fèi)者端程序員編寫“消費(fèi)者測試”,其中包含期望的輸入和輸出,并且期望將被保存到 Pact Json 文件中。 運(yùn)行時,測試將請求發(fā)送到內(nèi)置的模擬服務(wù)器而不是真實服務(wù)器,模擬服務(wù)器使用保存的 Pact Json 文件發(fā)送響應(yīng),該響應(yīng)將用于驗證消費(fèi)者端測試用例。

此外,契約測試框架將讀取保存的 Pact Json 文件,并向服務(wù)提供者(服務(wù)器)發(fā)送請求,并且將根據(jù) Pact Json 文件中的預(yù)期輸出來驗證響應(yīng)。

4. What is Pact?

Pact 是合約測試的實現(xiàn)。 由于消費(fèi)者和提供者可能使用不同的編程語言進(jìn)行開發(fā),因此 Pact 是語言無關(guān)的,它支持多種編程語言,例如 Java、.NET、Ruby、JavaScript、Python、PHP 等。保存的 Pact Json 文件是由 用一種編程語言開發(fā)的消費(fèi)者可以用來驗證用另一種編程語言開發(fā)的提供者。

在本文中,消費(fèi)者和提供者都是使用.NET (C#) 開發(fā)的。 Pact.Net 是 Pact 在 .Net 中的實現(xiàn)。

5. 如何使用Pact.Net?

使用Pact.Net總共分三步:開發(fā)一個待測試的WebAPI服務(wù);編寫消費(fèi)者端測試用例;編寫提供者端測試用例。

a. 開發(fā)待測試的WebAPI服務(wù)

創(chuàng)建一個 ASP.Net Core WebAPI項目,然后如下編寫一個簡單的控制器。

[ApiController]
[Route("[controller]/[action]")]
public class MyController : ControllerBase
{
    [HttpGet]
    public int Abs(int i)
    {
        return Math.Abs(i);
    }
}

上面的控制器提供了一個計算給定整數(shù)的絕對值的簡單服務(wù)。

Pact需要使用ASP.Net Core項目的Startup類來啟動Web服務(wù)器,但是,在最新的.NET Core中,傳統(tǒng)的Startup.cs被Minimal API取代。如果 要將 Pact 與 .NET Core 一起使用,您必須切換到 傳統(tǒng)Startup 風(fēng)格的代碼,如果您不知道如何切換回傳統(tǒng)的Startup 風(fēng)格的代碼,請 搜索“Adding Back the Startup Class to ASP.NET Core”。

b. 編寫消費(fèi)者端測試用例

創(chuàng)建一個使用xUnit的.NET測試項目,然后在測試項目上安裝“PactNet”這個Nuget包。然后編寫如下的測試用例。

public class UnitTest1
{
    private readonly IPactBuilderV4 pactBuilder;
    public UnitTest1()
    {
        var pact = Pact.V4("MyAPI consumer", "MyAPI",new PactConfig());
        this.pactBuilder = pact.WithHttpInteractions();
    }
    [Fact]
    public async Task Test1()
    {
        this.pactBuilder.UponReceiving("A request to calc Abs")
            .Given("Abs")
            .WithRequest(HttpMethod.Get, "/My/Abs")
            .WithQuery("i","-2")//Match.Integer(-2) 
            .WillRespond()
            .WithStatus(HttpStatusCode.OK)
            .WithJsonBody(2);
        await this.pactBuilder.VerifyAsync(async ctx=>
        {
            using HttpClient httpClient = new HttpClient();
            httpClient.BaseAddress = ctx.MockServerUri;
            var r = await httpClient.GetFromJsonAsync<int>($"/My/Abs?i=-2");
            Assert.Equal(2,r);
        });
    }
}

“WithRequest().WithQuery()”用于定義輸入,“WillRespond().WithJsonBody()”用于定義相應(yīng)的預(yù)期輸出。VerifyAsync中的代碼片段是測試用例,根據(jù)“UponReceiving”定義的期望進(jìn)行測試。 從“httpClient.BaseAddress = ctx.MockServerUri”可以看出,Provider 測試用例與 Pact 提供的Mock服務(wù)器交互而不是真實服務(wù)器進(jìn)行交互。

接下來,讓我們運(yùn)行測試,測試運(yùn)行完成后,測試項目的pact文件夾下會生成一個“MyAPI Consumer-MyAPI.json”,這個Json文件中保存了預(yù)期的輸入和輸出,如下圖。

c. 編寫提供者端測試用例

創(chuàng)建一個使用xUnit的.NET測試項目,然后向其安裝 Nuget 包“PactNet”和“PactNet.Output.Xunit”。 由于提供程序測試必須使用 Startup 類啟動測試服務(wù)器,因此請將待測試的 ASP.NET Core WebAPI 項目的引用添加到提供程序測試項目中。

創(chuàng)建一個“MyApiFixture”類,用于啟動測試項目中測試的WebAPI服務(wù)器。MyApiFixture類的代碼如下:

public class MyApiFixture: IDisposable
{
    private readonly IHost server;
    public Uri ServerUri { get; }
    public MyApiFixture()
    {
        ServerUri = new Uri("http://localhost:9223");
        server = Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseUrls(ServerUri.ToString());
                webBuilder.UseStartup<Startup>();
            })
            .Build();
        server.Start();
    }
    public void Dispose()
    {
        server.Dispose();
    }
}

接下來,如下創(chuàng)建一個使用保存的Pact Json文件對服務(wù)器(提供者)進(jìn)行測試的測試用例。

public class MyApiTest1: IClassFixture<MyApiFixture>
{
    private readonly MyApiFixture fixture;
    private readonly ITestOutputHelper output;
    public MyApiTest1(MyApiFixture fixture,ITestOutputHelper output)
    {
        this.fixture = fixture;
        this.output = output;
    }
    [Fact]
    public async Task Test1()
    {
        var config = new PactVerifierConfig
        {
            Outputters = new List<IOutput>
            {
                new XunitOutput(output),
            },
        };
        string pactPath = Path.Combine("..","..","..","..",
            "TestConsumerProject1", "pacts", "MyAPI consumer-MyAPI.json");
        using var pactVerifier = new PactVerifier("MyAPI", config);
        pactVerifier
            .WithHttpEndpoint(fixture.ServerUri)
            .WithFileSource(new FileInfo(pactPath))
            .Verify();
    }
}

“pactPath”是指保存的Pact文件,在您的項目中,它會根據(jù)項目名稱、相對路徑的不同而不同。 執(zhí)行上述測試時,Pact 將啟動測試項目中的測試服務(wù)器,發(fā)送請求并根據(jù)保存的 Json 文件驗證響應(yīng)。

6. 對基于消息的服務(wù)使用Pact

Pact也支持對于基于消息的服務(wù)(也被稱為async API)進(jìn)行測試。詳細(xì)請查看Pact文檔的“messaging pacts”部分。

到此這篇關(guān)于C#中實現(xiàn)契約測試的方法的文章就介紹到這了,更多相關(guān)C#契約測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WPF實現(xiàn)繪制折線圖的示例代碼

    WPF實現(xiàn)繪制折線圖的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用WPF實現(xiàn)繪制簡單的折線圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • C#中File和FileStream的簡單介紹和用法

    C#中File和FileStream的簡單介紹和用法

    這篇文章主要給大家介紹了關(guān)于C#中File和FileStream用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • c# RPC框架的使用簡介

    c# RPC框架的使用簡介

    這篇文章主要介紹了c# RPC框架的使用簡介,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#實現(xiàn)簡單的天氣預(yù)報示例代碼

    C#實現(xiàn)簡單的天氣預(yù)報示例代碼

    這篇文章主要介紹了C#實現(xiàn)簡單的天氣預(yù)報示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • winform 使用Anchor屬性進(jìn)行界面布局的方法詳解

    winform 使用Anchor屬性進(jìn)行界面布局的方法詳解

    這篇文章主要介紹了winform 使用Anchor屬性進(jìn)行界面布局的方法,有需要的朋友可以參考一下
    2013-12-12
  • C#實現(xiàn)UDP通信方式

    C#實現(xiàn)UDP通信方式

    文章介紹了如何使用C#實現(xiàn)UDP通信,包括UDP服務(wù)器和客戶端的實現(xiàn)步驟和示例代碼,服務(wù)器關(guān)鍵類為UdpClient和IPEndPoint,實例化對象后可以通過異步任務(wù)發(fā)送數(shù)據(jù)并接收數(shù)據(jù),客戶端同樣使用UdpClient和IPEndPoint,連接到遠(yuǎn)程服務(wù)器后開新任務(wù)接收數(shù)據(jù)
    2025-01-01
  • C# StringBuilder和string

    C# StringBuilder和string

    這篇文章主要介紹了C# StringBuilder和string,文章圍繞StringBuilder和string的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 不能在子類或外部類發(fā)布C#事件代碼分析

    不能在子類或外部類發(fā)布C#事件代碼分析

    一個朋友問了一個問題:“為什么不能在子類或外部發(fā)布C#事件?”,我說我不知道,要看看生產(chǎn)的IL代碼,下面我們看看
    2013-11-11
  • Revit API取得變量的內(nèi)參名稱實例代碼

    Revit API取得變量的內(nèi)參名稱實例代碼

    這篇文章介紹了Revit API取得變量的內(nèi)參名稱實例代碼,有需要的朋友可以參考一下
    2013-11-11
  • oledb連接access數(shù)據(jù)庫示例

    oledb連接access數(shù)據(jù)庫示例

    本文為大家介紹一個oledb連接access數(shù)據(jù)庫的示例,代碼很簡單,可以直接使用
    2014-01-01

最新評論

平邑县| 淳安县| 固阳县| 海原县| 山西省| 吴桥县| 金寨县| 郯城县| 鹤壁市| 石台县| 农安县| 克拉玛依市| 万源市| 台山市| 潍坊市| 宣化县| 嵩明县| 登封市| 绥棱县| 乌鲁木齐县| 沁水县| 甘孜县| 启东市| 萨嘎县| 鄄城县| 专栏| 桃源县| 罗源县| 泽库县| 琼结县| 六安市| 互助| 潢川县| 玛纳斯县| 中方县| 阿克陶县| 滁州市| 潮州市| 常山县| 恩施市| 湛江市|