亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#中實現契約測試的方法

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

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

1. 術語

消費者(Consumer):對服務進行消費的代碼,通常指的是客戶端。

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

契約(Contract): 消費者和提供者之間商定的協議。 它包括預期的請求(輸入)和響應(輸出)。

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

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

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

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

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

4. What is Pact?

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

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

5. 如何使用Pact.Net?

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

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

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

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

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

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

b. 編寫消費者端測試用例

創(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()”用于定義相應的預期輸出。VerifyAsync中的代碼片段是測試用例,根據“UponReceiving”定義的期望進行測試。 從“httpClient.BaseAddress = ctx.MockServerUri”可以看出,Provider 測試用例與 Pact 提供的Mock服務器交互而不是真實服務器進行交互。

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

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

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

創(chuàng)建一個“MyApiFixture”類,用于啟動測試項目中測試的WebAPI服務器。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文件對服務器(提供者)進行測試的測試用例。

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文件,在您的項目中,它會根據項目名稱、相對路徑的不同而不同。 執(zhí)行上述測試時,Pact 將啟動測試項目中的測試服務器,發(fā)送請求并根據保存的 Json 文件驗證響應。

6. 對基于消息的服務使用Pact

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

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

相關文章

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

    詳解C#借助.NET框架中的XmlTextReader類讀取XML的方法

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

    C#操作INI文件的輔助類IniHelper

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

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

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

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

    前兩篇已經基本向大家介紹了繪圖的基本知識.那么,我就用我們上兩篇所學的,做幾個例子.我們先來做一個簡單的--仿QQ截圖
    2013-05-05
  • c# 獲得當前絕對路徑的方法(超簡單)

    c# 獲得當前絕對路徑的方法(超簡單)

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

    C# 使用Proxy代理請求資源的方法步驟

    這篇文章主要介紹了C# 使用Proxy代理請求資源的方法步驟,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • C#使用foreach語句遍歷堆棧(Stack)的方法

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

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

    c#接口使用示例分享

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

    c#項目實現發(fā)布到服務器全過程

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

    Unity實現刮獎效果

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

最新評論