NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档。初次写博客,望大家指点。

导航:

单元测试之NUnit一

单元测试之NUnit二

单元测试之NUnit三

本文介绍常用的NUnit属性特性和断言。

常用属性

更多属性参考官方文档

1. Test Attribute

标记一个方法为测试方法。

        /// <summary>
/// 简单标记方法为测试方法
/// </summary>
[Test]
public void Add()
{
Assert.AreEqual(4, 2 + 2);
} /// <summary>
/// 添加说明内容,等同于DescriptionAttribute属性
/// </summary>
//[Test(Description = "这是说明内容")]
[Test,Description("这是说明属性")]
public void Add()
{
Assert.AreEqual(4, 2 + 2);
} // 标记异步方法
[Test]
public async Task AddAsync()
{
/* ... */
} // 如果测试方法有返回值,要使用ExpectedResult校验
[Test(ExpectedResult = 4)]
public int TestAdd()
{
return 2 + 2;
} // 异步含返回值的测试方法
[Test(ExpectedResult = 4)]
public async Task<int> TestAddAsync()
{
//await do something;
return 2 + 2;
}
2. TestFixture Attribute

标记一个类为测试类。从2.5版本开始,对于非参数化、非泛型化测试类是可选的。只要类包含Test、TestCase、TestCaseSource属性标记的方法,都会被视为一个测试类。

TestFixture大多数用来构造参数,被标记的类必须有个对应的构造函数。

简单例子:

/// <summary>
/// 使用TestFixture标记会生成三个测试,是每个测试方法执行三次
/// </summary>
[TestFixture("hello", "hello", "goodbye")]
[TestFixture("zip", "zip")]
[TestFixture(42, 42, 99)]
public class TestFixtureAttributeTest
{
private string eq1;
private string eq2;
private string neq; public TestFixtureAttributeTest(string eq1, string eq2, string neq)
{
this.eq1 = eq1;
this.eq2 = eq2;
this.neq = neq;
} public TestFixtureAttributeTest(string eq1, string eq2)
: this(eq1, eq2, null) { } public TestFixtureAttributeTest(int eq1, int eq2, int neq)
{
this.eq1 = eq1.ToString();
this.eq2 = eq2.ToString();
this.neq = neq.ToString();
} [Test]
public void TestEquality()
{
Assert.AreEqual(eq1, eq2);
if (eq1 != null && eq2 != null)
Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode());
} [Test]
public void TestInequality()
{
Assert.AreNotEqual(eq1, neq);
if (eq1 != null && neq != null)
Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode());
}

还可以标记类型:

    /// <summary>
/// 标记TList会以两种类型来执行。
/// </summary>
/// <typeparam name="TList"></typeparam>
[TestFixture(typeof(ArrayList))]
[TestFixture(typeof(List<int>))]
public class IList_Tests<TList> where TList : IList, new()
{
private IList list; [SetUp]
public void CreateList()
{
this.list = new TList();
} [Test]
public void CanAddToList()
{
list.Add(1); list.Add(2); list.Add(3);
Assert.AreEqual(3, list.Count);
}
}
3. SetUp And TearDown Attribute

标记一个方法在测试前或者测试后执行,以便初始化或者清理一些参数。

 public class SetUpAndTearDownTest
{
[SetUp]
public void SetUp()
{
Console.WriteLine("我在测试前执行");
}
[Test]
public void Test()
{
Console.WriteLine("我在测试时执行");
Assert.Pass();
} [TearDown]
public void TearDown()
{
Console.WriteLine("我在测试后执行");
}
}

执行Test测试方法,依次输出:

我在测试前执行

我在测试时执行

我在测试后执行

4. TestCase Attribute

TestCase有两个作用:

标记为测试方法;

为方法提供测试参数。

public class TestCaseTest
{
[TestCase(12, 3, 4)]
[TestCase(12, 2, 6)]
[TestCase(12, 4, 3)]
public void DivideTest(int n, int d, int q)
{
Assert.AreEqual(q, n / d);
} /// <summary>
/// TestCase 可以包含条件属性:Author、Category、Description、ExcludePlatform、ExpectedResult、Explicit、Ignore、IgnoreReason、IncludePlatform、Reason、TestName、TestOf
/// </summary>
/// <param name="n"></param>
/// <param name="d"></param>
/// <returns></returns>
[TestCase(12, 3, ExpectedResult = 4)]
[TestCase(12, 2, ExpectedResult = 6)]
[TestCase(12, 4, ExpectedResult = 3)]
public int DivideTest(int n, int d)
{
return n / d;
}
}

常用断言

更多参考官方文档 的Pages页。

1. Assert.AreEqual
        [Test]
public void AreEqual_Test()
{
Assert.AreEqual(5, 5.0);//Successed.double 和 int 会内部转化比较。
//Assert.AreEqual(5.0, "5.0");//Failed.double和string类型不能相互比较。
List<Dictionary<int, string>> dic1 = new List<Dictionary<int, string>>
{
new Dictionary<int, string>(){ { 1,"one"},{2,"two" } }
};
List<Dictionary<int, string>> dic2 = new List<Dictionary<int, string>>
{
new Dictionary<int, string>(){{1,"one"}, { 2, "two" } }
};
Assert.AreEqual(dic1, dic2);//Successed.泛型也可以比价,会比较内部的值,且只能一一对应。
List<int> list = new List<int> { 1, 3, 2 };
List<double> list2 = new List<double> { 1.0, 2.0, 3.0 };
Assert.AreEqual(list, list2);//Failed.
}
2. Assert.AreSame
        [Test]
