Nunit单元测试

一、插件安装与项目关联

选择工具~扩展和更新

点击联机~搜索Nunit安装图内三个插件

新建单元测试项目

勾选项目引用

二、Nunit学习

1、了解单元测试

单元测试在我的理解是测试中针对可执行测试的最小单元,编写一个测试方法去检测开发人员的代码段甚至某个方法是否正确。判断在某个特定条件(场景)下,某个函数的行为是否符合预期期望。

2、Nunit属性(划重点)

先看一个简单的示例:

using NUnit.Framework;

using unitdemo;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace unitdemo.Tests

{

[TestFixture()]

public class ProgramTests

{

[Test()]

public void AddTest3()

{

int a = 100;

int b = 10;

Assert.AreEqual(100,Program.Add(a, b));

}

}

}

测试类和测试方法前有TestFixture和Test属性,TestFixture表示需要测试的类,也就是说测试的单元,Test表示测试用例,也就是测试方法,NUint中的TestFixture和Test属性是我们最常用的属性。

属性:

Nunit属性

说明

TestFixture

标记一个测试类:

1、测试类必须是Public

2、必须有一个缺省的构造函数,构造函数应该没有任何的副作用

Test

标记测试方法:

1、方法必须没有参数

2、方法必须是Public,返回值为void

TestFixtureSetUp

初始化整个类,在Nunit执行一次

TestFixtureTearDown

销毁,回收整个类,在Nunit执行一次

SetUp

作用是将测试方法中公用的部分抽取出来,单独组织成一个方法,避免代码的冗余。初始化方法,会在其他测试方法前首先被执行,在测试类中有多少方法就会被执行多少次,同样方法必须是Public。

TearDown

回收,与SetUp对应,同样是在测试类中有多少个方法,TearDown 就会被执行多少次

N/A

标识测试用例说明

Ignore

标识忽略测试用例的说明,指示这个方法由于某些原因暂时不需要测试(比如没有完成相关代码),标记该测试方法不会在 NUnit 中执行,在 NUnit 运行时会执行该字符串,说明:不执行测试的原因等。

Explicit

与[Ignore]属性类似,区别在于被[Ignore]属性忽略后的test或testFixture再想调用执行是不可能的,而[Explicit]支持显示选择执行。

ExpectedException

如果被标记的方法没有抛出期望的异常,测试无法通过。

如:[ExpectedException(typeof(异常类型))]

Category

标识测试用例的分类

3、断言(重点,内容较多,用多了就记住了)

回顾一下属性下的实例代码里有这么一句“Assert.AreEqual(Program.Add(a, b), 110);”,这就是Nunit的断言其中的一种。断言也就是判断验证,在合适的地方设置断言进行判断是否得到我们想要的期望。

注意:如果断言失败,方法将没有返回,并且报告一个错误;如果一个方法中包括了多个断言,在失败的断言之后的所有断言不会被继续执行。故,最好是为每个测试的断言使用try语句。

常用的断言(必须要掌握的):

断言

说明

示例

Assert.AreEqual(object expected,objectactual[,string message])

验证两个对象是否相等(Assert.AreNotEqual是否不相等)

Assert.AreEqual(100,a+b)

Assert.AreSame(object expected,objectactual[,string message])

验证两个引用是否指向同一对象

object expected = new object(); object actual = expected; Assert.AreSame(expected, actual)

Assert.IsFalse(bool)

验证bool值是否为false

Assert.IsFalse(false)

Assert.IsTrue(bool)

验证bool值是否为true

Assert.IsTrue(true)

Assert.IsNotNull(object)

验证对象是否不为null

Assert.IsNotNull(new object())

Assert.IsNull(object)

验证对象是否为null

Assert.IsNull(null)

3.1、断言类介绍:

Nunit一共有四个断言类,分别是Assert、StringAssert、FileAssert和DirectoryAssert,它们都在NUnit.Framework命名空间,其中Assert是常用,也是我们最熟悉的,而另外三个断言类,顾名思义,分别对应于字符串的断言、文件的断言和目录的断言,理论上,仅Assert类就可以完成所有条件的判断,然而,如果合理的运用后面的三个断言,将使代码更加简洁、美观,也更加便于理解和维护。

3.2、Assert类

1、相等/不相等判断

Int a=1

Assert.AreEqual(a,1);//通过判断

Assert.AreEqual(a,2);//不能通过判断

除了Assert.AreEqual/Assert.AreNotEqual,下面几乎所有的方法都支持多态(多种数据类型),以及多参数

这个断言还有一种典型的参数形式:

Assert.AreEqual(110, Program.Add(a, b), "相等测试通过");

Assert.AreEqual(100, Program.Add(a, b), "不相等测试不通过");

第三个条件是测试不通过时输出的信息,便于定位错误

对于double和decimal类型,这两个方法还支持比较数的浮点误差

Demo:

double A = 1.1;

double B = 1.11;

double C = 0.000009;

Assert.AreEqual(A, B, C);//通过判断如果允许的数据的偏差在C,B-A<C就能通过

