背景

很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库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.;netcoreapp2.;netcoreapp3.;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[];
#else
return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??
excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??
excelPackage.Workbook.Worksheets[];
#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之多框架版本测试

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

单元测试添加多框架支持

  1. 修改TargetFramework为TargetFrameworks

  2. 设置分组

    根据目标框架分组:

  3. 修复编译错误

  4. 执行单元测试

    单元测试结果如下图所示:

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

     

总结和经验分享

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

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

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

  1. 特定框架、平台代码需添加符号判断

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

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

  2. 慎用新语法糖

    比如以下代码:

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

Magicodes.IE编写多框架版本支持和执行单元测试的更多相关文章

  1. Jquery3.x高版本支持IE8

    最近在做项目的时候,遇到一个安全漏洞的问题 检测到目标站点存在javascript框架库漏洞 解决办法是 将受影响的javascript框架库升级到最新版本. 好吧,就给你升吧,升完之后,我的天啊,尽 ...

  2. 自主研发异步通信框架Minma(支持长连接和短连接)

    Minma是英文Minma Is Not Mina的简称 该框架采用Java NIO的核心技术,实现了基于事件驱动的多线程异步通信框架,支持常见的长连接(腾讯QQ)和短连接(http通信) 对于开发人 ...

  3. New!Devexpress WPF各版本支持VS和SQL Server版本对应图

    点击获取DevExpress v19.2.3完整版试用下载 本文主要为大家介绍DevExpress WPF各大版本支持的VS版本和支持的.Net版本图,Devexpress WPF v19.2.3日前 ...

  4. New!Devexpress WinForms各版本支持Visual Studo和SQL Server版本对应图

    点击获取DevExpress v19.2.3最新完整版试用下载 本文主要为大家介绍DevExpress WinForms各大版本支持的VS版本和支持的.Net版本图,Devexpress WinFor ...

  5. 推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求

    推荐一个比较好用的流媒体服务开源代码: ZLMediaKit: 实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求 https://gitee.com/xiahcu/Z ...

  6. 手撸了一个HTTP框架:支持Sprng MVC、IOC、AOP,拦截器,配置文件读取...

    https://github.com/Snailclimb/jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 距离上一次给小伙伴们汇报简易 ...

  7. 一个C#开发编写Java框架的心路历程

    前言 这一篇絮絮叨叨,逻辑不太清晰的编写Java框架的的一个过程,主要描述我作为一个java初学者,在编写Java框架时的一些心得感悟. 因为我是C#的开发者,所以,在编写Java框架时,或多或少会带 ...

  8. 现在有哪些浏览器的哪些版本支持 HTML5

    现在有哪些浏览器的哪些版本支持 HTML5 1.IE IE9支持部分 IE10+支持2.Firefox Firefox3.5,3.6支持大部分 Firefox4.0+支持3.Chrome Chrome ...

  9. iis7下.Net框架版本设置

    转载:http://blog.163.com/fan_yishan/blog/static/47692213201391651229542/ Win7下IIS网站的.Net框架版本设置 步骤/方法 1 ...

随机推荐

  1. oracle 用TRUNCATE替代DELETE

    当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务, ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到 ...

  2. vue1——vue引入方法,npm本地安装

    博客地址 :https://www.cnblogs.com/sandraryan/ Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架.Vue 只关注视图层, 采用 ...

  3. Android Studio(十):添加assets目录

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  4. EF CodeFirst 实例Demo

    一直想搞一个EFCodeFirst的Demo,让自己通过实例真正了解CodeFirst,方便以后有需求的时候可以有思路.网上查了很多资料,发现很多博主的文章大量重复,根据推荐步骤走并不一定能够成功,而 ...

  5. Lecture Collection

    Distributed ML Yibo Zhu 主要讲了如何分布式的进行机器学习,主要用到的思想是指令的流水调度的相关的思想. IoT Zhenjiang Li 普通的各种卡是基于PIN来进行身份验证 ...

  6. java代码注释:单行//,多行/* */,文档注释/** */

    1.单行注释      //: //后到本行结束的所有字符会被编译器忽略; 2.多行注释     /* */: /*  */之间的所有字符会被编译器忽略 3.文档注释     /** */: 在/** ...

  7. mybatis 一对多查询 集合创建空对象的问题

    在做 mybatis 一对多查询的时候, resultMap 里面用到了集合标签 collection ,后来发现 当该条数据没有子集的时候, collection 会自动创建一个属性都是null的对 ...

  8. Python--day65--母版和继承的基本使用

  9. 原 在windows上创建文件名以“.”开头的文件

    在实际项目开发中,我们会经常遇到以”.”开头的配置文件.例如我们如果需要通过配置文件给npm更换源就需要更改.npmrc文件,然而还有很多友友还不清楚如何创建一个类似的文件,今天就和大家分享下这个小技 ...

  10. UPC个人训练赛第十五场(AtCoder Grand Contest 031)

    传送门: [1]:AtCoder [2]:UPC比赛场 [3]:UPC补题场 参考资料 [1]:https://www.cnblogs.com/QLU-ACM/p/11191644.html B.Re ...