.net core實踐系列之短信服務-Api的SDK的實現與測試 .net core實踐系列之短信服務-Sikiro.SMS.Api服務的實現

前言

上一篇《.net core實踐系列之短信服務-Sikiro.SMS.Api服務的實現》講解了API的設計與實現,本篇主要講解編寫接口的SDK編寫還有API的測試。html

或許有些人會認爲,SDK的編寫能夠不須要,既然已經用了RESTful web服務與Swagger提供的接口描述,只要選擇合適的接口調用框架,找到對應Swagger文檔按需調用便可。git

這個我贊同,特別在微服務架構下使用了API網關與服務發現。所以本篇也是借用編寫SDK來模擬在客戶端使用接口框架調用,並增長負載測試的講解,供須要的朋友們分享。github

項目源碼地址:https://github.com/SkyChenSky/Sikiro.SMS.gitweb

SDK

Software Development Kit的縮寫,翻譯中文爲軟件開發工具包,百度定義爲軟件工程師用於爲特定的軟件包、軟件框架、硬件平臺、操做系統等建立應用軟件的開發工具的集合。而咱們這裏的SDK主要是以工具庫的形式提供給部門內部使用API。服務器

設計要點

  • 儘可能少的依賴
  • 多形式方法重載
  • 高可讀性

從上三點得出,高可讀的方法註釋,方便使用的多重載(單條、多條、異步、同步),如涉及到枚舉,不要依賴原有項目的其餘庫,應拷貝過來完整提供。架構

組件選擇

  • RestSharp
  • .Net Standard

RestSharp

爲了良好的調用RESTful API,我選擇RestSharp這個RESTful接口調用框架。併發

源碼地址:https://github.com/restsharp/RestSharpmvc

優勢

請求調用與響應結果的直觀化:框架

步驟:異步

  • 傳入資源
  • 定義動做
  • 設置表述類型
  • 傳入實體參數

注意點

1.默認序列化類型爲XML,應手動設置爲JSON

RequestFormat = DataFormat.Json 

2.反序列化有缺陷,對於實體內的類類型屬性(List<T>、自定義類等),應再構造函數初始化賦默認值

 public class SearchResponse
    {
        public SearchResponse()
        {
            Mobiles = new List<string>();
        }

        public string Content { get; set; }
        public int Type { get; set; }
        public int Status { get; set; }
        public List<string> Mobiles { get; set; }

        [SerializeAs(Name = "_id", Attribute = true)]
        public string Id { get; set; }
    }

示例

public static class Sms
    {
        private static RestClient _client;

        private static string Host { get; set; }

        public static void Init(string host)
        {
            Host = host;
            _client = new RestClient(Host);
        }

        public static async Task<Response> SendAsync(List<SendEntity> sendList)
        {
            var request = new RestRequest("sms", Method.POST) { RequestFormat = DataFormat.Json };

            request.AddBody(sendList);

            var response = await _client.ExecuteTaskAsync(request);

            return ToResponse(response);
        }

        public static async Task<Response> SendAsync(SendEntity sendEntity)
        {
            return await SendAsync(new List<SendEntity> { sendEntity });
        }

        public static Response Send(List<SendEntity> sendList)
        {
            var request = new RestRequest("sms", Method.POST) { RequestFormat = DataFormat.Json };

            request.AddBody(sendList);

            var response = _client.Execute(request);

            return ToResponse(response);
        }

        public static Response Send(SendEntity sendEntity)
        {
            return Send(new List<SendEntity> { sendEntity });
        }

        public static Response<SearchResponse> Get(string id)
        {
            var request = new RestRequest("sms/{id}", Method.GET);

            request.AddUrlSegment("id", id);

            var response = _client.Execute<SearchResponse>(request);

            return ToResponse(response);
        }

        public static Response<List<SearchResponse>> Search(SearchEntity searchModel)
        {
            var request = new RestRequest("sms/_search", Method.POST) { RequestFormat = DataFormat.Json };
            request.AddBody(searchModel);

            var response = _client.Execute<List<SearchResponse>>(request);

            return ToResponse(response);
        }

        private static Response<T> ToResponse<T>(IRestResponse<T> t)
        {
            var msg = t.IsSuccessful ? t.StatusCode.ToString() : t.Content;
            return new Response<T> { Body = t.Data, StateCode = t.StatusCode, Message = t.ErrorMessage ?? msg, IsSuccess = t.IsSuccessful };
        }

        private static Response ToResponse(IRestResponse t)
        {
            var msg = t.IsSuccessful ? t.StatusCode.ToString() : t.Content;
            return new Response { StateCode = t.StatusCode, Message = t.ErrorMessage ?? msg, IsSuccess = t.IsSuccessful };
        }
    }

