通常的单元测试框架都以他们支持的语言的开头字母加上Unit作为名字,他们统称为xUnit框架。C++的叫做CppUnit,Java的叫做JUnit,.Net的叫做NUnit。当然不是所有的都这么命名,但大部分如此。下面我主要讲解一下NUni的一些基本操作。

1:Nunit两个重要属性

1.1:[TestFixture]

这个是标识包含自动化测试的类,可能改成TestClass大家更加理解。但是代码是无法编译过去的。

1.2:[Test]

这个是标识这个方法需要自动化测试的。记得把这个属性加在要测试的方法上。

2:编写第一个单元测试

2.1:一个单元测试通常包含三个行为:

2.1.1:准备对象(就是对哪个对象就行操作)

2.1.2:操作对象(对对象进行一些逻辑处理)

2.1.3:断言(Assert)和预判产生的结果对比

2.2:编写一个判断后缀名的方法

public bool IsValidExtensions(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName)) throw new ArgumentNullException("fileName");
var extension = Path.GetExtension(fileName);
if (extension.Contains("pdf"))
{
return true;
}
return false;
}

2.3:编写测试方法

2.3.1:Assert这个类

Assert.IsFalse(bool condition, string message)

参数1:返回的结果  参数2:展示失败的信息

Assert.AreEqual(int expected, int actual, string message)

参数1:期望的结果  参数2:实际的结果 参数3:展示失败的信息

当然Assert很多方法可以自己去学习。

        [Test]
public void IsValidExtensions_BadExtension_ReturnsFalse()
{
var arithmetic=new Arithmetic();
bool restlt = arithmetic.IsValidExtensions("log.pdf");
Assert.IsFalse(restlt,"没有返回正确值");
}

2.3.2:编译项目然后打开Nunit,点击NUnit的File打开这个编译的dll文件然后如下图

2.3.3:我们要修改单元测试方法

右键点击上图的ArithmeticTest选择LoadFixture就会重新导入这个ArithmeticTest。ClearFixTure清理这个ArithmeticTest

2.4:使用参数重构测试

比喻上面我们的参数叫做log.pdf但是现在又要测试log.txt怎么办,如果说2个可以写,10个乃至100个呢不用担心NUnit给我们提供了两个特性

[TestCase]

ok我们来修改上面的单元测试代码

[TestCase("log.pdf")]
[TestCase("log.txt")]
public void IsValidExtensions_BadExtension_ReturnsFalse(string fileName)
{
var arithmetic=new Arithmetic();
bool restlt = arithmetic.IsValidExtensions(fileName);
Assert.IsFalse(restlt,"没有返回正确值");
}

我们在运行NUnit看看效果:

看到效果了吧我们就出现了两个方法。这样一来是不是很简单。

但是有的又说我可不可以指定我预期的效果呢,很明显是可以的我们在此修改测试方法

[TestCase("log.pdf",true)]
[TestCase("log.txt",false)]
public void IsValidExtensions_BadExtension_ReturnsFalse(string fileName)
{
var arithmetic=new Arithmetic();
bool restlt = arithmetic.IsValidExtensions(fileName);
Assert.IsTrue(restlt,"没有返回预期的值");
}

我们运行会发现这2个都能通过编译这里就不贴图了。

2.5:setup和teardown

setup特性以后表示每次运行这个测试类首先就会进入这个方法相当于我们常说的构造函数

teardown表示方法运行结束以后再运行这个方法,我们常说的析构函数

[setup]A()

[test]B()

[teardown]C()

运行顺序是A到B到C

2.6:异常检测

2.6.1:ExpectedException标识这种标识是很常见的一种测试异常的方法下面来看它的用法

