Nunit单元测试入门学习随笔(一)
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单元测试入门学习随笔(一)的更多相关文章
- Hive入门学习随笔(一)
Hive入门学习随笔(一) ===什么是Hive? 它可以来保存我们的数据,Hive的数据仓库与传统意义上的数据仓库还有区别. Hive跟传统方式是不一样的,Hive是建立在Hadoop HDFS基础 ...
- Vue.JS入门学习随笔
PS:先说说学习Vue的缘由吧,学习完了React之后,突然发现又出了一款叫做vue的框架,而且据说可以引领又一波新框架的潮流,我容易吗我!!! Vue.js(读音 /vjuː/, 类似于view ...
- Scala入门学习随笔
推荐学习视频:慕课网http://www.imooc.com/learn/613,讲师:辰风 ScalaAPI:http://www.scala-lang.org/api/current/#packa ...
- Hadoop入门学习随笔
推荐视频:慕课网http://www.imooc.com/video/8107 ===Hadoop是什么? 开源的.分布式存储+分布式计算平台. http://hadoop.apache.org == ...
- Hive入门学习随笔(二)
====使用Load语句执行数据的导入 --将操作系统上的文件student01.txt数据导入到t2表中 load data local inpath '/root/data/student01.t ...
- NUnit单元测试资料汇总
NUnit单元测试资料汇总 从安装到配置 首先到官网http://www.nunit.org/下载如下图的资料,安装NUnit-2.6.1.msi包. 然后挂在VS2010外部工具这个地方来使用,工具 ...
- MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
- MyBatis入门学习(二)
在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...
- Bootstrap3.0入门学习系列
Bootstrap3.0入门学习系列规划[持续更新] 前言 首先在此多谢博友们在前几篇博文当中给与的支持和鼓励,以及在回复中提出的问题.意见和看法. 在此先声明一下,之前在下小菜所有的随笔文章中, ...
随机推荐
- 连接MySQL的10060错误:Can't connect to MySQL server on '*.*.*.*'(10060)
使用MySQL的图形界面管理工具Navicat for MySQL连接Mysql数据库时提示错误:Can't connect to MySQL server (10060) [出现该问题可能的原因:] ...
- Linux上安装nginx+tomcat负载均衡
1.Ngnix Nginx (发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行. 其特点是占有内 ...
- [JavaScript] 前端模块加载简单实现(require)
模块加载的简单实现 (function(win) { var baseUrl; var paths; var script_cache = {}; var script_queue = []; var ...
- 【译】微型ORM:PetaPoco
PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...
- c# 静态构造函数与构造函数的调用先后
先上代码: 测试类: /// <summary> /// 构造函数 /// </summary> public RedisHelper() { Console.WriteLin ...
- C#基础知识回顾:1.由WeakReference想到对象的创建与销毁
.Net Framework中,把资源分为托管资源和非托管资源两大类, 托管资源指可以通过.Net Frame垃圾回收器进行回收的资源,主要是指分配在托管堆上你的内存资源,这类资源的回收是不需要人工干 ...
- springMVC_07乱码及restful风格
乱码的解决 通过过滤器解决乱码问题:CharacterEncodingFilter 配置web.xml文件 <filter> <filter-name>encoding< ...
- spring-framework-中文文档二:Bean概述
Spring IoC容器管理一个或多个bean.这些bean是使用您提供给容器的配置元数据创建的,例如,以XML <bean/>定义的形式 . 在容器本身中,这些bean定义被表示为 Be ...
- 汇编语言--微机CPU的指令系统(五)(转移指令)
(9)转移指令 转移指令是汇编语言程序员经常使用的一组指令.在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所 ...
- CSS使用position:sticky 实现粘性布局
简介 前面写了一篇文章讲解了position常用的几个属性:<CSS 属性之 position讲解>一般都知道下面几个常用的: { position: static; position: ...