使用xunit對asp.net core webapi進行整合測試

來源:互聯網
上載者:User

標籤:spi   圖片   name   rect   server   架構   running   img   control   

新項目我們採用前後端分離,後端採用asp.net core webapi, 如何對後端代碼進行自動化測試呢,有以下幾種方案:

1. 單元測試,目前這個方案對我們來說難度很大,拋開時間的問題,單元測試對開發人員的水平要求很高,暫且不提。

2. 使用postman等第三方工具,類比http請求對webapi進行測試。缺點就是webapi必須跑起來,不能像單元測試一樣,點一個按扭就可以跑測試。

3. 使用xunit等單元測試工具對webapi進行測試,為瞭解決postmam問題,我們使用xunit對webapi進行類單元測試。

 

使用xunit等單元測試工具對webapi進行測試的主要思路:

1. 使用代碼啟動webapi項目,就像program.cs中代碼一樣

2. 藉助http工具類庫對webapi發送http請求,這裡我們使用RestSharp,詳見官網:http://restsharp.org/。

3. 接收傳回值,進行斷言判斷,我們使用的Shouldly架構。

下面是具體的代碼:

首先建立測試專案,這是visual studio 2017內建的xunit的測試專案,足可以看到ms的誠意了。

 

然後我們建立一個類,用於啟動webapi:

public class ApiServerRunning : IDisposable    {        private IWebHost _builder;        public void Dispose()        {            _builder?.Dispose();        }        public void GivenRunningOn(string url)        {            _builder = new WebHostBuilder()                   .UseUrls(url)                   .UseKestrel()                   .UseContentRoot(Directory.GetCurrentDirectory())                   .UseStartup<Startup>()                   .Build();            _builder.Start();        }    }

然後我們就碰到一個問題,什麼時候啟動webapi,不是每個單元測試都要啟動一次,不是運行每個類都啟動一次,而是整個測試專案只運行一個,這裡就用到了xunit的ICollectionFixture,

想具體瞭解的話,請自行百度。這裡就直接上代碼了:

/// <summary>    /// used to startup weiapi, run only once    /// </summary>    public class TestFixture : IDisposable    {        public ApiServerRunning _server = new ApiServerRunning();        public TestFixture()        {            this.Given(s => _server.GivenRunningOn(TestConst.SERVER_URL))                .Then(x => x.Connect())                .BDDfy();        }        private void Connect()        {            Console.WriteLine("webapi startup successfully!!! ");        }        public void Dispose()        {        }    }
    /// <summary>    /// used to tag every class using test fixture    /// </summary>    [CollectionDefinition("TestCollection")]    public class TestCollection:ICollectionFixture<TestFixture>    {    }

有了以上兩個類,我們接下來就可以寫單元測試了:

[Collection("TestCollection")]    public class TaskControllerTest : TestBase    {        [Fact(DisplayName = "擷取列表")]        private void GetOpinionTaskHospitals_Test()        {            var req = agent.CreateRequest("GetTasks")                .AddParameter("month", "2015-07-01")                .AddHeader(FmConsts.HeaderName_UserInfo, TestConst.USER_INFO);            var rel = agent.Execute<<List<Task>>>(req);            rel.Result.Count.ShouldNotBe(0);        }    }

每個類都發送請求,所以這裡有個TestBase的基類,裡面有一個agent的http的對象,是我們封閉了restsharp的http請求對象,這裡就不貼了。

還有如果沒有登入,所有如果想使用登入的cookie,這裡我是直接添加了一個頭資訊,相當於一個登入,但是這裡肯定有問題可能會到期,當然辦法總比困難多。

 

還有一個痛點,就是這裡的測試,還是用的我們的開發資料庫,這個測試會汙染資料,由於開發資料的變數,也會影響測試結果,如果替換開發資料庫oracle為記憶體資料為庫,而且代碼變動也很少,是我們接下來的工作。 請經驗的同學,請指教。

 

使用xunit對asp.net core webapi進行整合測試

相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。