public bool IsValidExtensions(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName)) throw new ArgumentNullException();
var extension = Path.GetExtension(fileName);
if (extension.Contains("pdf"))
{
return true;
}
return false;
} [Test]
[ExpectedException(typeof(ArgumentNullException),ExpectedMessage = "值不能为 null。")]
public void IsVaildFileName_EmptyFileName_ThrowException()
{
var arithmetic = new Arithmetic();
arithmetic.IsValidExtensions("");
}

第一个参数:表示显示异常的类

第二个参数:表示期望的异常

注意:这个异常并没有调用Assert因为ExpectedException本身带有判断。

我们看看测试结果:

表示异常和我们期待的一样,但是这有一个问题如果我们构造函数抛出一个异常测试同样会通过,所以就会导致测试出现了不真实性。(我测试过在构造函数抛出空异常同样测试通过)

那么就引进了另一个异常的测试方式Lambda表达式来改造一下

       [Test]
public void IsVaildFileName_EmptyFileName_ThrowException() {
var arithmetic = new Arithmetic();
var ex = Assert.Catch<Exception>(() => arithmetic.IsValidExtensions(string.Empty));
StringAssert.Contains("值不能为 null。", ex.Message);//可以不写值不能为Null也能通过测试
}

这样就避免了上面的情况,只要是lambda表达式抛出异常就通过测试否则任何地方抛出异常都不能通过测试。

2.7:忽略测试

有时候有些代码不需要测试,但是你又把它迁入主项目那么你就可以考虑把他忽略掉(当然这种情况很少的)

    [Test]
[Ignore("这个方法目前不用进行测试")]
public void IsVaildFileName_BadExtension_ReturnFalse()
{
var arithmetic = new Arithmetic();
Assert.IsTrue(arithmetic.IsValidExtensions(""));
}

测试效果:

黄色的就表示暂时不考虑测试的方法。

2.8:设置测试类别

在实际开发中可能我们很多测试,为了分开测试我们可以设置类别,也可以在测试中选择一些分类测试下面我们看看怎么实现的

[Test]
[Category("后台单元测试")]
public void IsVaildFileName_BadExtension_ReturnFalse()
{
var arithmetic = new Arithmetic();
Assert.IsTrue(arithmetic.IsValidExtensions(""));
} [Test]
[Category("前端单元测试")]
public void IsVaildFileName_EmptyFileName_ThrowException() {
var arithmetic = new Arithmetic();
var ex = Assert.Catch<Exception>(() => arithmetic.IsValidExtensions(string.Empty));
StringAssert.Contains("值不能为 null。", ex.Message);
}

我们看看效果:

大家可以自己动手测试下,实际功能比这强大很多的。

2.9:测试类中某个属性没有返回值怎么办

这个比较简单我直接贴代码了。

public bool IsOnline { get; set; }

        public void IsValidExtensions(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName)) throw new ArgumentNullException();
var extension = Path.GetExtension(fileName);
if (!extension.Contains("pdf")) return;
IsOnline = true;
}
[Test]
public void IsVaildFileName_BadExtension_ReturnFalse()
{
var arithmetic = new Arithmetic();
arithmetic.IsValidExtensions("log.pdf");
Assert.IsTrue(arithmetic.IsOnline);
}

这个效果很明显是通过的。这样来验证类的一个属性(但是有一个依耐项)

以上参考单元测试的艺术

