.net测试篇之单元测试/集成测试神器Autofixture

autofixture简介

有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixture并且它能与moq,rhinomock等框架结合,对单元测试带来的便捷性,可维护性和扩展性更是难以言表,只有用用了才知道.

说了这么多,还没有介绍AutoFixture是干什么的,其实AutoFixture就是一个假数据填充工具.

其实不论是Nunit还是Xunit都有数据填充功能,并且大部分时候都能满足需求.然而通过我们前面的介绍就会知道有以下问题:

  • 不论是vlues注解还是TestCase注解都没有类型约束,这就可能会造成运行时错误.

  • 基于注解的值都只能是Const值,如果需要复杂类型就需要定义一个类型做为Source为当前操作提供值.

  • 与Nunit和Xunit生成的填充数据相比,Autofixture可以生成符合验证规则的数据(基于system.componentmodel.annotations名称空间下的注解约束),这在集成测试里帮助很大,对于有着非常复杂模型验证的接口来说,手工制造出符合模型验证规则的数据往往是非常痛苦的.

  • Autofixture可以生成一组符合验证规则的数据,这样在测试的时候增加了样本数据的随机性,大大提升了测试的覆盖面.

Moq测试虽然极大方便了测试,但是也会有一些问题:

  • 对于比较复杂的web项目,往往一个业务逻辑可能要消费十个几个甚至几十个数据接口,如果业务不是很成熟可能需要不断的来调整这些接口,这里的修改同时单元测试方法也需要修改(因为这些接口多数时候是通过构造函数注入的,构造函数参数数量的变动会导致调用者也需要做相应调整)

  • 虽然Moq也能够模拟类对象,但是限制非常多,我们不可能为了测试把所有的方法和属性都加上abstract或者virtual.

而autofixture则可以很好的解决这些问题.这样极大增加代码的可维护性和扩展性.

AutoFixture并不是对moq的替代,它只能填充对象,而不能模拟对象,但是它可以与moq框架结合实现更强大的功能.

autofixture安装

autofixture安装非常简单,我们在Nuget里搜索autofixture,第一个就是它点击安装即可.

关于autofixture与moq结合需要的包在后面讲到的时候再安装,这里先略过.

要使AutoFixture与Nunit结合,首先我们需要安装特定的包.

在Nuget里输入AutoFixture.Nunit3,会出现以下选项640?wx_fmt=png

AutoFixture还可以与Xunit结合.在Nuget里搜索AutoFixture.xunit2便可以搜索到AutoFixture与Xunit结合的框架.与Xunit结果的用法与Nunit差不多,只是需要注意Xunit数据测试方法需要Theory注解.

我们新建一个名为FixtureTest并引入AutoFixture.NUnit3;名称空间

代码如下

 [TestFixture]public class FixtureTest{[Test][AutoData]public void FixValueTest(int a, int b){var result = Add(a , b);Assert.AreEqual(a + b, result);}int Add(int x, int y){return x + y;}}

这里与平时的单元测试相比,多了一个AutoData注解,有了AutoData注解,AutoFixture便可以给当前测试提供值了.

640?wx_fmt=png

我们可以看到a和b都被赋予了随机的值.

我们把测试代码改为如下

        [Test][AutoData]public void FixValueTest(Person p1, Person p2){var result = Add(p1.Age , p2.Age);Assert.AreEqual(p1.Age + p2.Age, result);}

我们再断点调试一下看看是否有值640?wx_fmt=png

复杂对象它也能填充!这样就免去了为了使用复杂对象需要额外写很多source繁琐.

我们把代码改成如下

我们看看此时会有什么结果640?wx_fmt=png

通过监视容器可以看到,AutoFixture生成了一个包含三个元素的对象.

这简直是太方便了,autofixture自动填充值不但减少了运行时可能的类型错误,还有极大的扩展性,如果我们在测试方法上添加其它参数,它仍然能够自动填充.而使用Nunit自身带的TestCase如果参数减少,里面指定的值也要减少,否则会抛出运行时异常.

通过以上我们可以看到,AutoFixture可以生成各种类型的对象,它可以创建集合对象对我们测试来说尤其有用,免去了手动创建的麻烦.但是我们同时也看到,基于注解的方法生成集合时只生成了三个,实际上要模拟数据库是的数据测试一些行为我们可能需要更多的元素.这里就需要对AutoFixture本身进行配置.这是基于注解的方法无法完成的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DotNetCore 3.0 助力 WPF本地化

概览随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能。方便越来越多的国家使用我们中国的应用程序,基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦了。实现思路现在…

开源题材征集 + MVCEF Core 完整教程小结

到目前为止,我们的MVCEF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点。下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目。现向园友征集题材,你提需…

对微软的敌视何时休? 从一篇语言评论文章对C#的评价说起

看到一篇公众号文章《2020年什么编程语言最受欢迎,待遇最高?》,其中对C#的描述如下:点击阅读原文,看到这是一篇翻译文章:https://codinginfinite.com/top-programming-languages-2020-stats-surveys/这篇文…

ASP.NET Core on K8S深入学习(6)Health Check

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。预计阅读时间为10分钟。01—关于K8S中的健康监测所谓Health Check,就是健康检查,即防微杜渐。K8S是一个编排引擎可以帮助我们快捷地部署容器集…

