.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言

使用前面讲过的方法基本上能够完成工作中的大部分任务了,然而有些功能实现起来还是比较麻烦的,比如说

字符串相等性比较不区分大小写,字符串是否匹配某一正则规则,集合中的每一个(某一个)元素是否符合特定规则等,Nunit提供了一些特定的方法用来实现一些用普通断言比较难以实现的扩展类型和方法.

下面介绍一下StringAssert类型下面的方法

StringAssert.AreEqualIgnoringCase(string expected,string actual)

此方法用于断言两个字符串在不区分大小写情况下是否相等,需要提供两个参数,第一个是期待的结果,第二个是实际结果.这个方法比较简单,不再提供示例.

需要注意的是Nunit里有许多需要提供两个参数的方法,一般情况下都是第一个是期待的结果,第二个是实际结果

StringAssert.Contains

用于断言一个字符串是否包含另一字符串,其中第一个参数为被包含的字符串,第二个为实际字符串,这个方法语义不是特别明确,需要注意

        [Test]        public void DemoTest()        {            StringAssert.Contains("hello", "hello,world");        }

这段代码片段会返回成功

StringAssert.StartsWith

用于断言字符串是否以某(几)字符开始

       [Test]        public void DemoTest()        {            StringAssert.StartsWith("h", "hello,world");        }

StringAssert.EndsWith

与StringAssert.StartsWith类似,string类也有此方法,相信大家都比较熟悉

StringAssert.IsMatch

用于断言指定字符串是否匹配某一正则规则

[warning]这个方法并没有大小写开关

下面介绍两个与文件(目录)有关的断言类FileAssert和DirectoryAssert.两个类下面的断言方法基本一样,只是一个是断言文件,一个是断言目录.下面以FileAssert为例说明

FileAssert.AreEqual

这个方法用于断言两个文件是否是同一个文件,接受字符串参数

需要说明的是,字符串路径必须指向文件,而不能是目录或者不存在的文件.

FileAssert.Exists

用于断言某个文件是否存在,接受字符串参数或者FileInfo作为参数

DirectoryAssert方法类似,并且这些方法都对应的有相反方向的断言,方法名包含Not,很容易理解

单元测试过程中,我们很多时候都要处理集合,Nunit里提供了一个 CollectionAssert 类用于处理对集合类型的断言

下面介绍一下这个类下面的断言方法

CollectionAssert.AllItemsAreInstancesOfType

用于断言集合里面的元素是否都是某一特定类型.

        [Test]        public void DemoTest()        {            ArrayList ar = new ArrayList {"a", "b", "c"};            CollectionAssert.AllItemsAreInstancesOfType(ar, typeof(string));        }

以上断言会返回成功,因为我们向ArrayList里添加的全是string类型的元素

需要注意,很多断言方法第一个参数是期待类型,第二个是实际类型,而此方法则相反,第一个是实际集合,第二个是期待的类型

这里的类型支持父类,比如说如果是typeof(object)也同样能通过,语义上来讲,元素是string类型,也是object类型,讲得通的

CollectionAssert.AllItemsAreNotNull

用于断言集合里的元素全部不是Null,也即集合不包含null元素,这个方法只有一个参数,传入我们要判断的集合即可

CollectionAssert.AllItemsAreUnique

用于断言集合里面的元素全部是惟一的,即集合里没有重复元素.

[warning]需要注意的是,这个方法并没有提供一个重载支持自定义比较器,它只能用于断言简单类型,如string,int,datetime等是否惟一,如果是类类型则需要重载equalsgethashcode但是通常我们并不这样做,而是在类外部提供一个比较器,如果判断复杂类型是否惟一,我们在以后再介绍

下面举一个例子说明这个问题

      [Test]        public void DemoTest()        {            Person[] psn = new Person[] {                new Person { Name="sto",Age=32,BirthDay=DateTime.Today.AddYears(-10)},                new Person { Name="sto",Age=32,BirthDay=DateTime.Today.AddYears(-10)}};            CollectionAssert.AllItemsAreUnique(psn);        }

以上代码测试会通过,因为两个new出来的Persn不是同一个对象,但实际业务中,两个对象的属性完全相等时我们就认为它们是相等的,以上我们期待的结果是 不通过

CollectionAssert.AreEqual

用于断言两个集合是否相等,如果两个集合里的元素都是简单对象,如果是复杂对象用这个方法并不是很方便(虽然此方法提供提供IComparer作为参数,然而IComparer对集合并不是很方便)

[warning]这里的两个集合相等第一集合元素个数必须相等(不用多说),第二集合元素的顺序必须一致的

还有一点需要说明还有一点需要说明,如以上所说,两个集合元素顺序一致,并且在运行时类型是一致的就会被认为是相等,这两个集合的类型不必一样,比如说一个是array,一个是list,泛型参数也不必须一样