NUnit基本使用方法的更多相关文章

  1. NUnit详细使用方法

    http://www.ltesting.net/ceshi/open/kydycsgj/nunit/ http://nunit.org/index.php?p=download NUnit详细使用方法 ...

  2. Nunit常用的方法说明

    下来还是分为2个部分,一是NUnit的布局,另外一部分就是它的核心概念. 首先熟悉一下NUnit GUI的布局. 让我们更进一步看一下测试运行器窗口的布局.在右边面板的中间,可以看到测试进度条.进度条 ...

  3. C#单元测试:NUnit详细使用方法

    1. TDD的简介 首先什么是TDD呢?Kent Beck在他的<<测试驱动开发 >>(Addison-Wesley Professional,2003)一书中,使用下面2个原 ...

  4. NUnit使用

    NUnit是.net平台上使用得最为广泛的测试框架之一,本文将通过示例来描述NUnit的使用方法,并提供若干编写单元测试的建议和技巧,供单元测试的初学者参考. 继续下文之前,先来看看一个非常简单的测试 ...

  5. .net持续集成测试篇之Nunit that断言

    系列目录 that是Nunit的新语法,语义上不如简单断言,使用上也更加复杂,但是其功能更加强大. 其基本语法如下代码片段示: [Test] public void DemoTest() { bool ...

  6. ASP.NET工具

    每个开发人员现在应该下载的十种必备工具 发布日期: 7/20/2004 | 更新日期: 7/20/2004 本文自发布以来已经增加了新信息. 请参阅下面的编辑更新. 本文讨论: • 用于编写单元测试的 ...

  7. [翻译]NUnit---TestCase Attributes(二十一)

    TestCaseAttribute (NUnit 2.5) TestCase特性有两个效果,包括标记一个方法使用参数并且在调用的时候提供内置数据.示例如下,本示例会使用不同数据集执行3次: [Test ...

  8. .netcore持续集成测试篇之开篇简介及Xunit基本使用

    系列目录 为了支持跨平台,微软为.net平台提供了.net core test sdk,这样第三方测试框架诸如Nunit,Xunit等只需要按照sdk提供的api规范进行开发便可以被dotnet cl ...

  9. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

随机推荐

  1. xss实现钓鱼操作

    自己写一个和原网站后台登录地址一模一样的钓鱼页面 JS加载一个iframe 100%覆盖原网页 提示登录超时重新登录 因为是iframe加载 url地址不变 钓鱼成功后 再跳转回/admin/inde ...

  2. 【node.js】回调函数

    学习链接:http://www.runoob.com/nodejs/nodejs-callback.html Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调 ...

  3. pass语句

    Python pass是空语句,是为了保持程序结构的完整性.  pass 不做任何事情,一般用做占位语句. #!/usr/bin/python # -*- coding: UTF-8 -*- # 输出 ...

  4. 浅谈Fluent Ribbon 中的SplitButton

    Fluent Ribbon Control Suite 就不做介绍了,网上的例子比较多,类似Office2007及以后版本的图形界面(菜单栏).官网地址:https://github.com/flue ...

  5. git用户限制ssh登录服务器

    服务器额外的防范措施: 搭建git服务器后通常会建立一个git账户,其它人共用这个账户来克隆或推送数据到git仓库中,通常也只需要这个功能,但是如果不加限制,那么其它人可以通过这个git账户登录到主机 ...

  6. Android 配置文件 AndroidManifest 解析

    1.屏幕分辨率 <supports-screens android:smallScreens="true" android:normalScreens="true& ...

  7. 删除 center os7 openjdk

    卸载CentOS7-x64自带的OpenJDK并安装Sun的JDK7的方法   第一步:查看并卸载CentOS自带的OpenJDK 安装好的CentOS会自带OpenJdk,用命令 java -ver ...

  8. iOS:通信录(完成)(18-01-18更)

    1.读取通信录 1).9.0以前:AddressBook 2).9.0以后:Contacts 2.调用通信录UI(不弄) 1).9.0以前:AddressBookUI 2).9.0以后:Contact ...

  9. 使用属性Props完成一张卡片

    一:我们先安装bootstrap,为了使我们的样式好看些 cnpm  install bootstrap  --save 二:我们在index.js中引入bootstap Import ‘bootst ...

  10. 一个百度MAP导航的基础封装

    项目中需要根据点击时候点击的内容,输入百度地图查找并展示规划等相关功能 于是封装了一个单独的百度map的html页面以供调用 功能包括了 ①展示底图 ②切换卫星图,切换卫星路线图,切换普通地图 ③通过 ...