Magicodes.IE编写多框架版本支持和执行单元测试
背景
很多情況下,我們編寫了一些工具庫之后,往往在某些框架版本中會出現一些問題,比如本人最近寫的一個導入導出的工具庫Magicodes.IE就出現了以下問題:
(GitHub:https://github.com/xin-lai/Magicodes.IE)
雖然支持標準庫2.0,但是通過編寫單元測試,確實發現如此:
因此,單元測試確實需要針對各個框架版本進行測試,并且相關代碼需要針對框架進行兼容修改。那么如何實現呢?接下來我們一步步實踐。
.NET框架版本說明
最新目標框架版本
下表定義了最常見的目標框架、如何引用這些框架,以及它們實現的 .NET Standard 版本。 這些目標框架版本是最新的穩定版本。 預覽版不會顯示。 目標框架名字對象 (TFM) 是一個標準化令牌格式,用于指定 .NET 應用或庫的目標框架。
| .NET Standard | 2.1 | netstandard2.1 | 不可用 | 
| .NET Core | 3.0 | netcoreapp3.0 | 2.1 | 
| .NET Framework | 4.8 | net48 | 2.0 | 
支持的目標框架版本
目標框架通常由 TFM 引用。 下表顯示 .NET Core SDK 和 NuGet 客戶端支持的目標框架。 等效項顯示在括號內。 例如,win81 對于 netcore451 來說等效于 TFM。
如何讓工程支持多個框架?
以單元測試工程為例:
<PropertyGroup><TargetFrameworks>netcoreapp3.0;netcoreapp2.2;netcoreapp3.1;net461</TargetFrameworks><IsPackable>false</IsPackable></PropertyGroup> 如上述代碼所示,我們可以通過“TargetFrameworks”元素來定義多個框架。那么如何在工程里面添加條件判斷以進行編譯呢?<ItemGroup Condition=" '$(TargetFramework)' == 'net461' "><PackageReference Include="Newtonsoft.Json" Version="12.0.3" /></ItemGroup> 除了工程里面,我們代碼中如何針對不同的框架版本編寫代碼呢? #if NET461return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??excelPackage.Workbook.Worksheets[1]; #elsereturn excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??excelPackage.Workbook.Worksheets[0]; #endif這些“NET461”的符號都有哪些呢?如下所示:
完整的 .NET Core 目標框架的預處理器符號列表
| .NET Framework | NETFRAMEWORK, NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472, NET48 | 
| .NET Standard | NETSTANDARD, NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0, NETSTANDARD2_1 | 
| .NET Core | NETCOREAPP, NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2, NETCOREAPP3_0, NETCOREAPP3_1 | 
Magicodes.IE之多框架版本測試
了解了這些知識,我們就可以編寫多框架版本的實現和單元測試了。
單元測試添加多框架支持
修改TargetFramework為TargetFrameworks
設置分組
根據目標框架分組:
修復編譯錯誤
執行單元測試
單元測試結果如下圖所示:
針對具體的單元測試,我們還可以指定目標框架進行運行和調試:
總結和經驗分享
結合整改的過程,我們可以得出以下經驗:
- 單元測試編寫時的異常消息判斷盡量使用字符串包含判斷,而不判斷完整格式。 
如上面所示,左側代碼在net461、netcoreapp2.2都是無法通過的,格式化的參數模板不一致。
- 特定框架、平臺代碼需添加符號判斷 
如下面示例,默認情況下,.NET Core 不提供除代碼頁 28591 以外的其他任何代碼頁編碼和 Unicode 編碼,例如 UTF-8 和 UTF-16,所以我們可以使用以下代碼進行添加,但是需要排除.NET Framework:
除了特定代碼之外,有時還有特定依賴的包:
- 在某些情況下不要使用過新的語法 
比如以下代碼:
轉載是一種動力 分享是一種美德
如果喜歡作者的文章,請關注【麥扣聊技術】訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
文檔官網:docs.xin-lai.com
QQ群:
編程交流群<85318032>?
產品交流群<897857351>
總結
以上是生活随笔為你收集整理的Magicodes.IE编写多框架版本支持和执行单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Magicodes.Sms短信库的封装和
- 下一篇: 2019全球AI训练营五地再同发