2、类的判断

AreSame(expected, actual, message):该断言判断actual和expected指向的是否是同一对象。如果不是同一对象则报告错误。

AreNotSame(expected, actual, message):该断言判断actual和expected指向的是否是同一对象。如果是同一对象则报告错误。

Contains(anObject, collection, message):

anObject——一个对象;

collection——一个数组或列表;

message——发生错误时要报告的消息。

该断言判断一个对象是否被包含在一个列表或数组里,也就是说这个对象是否是一个数据或列表的成员。如果不是报告错误。

Demo:

List<string> list = new List<string>();

list.Add("a");

list.Add("b");

Assert.Contains("a", list); //通过判断

Assert.Contains("b", list); //通过判断

Assert.Contains("ab", list); //不能通过判断

3、条件判断

IsTrue(bool condition, string message)

IsFalse(bool condition, string message)

IsNull(object anObject, string message)

IsNotNull(object anObject, string message)

IsNaN(double aDouble, string message)

IsEmpty(string aString, string message)

IsNotEmpty(string aString, string message):判断数值是Nan

IsEmpty(ICollection collection, string message):判断字符串是否为空

IsNotEmpty(ICollection collection, string message):判断字符串是否不为空

 

4、比较判断

Greater(arg1, arg2, message):arg1是否大于arg2

GreaterOrEqual(arg1, arg2, message):arg1是否大于等于arg2

Less(arg1, arg2, message):arg1是否小于arg2

LessOrEqual(arg1, arg2, message):arg1是否小于大于arg2

适用类型:int uint decimal float double

5、类型判断

IsInstanceOfType(expected, actual, message)

IsNotInstanceOfType(expected, actual, message)

该断言判断actual的类型是否就是expected所指定的类型。如不是/是则报告错误。

expected——期望的对象的类型,接受一个type类型的参数;

actual——对象;

message——发生错误时要报告的消息。

Demo:

public class Person

{

public string name{ set; get; }

}

class demo

{

[Test()]

public void Test2()

{

Person r = new Person();

r.name = "a";

Assert.IsInstanceOf(typeof(Person), r);//通过判断

Assert.IsInstanceOf(typeof(System.String), r);//不能通过判断

}

}

6、异常判断

Throws:应该抛出某类型的异常

DoesNotThrow:不应该抛出某类型的异常

7、其他常用的方法

Pass:强行让测试通过

Fail:强行让测试失败

Ignore:忽略该测试方法

Inconclusive:未验证该测试

Assert.Pass();

Assert.Pass(string message );

Assert.Pass(string message, object[] parms );

Assert.Fail();

Assert.Fail(string message );

Assert.Fail(string message, object[] parms );

Assert.Ignore();

Assert.Ignore(string message );

Assert.Ignore(string message, object[] parms );

Assert.Inconclusive();

Assert.Inconclusive(string message );

Assert.Inconclusive(string message, object[] parms );

这些方法让我们能直接控制测试的进程,其中Assert.Pass 让你直接通过测试来结束这次的测试:这会导致一个异常产生,是高效的让测试返回的方法。除此之外,你也可以提供一个消息,让我们可以直观看出原因。

Assert.Fail 可以让测试失败为结果来结束本次测试。

Assert.Ignore 让我们有能力动态的忽略某个测试或条件。它可以在test,setup,fixture setup方法中调用。建议只在单独的条件内调用,因为Nunit的分类机制提供更广泛的如包含、排除等,你可以更简单的选择让测试运行在不同的场合或者程序集。

Assert.Inconclusive 的作用是指出现有条件下,测试不能完成:因为它不能证明断言是成功或失败。

这几个方法一样,即使把它放到一个独立的方法中,然后再调用这个方法,它仍然会被激发来结束测试

3.3、StringAssert类

StringAssert用于String类型的断言判断:

StringAssert.Contains:是否包含子串

StringAssert.StartsWith:是否以某子串开头

StringAssert.EndsWith:是否以某子串结尾

StringAssert.AreEqualIgnoringCase:两个字符串是否在不区分大小写时相等

StringAssert.IsMatch:是否匹配,(使用正则表达式进行字符串比较)

Demo:

string s1 = "abc";

StringAssert.Contains("b", s1);

StringAssert.StartsWith("a", s1);

StringAssert.EndsWith("c", s1);

string s2 = "aBc";

StringAssert.AreEqualIgnoringCase(s1, s2);

StringAssert.IsMatch("[a|book]", "123");

3.3、CollectionAssert类

AllItemsAreInstancesOfType:集合中的各项是否是某某类型的实例

AllItemsAreNotNull:集合中的各项均不为空

AllItemsAreUnique:集合中的各项唯一

AreEqual:两个集合相等

AreEquivalent:两个集合相当

AreNotEqual:两个集合不相等

AreNotEquivalent:两个集合不相当

DoesNotContain:集合中不包含某对象

IsSubsetOf:一个集合是另外一个集合的子集

IsNotSubsetOf:一个集合不是另外一个集合的子集

IsEmpty:集合为空