只要在运行时类型是一致的即可

请看下面一段代码

        [Test]        public void DemoTest()        {            int[] a = {3, 4, 5};            List<object> b =new List<object> {3, 4, 5};            CollectionAssert.AreEqual(a, b);        }

a和b两个集合的集合类型不一样,泛型类型也不一样,但是运行的时候却是一样的,因此以上代码执行会返回成功状态

CollectionAssert.AreEquivalent

这个方法用来判断两个集合的元素是否等价,如果两个集合元素类型相同,个数也相同,即视为等价,与上面的方法相比,它不关心顺序

        [Test]        public void DemoTest()        {            int[] a = {3, 4, 5};            List<object> b =new List<object> {4,3, 5};            CollectionAssert.AreEquivalent(a, b);        }

以上代码测试是通过的

CollectionAssert.Contains

用于断言集合是否包含某一元素

需要说明的是.要判断集合中是否包含某一元素,只要集合运行时有特定元素和指定元素类型相同,并且值相同,即认为集合包含这一元素

请看以下代码片段

        [Test]        public void DemoTest()        {            int[] a = {3, 4, 5};            object element = 4;            List<object> b =new List<object> {element,3, 5};            CollectionAssert.Contains(b, 4);        }

以上代码段中b集合虽然不包含值为4的int类型元素,只有object类型的值为4的元素,然而它在运行时真正的类型是int,因此以上测试也是通过的.

CollectionAssert.IsEmpty

用于断言某一集合是空集合,即元素个数为0

CollectionAssert.IsOrdered

用于断言集合元素是否按正序排列,所谓正序列,是指按阿拉伯数字或者字符表顺序正序排列.

CollectionAssert.IsSubsetOf

用于判断一个集合是否为另一个集合的子集,与以上相同的是,这两个集合不必是同一类集合(可以一个是array,一个是list),只要一个集合的元素完全包含在另一个集合中,即认为它是另一个集合的子集

只要一个集合元素完全包含在另一个集合中即可,顺序不必相同

CollectionAssert.IsSupersetOf

用于断言一个集合是否是另一个集合的父集,与子集判断用法一样.

以上大部分方法都有一个判断相反的方法,名称中多一个Not,这里不再罗列

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

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

相关文章

Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)

Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况&#xff1a; ac/ba c / bac/b这个时候两个的单价是相同的&#xff0c;如果b1b 1b1&#xff0c;也就是aca cac&#xff0c;无论买多少数量的东西&#xff0c;这两个的价格都是一样的&…

Technocup 2020 - Elimination Round 2 E. Rock Is Push dp

传送门 文章目录题意&#xff1a;思路题意&#xff1a; 给你一个nmnmnm的方格&#xff0c;你初始在(1,1)(1,1)(1,1)点&#xff0c;有些位置有箱子&#xff0c;你可以走到某个位置向你的方向推动这个箱子&#xff0c;箱子不能出界&#xff0c;问你走到(n,m)(n,m)(n,m)有多少种方…

HttpClientFactory 使用说明 及 对 HttpClient 的回顾和对比

在 C# 中&#xff0c;平时我们在使用 HttpClient 的时候&#xff0c;会将 HttpClient 包裹在 using 内部进行声明和初始化&#xff0c;如&#xff1a;using(var httpClient new HttpClient()){ }至于为什么&#xff1f;无外乎是&#xff1a;项目代码中就是这样写的&#xf…

Codeforces Round #653 (Div. 3)(A, B, C, D, E1详解)

Codeforces Round #653 (Div. 3) Required Remainder Thinking(binary search) 既然是找最大值问题&#xff0c;我又懒得去推式子&#xff0c;于是我直接就上了一个二分&#xff0c;二分写法比结论稍微繁琐了一点吧&#xff0c;但是还是挺好想的。 根据题意&#xff0c;我们…

记录用友T+接口对接的心酸历程

前言&#xff1a;公司的业务主要是对接财务系统做单据传输或者凭证处理的&#xff0c;难免少不了和各大财务软件做数据对接&#xff0c;其中当然是必须通过接口来传递数据了。于是乎&#xff0c;用友T的版本来了&#xff0c;对接的工作自然是我来做&#xff0c;可没想到就是这样…

P6327 区间加区间sin和 线段树 + 数学

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的序列aaa&#xff0c;有mmm次操作&#xff0c;每次操作分两种类型&#xff1a; (1)l,r,v(1)l,r,v(1)l,r,v&#xff0c;将al,al1,...,ara_l,a_{l1},...,a_ral​,al1​,...,ar​分别加上vvv…

集群故障处理之处理思路以及听诊三板斧(三十四)

