上一篇《.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
Software Development Kit的縮寫,翻譯中文爲軟件開發工具包,百度定義爲軟件工程師用於爲特定的軟件包、軟件框架、硬件平臺、操做系統等建立應用軟件的開發工具的集合。而咱們這裏的SDK主要是以工具庫的形式提供給部門內部使用API。服務器
從上三點得出,高可讀的方法註釋,方便使用的多重載(單條、多條、異步、同步),如涉及到枚舉,不要依賴原有項目的其餘庫,應拷貝過來完整提供。架構
爲了良好的調用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 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 |
右鍵編輯項目.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.漫長的等待以後能夠查看測試結果與關係圖
須要注意的是,作負載測試的時候須要模擬併發請求,這裏是佔資源的,所以儘可能把測試服務放到服務器上測試。