public void AreSame_Test()
{
BankAccount A = new BankAccount(1000);
BankAccount B = A;
Assert.AreSame(A, B);// Successed 引用类型对象
double a = 5;
double b = 5;
Assert.AreSame(a, b);//Failed 值类型两个值相同对象不相同。
}
2. Assert.True

判断条件是否为真。

 bool result = true;
Assert.IsTrue(result);

组合条件判断 Assert.That + Constraint

以前老版本有 Assert.IsNullOrEmpty("");这样的断言,新版本之后就没有了。那如果要满足这种判断怎么处理呢?

NUnit提供了一系列条件组合,配合 Assert.That 的使用可以灵活多变。

Constraint的使用参考文档

1. 取代 Assert.IsNullOrEmpty
Assert.That("1", Is.Null.Or.Empty);

本文就举一两例子介绍NUnit的使用,关于Attribute、Assert和Condition的使用得多参考官方文档学习(文中已经贴了链接)。

单元测试之NUnit二的更多相关文章

  1. 单元测试之NUnit三

    NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 除了Assert断言外 ...

  2. 单元测试之NUnit一

    NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 NUnit是什么? N ...

  3. spring boot单元测试之RestTemplate(二)

    上篇博客中,简单介绍了RestTemplate,只是用到了单元测试环节,如果在正式开发环境使用RestTemplate调用远程接口,还有一些配置要做. 一.配置类 由于Spring boot没有对Re ...

  4. [转载]单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而又忐忑的心情点击界面上的 ...

  5. 单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上 ...

  6. Visual Studio 单元测试之二---顺序单元测试

    原文:Visual Studio 单元测试之二---顺序单元测试 此文是上一篇博文:Visual Studio 单元测试之一---普通单元测试的后续篇章.如果读者对Visual Studio的单元测试 ...

  7. Android单元测试之二:本地测试

    Android单元测试之二:本地测试 本地测试 本地测试( Local tests):只在本地机器 JVM 上运行,以最小化执行时间,这种单元测试不依赖于 Android 框架,或者即使有依赖,也很方 ...

  8. 使用VisualStudio进行单元测试之二

    借着工作忙的借口,偷了两天懒,今天继续单元测试之旅.前面说了如何进行一个最简单的单元测试,这次呢就跟大家一起来熟悉一下,在visual studio中如何进行数据驱动的单元测试. 开始之前先来明确一下 ...

  9. 单元测试之Qunit

    单元测试之Qunit 前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QU ...

随机推荐

  1. (图文教程)IntelliJ IDEA 导入Eclipse/MyEclipse 项目 配置详解+快捷键分享

    (图文教程)IntelliJ IDEA 导入Eclipse/MyEclipse 项目 配置详解+快捷键分享 IntelliJ IDEA 使用教程.快捷键配置. 该教程针对原始jar包依赖的工程.mav ...

  2. Cocos2d-x 3.x 学习笔记(6):Sprite SpriteFrameCache Texture2D TextureCache

    1. 概述 TextureCache是对Texture2D纹理的缓存,SpriteFrameCache是对SpriteFrame的缓存,每个SpriteFrame是对Texture2D的封装,Spri ...

  3. Linnux命令大全(vim)

    vim复制和粘贴的基本命令(注:需先退出编辑模式)    yy复制游标所在行整行.或大写一个Y. (常用)    2yy或y2y复制两行. (常用)    y^复制至行首,或y0.不含游标所在处字元. ...

  4. linux初学者-iscsi篇

     linux初学者-iscsi篇         之前介绍过网络文件共享系统NFS和CIFS.在系统中,设备也是可以共享的,这就是iSCSI,它可以用来建立和管理IP存储设备.主机和客户机等之间的相互 ...

  5. S2第四章

  6. Python解释器安装教程和环境变量配置

    Python解释器安装教程和环境变量配置 Python解释器安装 登录Python的官方网站   https://www.python.org/  进行相应版本的下载. 第一步:根据电脑系统选择软件适 ...

  7. 林大妈的JavaScript基础知识(三):JavaScript编程(2)函数

    JavaScript是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...

  8. 快速安装k8s,版本为1.13.8

    利用rpm快速部署k8s #!/bin/bash #快速安装k8s #by love19791126 107420988@qq.com pwd=$(pwd) masteripaddr=#(ip a s ...

  9. java并发程序和共享对象实用策略

    java并发程序和共享对象实用策略 在并发程序中使用和共享对象时,可以使用一些实用的策略,包括: 线程封闭 只读共享.共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它.共享的只读对象包括不 ...

  10. cogs 264. 数列操作 单点修改 区间查询

    http://cogs.pro:8080/cogs/problem/problem.php?pid=pyNimmVeq 264. 数列操作 ★☆   输入文件:shulie.in   输出文件:shu ...