.Net Standard

公司裏除了有新用的.NET Core項目還有大量的存量.NET Framework舊項目。

.NET Standard是一種規範,沒法以此創建應用,但他能以庫的形式做爲支撐。.NET Standard的出現爲了解決以編寫一次的庫來同時支持多個平臺(.NET Framework、.NET Core、Xamarin)的使用。

 

爲了實現多平臺的API標準映射,不一樣版本的映射與數量也隨着不同

.NET Standard
1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0
.NET Core 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0
.NET Framework 4.5 4.5 4.5.1 4.6 4.6.1 4.6.1  4.6.1  4.6.1
Mono 4.6 4.6 4.6 4.6 4.6 4.6 4.6 vNext
Xamarin.iOS 10.0 10.0 10.0 10.0 10.0 10.0 10.0 vNext
Xamarin.Android 7.0 7.0 7.0 7.0 7.0 7.0 7.0 vNext
Universal Windows Platform 10.0 10.0 10.0 10.0 10.0 vNext vNext vNext
Windows 8.0 8.0 8.1          
Windows Phone 8.1 8.1 8.1          
Windows Phone Silverlight 8.0            

.Net Standard編譯多版本程序集設置

右鍵編輯項目.csproj,可見下圖本來應該是TargetFramework的節點,改成TargetFrameworks(多了個s),經過分號區分不一樣的程序集,由於RestSharp須要到.NET Framework4.6支持,由於我填入了net46。

接口測試

單元測試

百度定義:單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。

單元:能夠是C語言中單元指一個函數,C#、Java裏單元指一個類。總的來講,單元就是人爲規定的最小的被測功能模塊。

然而個人示例代碼裏的單元測試並不是正統規範的單元測試,而是利用單元測試項目來作接口的測試並作負載測試的可運行代碼。所以你們沒必要學習個人作法。

這裏有微軟的官方文檔XUnit結合了mock框架,可供你們學習傳送門

負載測試

百度定義:負載測試是模擬實際軟件系統所承受的負載條件的系統負荷,經過不斷加載(如逐漸增長模擬用戶的數量)或其它加載方式來觀察不一樣負載下系統的響應時間和數據吞吐量、系統佔用的資源(如CPU、內存)等,以檢驗系統的行爲和特性,以發現系統可能存在的性能瓶頸、內存泄漏、不能實時同步等問題。

1.對於使用VS2017的能夠先到工具-獲取工具與功能,勾上Web性能與負載工具

2.添加Web性能和負載測試項目,該項目只能是.NET Framework

3.添加負載測試,並選擇本地負載測試,負載測試持續時間是此方案的測試總時間,測試迭代是測試方案的測試總次數

4.輸入方案場景名稱,並選擇思考時間,思考時間能夠理解成客戶操做的停頓時間。

5.常量負載指模擬的每次測試固定併發數,分級負載則是模擬併發數持續遞增。

6.選擇須要進行負載測試的單元測試,上面咱們編寫SDK的單元測試來進行接口測試,所以咱們能夠選擇Send單元測試方法,進行測試接口的性能如何。

7.點擊完成,並運行負載測試

8.漫長的等待以後能夠查看測試結果與關係圖

須要注意的是,作負載測試的時候須要模擬併發請求,這裏是佔資源的,所以儘可能把測試服務放到服務器上測試。

相關文章
相關標籤/搜索