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。
如何让工程支持多个框架?
以单元测试工程为例:
<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编写多框架版本支持和执行单元测试相关推荐
- Microsoft 解决方案框架版本 3.0 概述
发布日期: 2004年06月04日 关于 Microsoft 解决方案框架的更多信息,请参阅 http://www.microsoft.com/china/technet/itsolutions/te ...
- Microsoft 解决方案框架版本 3.0 概述(MSF3.0)
Microsoft 解决方案框架版本 3.0 概述 发布日期: 2004年06月04日 关于 Microsoft 解决方案框架的更多信息,请参阅 http://www.microsoft.com/ch ...
- 开源新手引导框架,支持TypeScript
Shawn的GitChat新手引导框架已经有超过150人订阅,在此期间有不少伙伴给出了正面的评价,让我有了继续优化改进的动力. 其中一个问题是在微信小游戏中的报错问题,在文章一上线就暴露出来了,感谢「 ...
- 全志Tina Linux Camera 摄像头模块开发指南 全网最详细版本支持百问网T113-Pro DongshanPI-NezhaD1-H DongshanPI-D1s V853-Pro等开发板
1 概述 编写目的:介绍camera 模块在sunxi 平台上的开发流程. 适用范围:本文档目前适用于tina3.0 以上具备camera 的硬件平台. 2 模块介绍 2.1 模块功能介绍 用于接收并 ...
- python装饰器-python装饰器是哪个版本支持的
python装饰器是哪个版本支持的 **kwargs): print ' % (unction.__name__:@app.route(':import unctoolsde log(text=&am ...
- python程序框架的描述_简单介绍Python下自己编写web框架的一些要点
在正式开始Web开发前,我们需要编写一个Web框架. 为什么不选择一个现成的Web框架而是自己从头开发呢?我们来考察一下现有的流行的Web框架: Django:一站式开发框架,但不利于定制化: web ...
- hbase的2.2.4版本支持哪个版本的hadoop_2019 年,Hadoop 还是数据处理的可选方案吗?...
作者丨Christian Hollinger 译者丨方彦 目前云驱动数据处理和分析呈上升趋势,我们在本文中来分析下,Apache Hadoop 在 2019 年是否还是一个可选方案. 从我第一次使用 ...
- AiBote 2022 新研发的自动化框架,支持 Android 和 Windows 系统。速度非常快
Ai-Bot 基于流行的 Node.js 和 JavaScript 语言 的一款新自动化框架,支持 Windows 和 Android 自动化. 1.Windows xpath 元素定位算法支持 支持 ...
- VS2022打开项目之后提示:找不到 .NETFramework,Version=v4.0 的引用程序集。要解决此问题,请为此框架版本安装开发人员工具包(SDK/目标包)或者重新定向应用程序。
问题: 使用 vs2022打开带有.net4.0的项目会报错 严重性 代码 说明 项目 文件 行 列 禁止显示状态 错误 MSB3644 找不到 .NETFramework,Version=v4.0 ...
最新文章
- 施一公:大学必须不计成败、不论得失地为探索者提供宽容和支持的环境
- ios UI自动化测试
- python数据分析知识点_Python基础知识点总结:数据
- SpringBoot启动流程是怎样的
- (二)双线性插值python实现
- Spark 0.9的安装配置
- 面试:一文搞懂Java集合
- Comet服务器推送与SignalR
- 机器学习之降维方法(LDA、PCA)小结
- VB 超简单的屏幕截图代码
- springboot event线程池总结
- automak 和 autoconf 介绍
- jackson框架java反序列化漏洞_Jackson CVE-2019-12384: 反序列化漏洞复现
- Spring下载文件出现:UT010029: Stream is closed
- 【学习笔记】Python办公自动化 - Task 01 文件自动化处理 邮件自动发送
- 谷歌浏览器flash插件离线下载,最新版
- 手机远程计算机桌面,远程桌面预览Windows10,您可以远程通过手机控制电脑
- Vue学习----第三天_webpack(学习webpack看这一篇就够了1.8w字)【6.7】
- 李开复给大学生的第6封信:选择的智慧
- 图像识别的核心思想是什么!
热门文章
- Sharepoint在itemUpdating中获取修改后的用户或用户组栏的值
- C#——一个简单的文件管理器
- 如何将Outgoing Webhook部署到中国版Azure
- 本地服务器下的局域网安全吗_本地安全认证服务器
- 唤醒计算机运行此任务_如何停止Windows 8唤醒计算机以运行维护
- redhat9Linux解压gz,linux (redhat9)下subversion 的安装
- php rewrite url_PHP实现url重写和.htaccess
- springboot配置允许跨域访问
- 洛谷P4364 [九省联考2018]IIIDX(线段树)
- linux ubuntu deepin apache2 rewrite