Magicodes.IE編寫多框架版本支持和執行單元測試

背景

不少狀況下,咱們編寫了一些工具庫以後,每每在某些框架版本中會出現一些問題,好比本人最近寫的一個導入導出的工具庫Magicodes.IE(GitHub:https://github.com/xin-lai/Magicodes.IE)就出現瞭如下問題:html

 

評論
 

雖然支持標準庫2.0,可是經過編寫單元測試,確實發現如此:git

測試結果

所以,單元測試確實須要針對各個框架版本進行測試,而且相關代碼須要針對框架進行兼容修改。那麼如何實現呢?接下來咱們一步步實踐。github

.NET框架版本說明

最新目標框架版本

下表定義了最多見的目標框架、如何引用這些框架,以及它們實現的 .NET Standard 版本。 這些目標框架版本是最新的穩定版本。 預覽版不會顯示。 目標框架名字對象 (TFM) 是一個標準化令牌格式,用於指定 .NET 應用或庫的目標框架。app

目標 Framework 最新 穩定版本 目標框架名字對象 (TFM) 已實現 .NET Standard 版本
.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。框架

目標 Framework TFM
.NET Standard netstandard1.0 netstandard1.1 netstandard1.2 netstandard1.3 netstandard1.4 netstandard1.5 netstandard1.6 netstandard2.0 netstandard2.1
.NET Core netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0
.NET Framework net11 net20 net35 net40 net403 net45 net451 net452 net46 net461 net462 net47 net471 net472 net48
Windows 應用商店 netcore [netcore45] netcore45 [win] [win8] netcore451 [win81]
.NET Micro Framework netmf
Silverlight sl4 sl5
Windows Phone wp [wp7] wp7 wp75 wp8 wp81 wpa81
通用 Windows 平臺 uap [uap10.0] uap10.0 [win10] [netcore50]

如何讓工程支持多個框架?

以單元測試工程爲例:工具

<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 NET461
            return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??
                   excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??
                   excelPackage.Workbook.Worksheets[1];
#else
            return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??
                   excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??
                   excelPackage.Workbook.Worksheets[0];
#endif

這些「NET461」的符號都有哪些呢?以下所示:編碼

完整的 .NET Core 目標框架的預處理器符號列表

目標框架 符號
.NET Framework NETFRAMEWORKNET20NET35NET40NET45NET451NET452NET46NET461NET462NET47NET471NET472NET48
.NET Standard NETSTANDARDNETSTANDARD1_0NETSTANDARD1_1NETSTANDARD1_2NETSTANDARD1_3NETSTANDARD1_4NETSTANDARD1_5NETSTANDARD1_6NETSTANDARD2_0NETSTANDARD2_1
.NET Core NETCOREAPPNETCOREAPP1_0NETCOREAPP1_1NETCOREAPP2_0NETCOREAPP2_1NETCOREAPP2_2NETCOREAPP3_0NETCOREAPP3_1

Magicodes.IE之多框架版本測試

瞭解了這些知識,咱們就能夠編寫多框架版本的實現和單元測試了。spa

單元測試添加多框架支持

  1. 修改TargetFramework爲TargetFrameworks

    TargetFrameworks

     

  2. 設置分組

    根據目標框架分組:

    根據目標框架分組
  3. 修復編譯錯誤

  4. 執行單元測試

    單元測試結果以下圖所示:

    單元測試結果

    針對具體的單元測試,咱們還能夠指定目標框架進行運行和調試:

    指定目標框架進行運行和調試 

總結和經驗分享

結合整改的過程,咱們能夠得出如下經驗:

  1. 單元測試編寫時的異常消息判斷儘可能使用字符串包含判斷,而不判斷完整格式。

 

異常消息不一致

如上面所示,左側代碼在net46一、netcoreapp2.2都是沒法經過的,格式化的參數模板不一致。

  1. 特定框架、平臺代碼需添加符號判斷

    以下面示例,默認狀況下,.NET Core 不提供除代碼頁 28591 之外的其餘任何代碼頁編碼和 Unicode 編碼,例如 UTF-8 和 UTF-16,因此咱們可使用如下代碼進行添加,可是須要排除.NET Framework:

    特定平臺代碼

    除了特定代碼以外,有時還有特定依賴的包:

    特定依賴
  2. 慎用新語法糖

    好比如下代碼:

    語法差別

精力有限,暫不適配過多框架版本,有興趣的朋友能夠參與進來。

相關文章
相關標籤/搜索