专栏首页magicodesMagicodes.IE编写多框架版本支持和执行单元测试

Magicodes.IE编写多框架版本支持和执行单元测试

背景

很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE(GitHub:https://github.com/xin-lai/Magicodes.IE)就出现了以下问题:

虽然支持标准库2.0,但是通过编写单元测试,确实发现如此:

因此,单元测试确实需要针对各个框架版本进行测试,并且相关代码需要针对框架进行兼容修改。那么如何实现呢?接下来我们一步步实践。

.NET框架版本说明

最新目标框架版本

下表定义了最常见的目标框架、如何引用这些框架,以及它们实现的 .NET Standard 版本。 这些目标框架版本是最新的稳定版本。 预览版不会显示。 目标框架名字对象 (TFM) 是一个标准化令牌格式,用于指定 .NET 应用或库的目标框架。

目标 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

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之多框架版本测试

了解了这些知识,我们就可以编写多框架版本的实现和单元测试了。

单元测试添加多框架支持

  1. 修改TargetFramework为TargetFrameworks
  1. 设置分组 根据目标框架分组:
  1. 修复编译错误
  2. 执行单元测试 单元测试结果如下图所示:

针对具体的单元测试,我们还可以指定目标框架进行运行和调试:

总结和经验分享

结合整改的过程,我们可以得出以下经验:

  1. 单元测试编写时的异常消息判断尽量使用字符串包含判断,而不判断完整格式。

如上面所示,左侧代码在net461、netcoreapp2.2都是无法通过的,格式化的参数模板不一致。

  1. 特定框架、平台代码需添加符号判断 如下面示例,默认情况下,.NET Core 不提供除代码页 28591 以外的其他任何代码页编码和 Unicode 编码,例如 UTF-8 和 UTF-16,所以我们可以使用以下代码进行添加,但是需要排除.NET Framework:

除了特定代码之外,有时还有特定依赖的包:

  1. 慎用新语法糖 比如以下代码:

精力有限,暂不适配过多框架版本,有兴趣的朋友可以参与进来。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Magicodes.IE 2.0发布

    Magicodes.IE是我们维护的开源的导入导出通用库,去年年底已加入NCC开源组织。

    雪雁-心莱科技
  • Docker最全教程之树莓派和Docker(十五)

    树莓派(Raspberry Pi)是一台卡片电脑(只有信用卡大小),我们可以使用树莓派做很多事情,比如智能家居的中控、航空器、BT下载器、挖矿机、智能机器人、小...

    雪雁-心莱科技
  • 开源库Magicodes.ECharts使用教程

    博客使用Word发博,发布后,排版会出现很多问题,一一修正工作量极大,敬请谅解。可加群获取原始文档。

    雪雁-心莱科技
  • Magicodes.IE编写多框架版本支持和执行单元测试

    很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE就出现了以下问题:

    心莱科技雪雁
  • 美国运通宣布收购AI旅游初创企业Mezi

    【数据猿导读】 Mezi此前已获得了总计1200美元的融资,其中在2016年获得的900万美元A轮融资占了一大部分。Mezi此前曾与美国运通合作开展名为AskA...

    数据猿
  • 游戏人工智能 读书笔记 (六) AI算法简介——演化算法

    Chapter 2.8 Hybrid Algorithm: Neuroevolution

    鹅厂优文
  • 【LeetCode】正则表达式匹配(动态规划)

    给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。

    弗兰克的猫
  • InnoDB锁机制

    1. 锁类型 锁是数据库区别与文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。 InnoDB使用的锁类型,分别有: 共享锁(S)和排他锁(X) 意...

    butterfly100
  • MicroPython TPYBoard v102 无线红外遥控舵机(基于红外解/编码模块)

    该模块使用方法非常简单,只需要掌握基本的单片机TTL串口通信知识即可。将模块与开发板进行串口连接,通过串口发送指定的指令进行控制模块发射;通过串口接收方式进行红...

    阿莉埃蒂
  • 【经典】Yann LeCun:如何有效实现无监督学习(158页PPT)

    【新智元导读】Yann LeCun日前在法国大学做了系列讲座。这篇演讲中他结合大量实例,全面系统梳理了深度学习关键知识点和待解决的问题。其中,LeCun简单讲解...

    新智元

扫码关注云+社区

领取腾讯云代金券