欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1. 術(shù)語(yǔ)

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

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

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

2. 為什么需要契約測(cè)試?

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

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

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

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

4. What is Pact?

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

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

5. 如何使用Pact.Net?

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

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

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

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

上面的控制器提供了一個(gè)計(jì)算給定整數(shù)的絕對(duì)值的簡(jiǎn)單服務(wù)。

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

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

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

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中的代碼片段是測(cè)試用例,根據(jù)“UponReceiving”定義的期望進(jìn)行測(cè)試。 從“httpClient.BaseAddress = ctx.MockServerUri”可以看出,Provider 測(cè)試用例與 Pact 提供的Mock服務(wù)器交互而不是真實(shí)服務(wù)器進(jìn)行交互。

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

c. 編寫(xiě)提供者端測(cè)試用例

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

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

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();
    }
}

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

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文件,在您的項(xiàng)目中,它會(huì)根據(jù)項(xiàng)目名稱(chēng)、相對(duì)路徑的不同而不同。 執(zhí)行上述測(cè)試時(shí),Pact 將啟動(dòng)測(cè)試項(xiàng)目中的測(cè)試服務(wù)器,發(fā)送請(qǐng)求并根據(jù)保存的 Json 文件驗(yàn)證響應(yīng)。

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

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

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

相關(guān)文章

  • 詳解C#借助.NET框架中的XmlTextReader類(lèi)讀取XML的方法

    詳解C#借助.NET框架中的XmlTextReader類(lèi)讀取XML的方法

    這篇文章主要介紹了詳解借助.NET框架中的XmlTextReader類(lèi)讀取XML的方法,這種方式的執(zhí)行效率還是比較令人滿(mǎn)意的,需要的朋友可以參考下
    2016-04-04
  • C#操作INI文件的輔助類(lèi)IniHelper

    C#操作INI文件的輔助類(lèi)IniHelper

    這篇文章主要為大家詳細(xì)介紹了C#操作INI文件的輔助類(lèi)IniHelper,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C#獲取指定目錄下指定文件的方法

    C#獲取指定目錄下指定文件的方法

    這篇文章介紹了C#獲取指定目錄下指定文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 深入c# GDI+簡(jiǎn)單繪圖的具體操作步驟(三)

    深入c# GDI+簡(jiǎn)單繪圖的具體操作步驟(三)

    前兩篇已經(jīng)基本向大家介紹了繪圖的基本知識(shí).那么,我就用我們上兩篇所學(xué)的,做幾個(gè)例子.我們先來(lái)做一個(gè)簡(jiǎn)單的--仿QQ截圖
    2013-05-05
  • c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡(jiǎn)單)

    c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡(jiǎn)單)

    下面小編就為大家分享一篇c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡(jiǎn)單),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • C# 使用Proxy代理請(qǐng)求資源的方法步驟

    C# 使用Proxy代理請(qǐng)求資源的方法步驟

    這篇文章主要介紹了C# 使用Proxy代理請(qǐng)求資源的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法

    C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法

    這篇文章主要介紹了C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法,涉及C#操作foreach實(shí)現(xiàn)遍歷堆棧的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • c#接口使用示例分享

    c#接口使用示例分享

    接口與抽象類(lèi)一樣,也是表示某種規(guī)則,一旦使用了該規(guī)則,就必須實(shí)現(xiàn)相關(guān)的方法。對(duì)于C#語(yǔ)言而言,由于只能繼承自一個(gè)父類(lèi),因此若有多個(gè)規(guī)則需要實(shí)現(xiàn),則使用接口是個(gè)比較好的做法
    2014-02-02
  • c#項(xiàng)目實(shí)現(xiàn)發(fā)布到服務(wù)器全過(guò)程

    c#項(xiàng)目實(shí)現(xiàn)發(fā)布到服務(wù)器全過(guò)程

    這篇文章主要介紹了c#項(xiàng)目實(shí)現(xiàn)發(fā)布到服務(wù)器全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Unity實(shí)現(xiàn)刮獎(jiǎng)效果

    Unity實(shí)現(xiàn)刮獎(jiǎng)效果

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)刮獎(jiǎng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10

最新評(píng)論