IsNotEmpty:集合不为空

IsOrdered:集合的各项已经排序

Demo:

List<int> a = new List<int>();

List<int> b = new List<int>();

CollectionAssert.IsEmpty(a);

for (int i = 1; i <= 10; i++)

{

a.Add(i);

b.Add(i);

}

CollectionAssert.AreEqual(a, b);

CollectionAssert.IsOrdered(a);

b.Remove(1);

CollectionAssert.IsSubsetOf(b, a);

CollectionAssert.AreEqual(a, b);

Nunit单元测试入门学习随笔(一)的更多相关文章

  1. Hive入门学习随笔(一)

    Hive入门学习随笔(一) ===什么是Hive? 它可以来保存我们的数据,Hive的数据仓库与传统意义上的数据仓库还有区别. Hive跟传统方式是不一样的,Hive是建立在Hadoop HDFS基础 ...

  2. Vue.JS入门学习随笔

    PS:先说说学习Vue的缘由吧,学习完了React之后,突然发现又出了一款叫做vue的框架,而且据说可以引领又一波新框架的潮流,我容易吗我!!!   Vue.js(读音 /vjuː/, 类似于view ...

  3. Scala入门学习随笔

    推荐学习视频:慕课网http://www.imooc.com/learn/613,讲师:辰风 ScalaAPI:http://www.scala-lang.org/api/current/#packa ...

  4. Hadoop入门学习随笔

    推荐视频:慕课网http://www.imooc.com/video/8107 ===Hadoop是什么? 开源的.分布式存储+分布式计算平台. http://hadoop.apache.org == ...

  5. Hive入门学习随笔(二)

    ====使用Load语句执行数据的导入 --将操作系统上的文件student01.txt数据导入到t2表中 load data local inpath '/root/data/student01.t ...

  6. NUnit单元测试资料汇总

    NUnit单元测试资料汇总 从安装到配置 首先到官网http://www.nunit.org/下载如下图的资料,安装NUnit-2.6.1.msi包. 然后挂在VS2010外部工具这个地方来使用,工具 ...

  7. MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

    上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...

  8. MyBatis入门学习(二)

    在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...

  9. Bootstrap3.0入门学习系列

    Bootstrap3.0入门学习系列规划[持续更新]   前言 首先在此多谢博友们在前几篇博文当中给与的支持和鼓励,以及在回复中提出的问题.意见和看法. 在此先声明一下,之前在下小菜所有的随笔文章中, ...

随机推荐

  1. maven创建一个简单的web项目

    1.确认maven插件和配置在eclipse中已经完成 如果没完成,可参考这篇博客:http://www.cnblogs.com/mmzs/p/8191979.html 2.在eclipse中用mav ...

  2. 建了个QQ群,不定期分享一些资料,欢迎加入

    技术源于生活,大家一起进阶 Java学习交流QQ群:603654340 大数据学习交流QQ群:217770236 感谢您的来访,不妨关注一下我吧……

  3. JS_object添加变量属性_动态属性

    总结,给对象动态添加变量属性的方法如下: obj[变量]=变量值; 备注: obj.属性=属性值 ; obj={属性:属性值}; 这两种方式添加的属性都不能使用变量作为属性. 犯过的错误: var t ...

  4. 快乐的一天从JAVA第一课开始,生活美滋滋!!!

    ---恢复内容开始--- 学JAVA第一天 今天稀里糊涂就把JAVA环境配好了 现在回想一下,吧环境跟大家分享一下…… 第一步:下载         JAVA(推荐使用谷歌浏览器,因为谷歌浏览器右键点 ...

  5. SpringBoot+kafka+ELK分布式日志收集

    一.背景 随着业务复杂度的提升以及微服务的兴起,传统单一项目会被按照业务规则进行垂直拆分,另外为了防止单点故障我们也会将重要的服务模块进行集群部署,通过负载均衡进行服务的调用.那么随着节点的增多,各个 ...

  6. 【设计模式】不同设计模式体现IOC控制反转

    使用过Spring的开发者应该都对IOC控制反转功能有所了解,最开始学习时应该都知道使用依赖注入来实现IOC的功能,本文来介绍使用IOC控制反转思想的几种设计模式. 依赖注入来实现IOC 注入依赖是I ...

  7. (8)Microsoft office Word 2013版本操作入门_制作传单海报

    1.纸张大小,方向设定. 1.1纸张大小: [页面布局]----[纸张大小] 可以选择已有的尺寸,也可以选择其他自定义的大小. 1.2 方向设定: [页面布局]--[纸张方向]选择 横向或者纵向 2. ...

  8. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  9. 关于Facebook和Google+授权登录

    实际中遇到需要Facebook和Google+等第三方授权登录自己的Web应用(可能还有Android和IOS的手机应用),本质上都是JS SDK的官方应用.这时候不得不去他们官方查看文档. 注:一下 ...

  10. linux定时任务crontab 实现如何每秒执行一次!

    linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. Cron 各项的描述 以下是 crontab 文件的格式: {minute} {hour} ...