关于 .Net Core runtimeconfig 文件说明

项目的bin\debug\netcoreapp${Version}下面能够找到这个${AppName}.runtimeconfig.json文件,简单来说,它就是用来定义应用程序所用的共享框架(.Net Core App)以及运行时选项 的一个文件。一个简单的例子{ "runtimeOptions&q…

net core 3.0 之Grpc新特性小试牛刀

作者: 相信微服务大家伙都有听说和知道,好处弊端咱也不多说了,Grpc算是一个比较全面的微服务框架,也得到微软的支持总结下来就是,跨平台,可靠,通信快,扩展性强,网络消耗小…

CF1168D Anagram Paths(由必要到充分/虚树)

CF1168D Anagram Paths 对于这道题首先有一个关键的性质,那就是对于一个树,它是可重排的,当且仅当在树上任意一个节点,所有字母在相关联的字符串中出现次数最大值之和小于当前点到叶子的距离。这个性质可以通过归纳证明&#xff0…

基于Coravel定时任务之计算总页数

在物联网系统中,需要计算底端所有设备的总数,除以分页每页显示数量,进行一个总页数的显示。包括状态,告警,日志等等数据都需要对应的总页数的显示。2.1 TaskSchedulerTaskScheduler库只支持.net,且需要结合…

Docker系列之AspNetCore Runtime VS .NetCore Runtime VS SDK(四)

接下来我们就要慢慢步入在.NET Core中使用Docker的殿堂了,如题在开始之前,我们需要搞清楚一些概念,要不然看到官方提供如下一系列镜像,我们会一脸懵逼,不知道到底要使用哪一个。AspNetCore Runtime VS .NetCore Runti…

.NET Core跨平台部署于Docker(Centos)- 视频教程

.NET Core跨平台部署于Docker,Docker部署于Centos中,演示跨平台特性!以下视频教程,请带上耳机开始聆听往期教程:.NET开发框架(一)-框架介绍与视频演示.NET开发框架(二)-框架功能简述.NET开发框架(三)-高可用服务器端设计.NET开发框…

【清华集训2014】Sum)(类欧几里得算法)

【清华集训2014】Sum 然后本质上我们需要求解的就是那个带根号式子的奇偶性,然后我们发现这个式子很像是类欧几里得算法,求解一个斜率为无理数直线下的整点个数,然后我们直接对于一般形式求解,那么就是每次利用整数部分将斜率减小…

一本让我多花2倍时间读的书

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「87」篇原创敬上Hi,大家好,我是Z哥。熟悉我的小伙伴应该知道,我平时看书大多都很快,之前还把自己的速读技巧分享给了…

[NOI2005]月下柠檬树 (自适应辛普森)

P4207 [NOI2005]月下柠檬树 如图,我们要求的面积就是这些圆形跟梯形的组合,由于投射到地面上,显然有h′htanθh \frac{h}{tan \theta}h′tanθh​,由此我们就可以开始推导这个f(x)f(x)f(x)函数了。 所以转换为我们要推导出直线a…

Kong 1.3发布,原生gRPC代理、上游TLS交叉认证

Kong 1.3 发布了,此版本亮点包括支持原生 gRPC 代理、上游 TLS 交叉认证,以及一系列新功能和性能改进。原生 gRPC 代理越来越多的用户转向微服务架构,并且希望有对原生 gRPC 代理的支持,Kong 1.3 解决了这个问题,为支持…

对Windows桌面应用程序进行UI自动化测试

所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试。要对Windows桌面应用程序进行UI自动化测试,目前可选的技术主要是两种:VS自带的CodedUI Test和AppiumWinAppDriver。但是&…

项目实战中如何使用抽象类和接口

引子:时常会有这么一个疑惑,抽象类和接口功能好像,真正用起来该如何抉择呢??好问题。。来看看书上怎么说的(C#7.0本质论)虽然方法可在基类中声明为抽象成员,但是!&#x…

番茄日志发布1.0.3版本-增加Kafka支持

番茄日志(TomatoLog)能做什么可能你是第一次听说TomatoLog,没关系,我可以从头告诉你,通过了解番茄日志,希望能帮助有需要的朋友,番茄日志处理将大大降低你采集、分析、处理日志的过程。介绍Toma…

ArangoDB 3.5发布:流事务API、蒙面数据、搜索性能大幅提升、最短路径功能

ArangoDB 3.5 发布了。ArangoDB 是一个分布式原生的多模型数据库,具有灵活的文档、图形和键值数据模型。使用方便的 SQL 查询语言或 JavaScript 扩展构建高性能应用程序。此版本亮点包括:期待已久的 Streaming Transactions API,可以直接使用…

ASP.NET Core on K8S深入学习(7)Dashboard知多少

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。在第二篇《部署过程解析与Dashboard》中介绍了如何部署Dashboard,但是没有更多地介绍如何使用Dashboard,本文就来对Dashboard的使用进行补充。…

【学习笔记】Docker - 02. 在容器中运行软件(上)

2.1 控制容器: 构建一个网站监视器 需求: 客户想让你做一个网站, 这个网站需要被紧密的监视, 如果服务器宕机了, 那么它们的团队会收到相关的邮件. 这里用到了3个容器. 第一个运行NGINX; 第二个运行一个叫做mailer的程序. 这两个容器都是detached的. Detached 表示容器将在后台…