前言 本篇主要分享一些处理故障和问题绝招&#xff0c;比如听诊三板斧&#xff1a;1&#xff09;查看日志2&#xff09;查看资源详情和事件3&#xff09;查看资源配置&#xff08;YAML&#xff09;如果还是不太好分析&#xff0c;那就祭出神器——kubectl-debug。最后&…

AC Automaton

简单复习一下字符串&#xff0c;顺便存个板子。 // Problem: P3808 【模板】AC自动机&#xff08;简单版&#xff09; // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P3808 // Memory Limit: 512 MB // Time Limit: 1000 ms // // Powered by CP Editor (http…

selenium搜狗搜图简单操作(爬取任意关键字的图片)

Picture preview Steps 这里以搜狗搜图作为一个简单的例子&#xff1a; 第一步就是获取我们的需求了&#xff0c;输入需要下载的图片名字以及需要下载的图片数量。 接下来我们需要在搜狗搜图中输入用户的需求&#xff0c;透过xpathxpathxpath锁定搜索框&#xff0c;然后输入…

Microsoft REST API指南

经过3个月的碎片时间的翻译和校验&#xff0c;由长沙.NET技术社区翻译的英文原文文档《Microsoft REST API指南 》已经翻译完成&#xff0c;现刊载前十一章如下&#xff0c;欢迎大家点击“查看原文”按钮&#xff0c;查看指南的完整内容。PS&#xff1a;内容很长&#xff0c;全…

D. Salary Changing(二分,前缀和,贪心,瞎搞)

Salary Changing Thinking 这道题第一思路就是二分&#xff0c;模拟了一下样例&#xff0c;感觉好像行于是就开始写。 对于二分&#xff0c;我们一定是二分中位数是什么&#xff0c;二分的边界对我们来说是非常重要的&#xff0c;所以我们在二分前有必要确认我们的二分边界&…

如何优雅地替换一个实现

前两天&#xff0c;我所在的项目有一个小的技术改动&#xff0c;打算把访问Redis的密码从数据库挪到配置文件里。以前的代码类似下面这样&#xff1a;用户第一次调用GetDatabase时&#xff0c;根据传入的数据库连接字符串访问数据库&#xff0c;从某个表里取出带密码的Redis连接…

莫队——三种题型

普通莫队 P3901 数列找不同 Thinking 一定是用可以用莫队来写题&#xff0c;这点是不用质疑的&#xff0c;所以那就简单了&#xff0c;只需要判断每次询问的区间是否满足r−l1numr - l 1 numr−l1num就行了。 Coding1Coding_1Coding1​ 莫队写法 #include <bits/stdc…

P5357 【模板】AC自动机(二次加强版) fail树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 这个只能搞failfailfail树了&#xff0c;让后跑一遍即可。 重复的字符串记一个&#xff0c;让后其他的都跟他一个答案即可。 // Problem: P3796 【模板】AC自动机&#xff08;加强版&…

10分钟了解一致性hash算法

应用场景当我们的数据表超过500万条或更多时&#xff0c;我们就会考虑到采用分库分表&#xff1b;当我们的系统使用了一台缓存服务器还是不能满足的时候&#xff0c;我们会使用多台缓存服务器&#xff0c;那我们如何去访问背后的库表或缓存服务器呢&#xff0c;我们肯定不会使用…

Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 你有nnn个装备槽&#xff0c;每个槽里面有cic_ici​个力量加成&#xff0c;对于每个槽只能选一个力量加成&#xff0c;现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2,...,b_n][b1​,b2​,...,bn​]代表这个力…

[SCOI2008]着色方案(DP)

题目链接 思想 显然我们后面的决策是跟前一步相关的&#xff0c;因此我们可以考虑DP&#xff0c;可以用一个15维的数组来进行转移&#xff0c;但是这样显然回mle&#xff0c;所以我们考虑如何压缩状态&#xff0c;由于1<Ci<51 < C_i < 51<Ci​<5&#xff0…

创业周年记:召唤神龙一周年小记

2018年8月8日&#xff0c;我决定离开腾讯的光环&#xff0c;辞职开始创业。《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》记录了我所说的拥有七龙珠&#xff0c;去召唤神龙&#xff0c;今天正好历时一年时间&#xff0c;非常有必要来回顾过去一年的创业历程。迎接…

1285. 单词 ac自动机 + fail树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 一篇论文由若干单词构成&#xff0c;且单词间是隔开的&#xff0c;给你nnn个单词&#xff0c;要求你计算每个单词在论文中出现了多少次。 1≤n≤2001\le n\le 2001≤n≤200&#xff0c;所有单词总长不超过1e…

Bitset瞎搞

Bitset字符匹配 Regular Number /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h> #define mp make_pair #define pb push_back #define endl \nusing namespace std;typedef long long ll; typedef unsigned long lo…