Attributes

NUnit 1.0使用传统的基于继承和命名约定来识别测试。从2.0开始NUnit使用自定义特性来实现。

因为NUnit的test fixtures不是从框架类库继承,所以开发人员可以用其他方式轻松的使用继承。由于没有任何命名约定,故名称的选择可以是完全面向通信测试目标。

所有NUnit特性都包含在NUnit.Framework命名空间。每个包含测试的源文件都必须声明nunit.framework.dll程序集命名空间的引用。

从NUnit2.4.6开始,NUnit特性不再是密封的,任何继承这些特性的特性都能够被NUnit识别。

Action Attributes (NUnit 2.6)

NUnit设计Action特性用来更好的操作测试逻辑的组合性功能。在编写单元测试时我们希望在测试周期中运行特定的事件的逻辑需求(e.g. SetUp, TearDown, FixtureSetUp, FixtureTearDown, etc.)。NUnit通过使用适当的特性可以执行这些事件。Action特性允许用户创建自定义特性来封装用于 before or after测试用例的特别操作。

The Problem of Composability

假设我们在多个fixture中都包含测试用例,并且这些需要创建或者销毁相同的内存测试数据。我们可以创建一个fixture基类并且从它进行派生具体类。或者我们在fixture命名空间下创建一个SetUpFixture类。

This works fine, until we need some other reusable functionality, say the ability to configure or reset a ServiceLocator. (翻译不出来)

我们可以将这个功能放到fixture基类或者setup fixture中,但是我们要向基类混合两种不同的责任。在使用setup fixture时,在通用命名空间只有在所有类都请求两个特征才会有效。某些情况下我们可能不希望测试数据库,但是我们需要ServiceLocator配置,有时又正好相反,有时又同时需要,所以我们必须使得基类是可配置的。

如果我们发现需要像配置线程CurrentPrincipal一样使用任意方法来重用第三方功能可以快速解决问题。我们违反了单一原则并体会到了劣势。我们期望的是分离重用的测试逻辑,然后组合为我们需要的测试。

Resolving the Problem

Action特性可以让我们摆脱绑定,看下面的例子


我们使用了用户定义的特性来识别5个我们想要用不同的方式组合为不同的测试的不同操作:

  • ResetServiceLocator
  • CreateTestDatabase
  • AsAdministratorPrincipal
  • AsNamedPrincipal
  • AsGuestPrincipal

我们在其他test fixtures中通过声明合适的特性来重用。而不用从一个基类来继承。

Implementing an Action Attribute

Action特性需要程序猿来定义。通过ITestAction接口来实现,结果定义如下:

为了方便,你可以从NUnit'sTestActionAttribute派生出来,这个抽象类虚拟实现了接口的每个成员。另外,你也可以从 System.Attribute派生出来并直接实现接口。

Action Targets

当调用BeforeTest and  Targets属性返回的确定值 。ActionTargets美剧定义如下

当一个特性返回ActionTargets.Suite则意味着应用到一个类或者一个参数化的方法,NUnit会优先执行特性的BeforeTest方法,返回指向测试用例,然后在用例执行结束后执行AfterTest方法。这和TestFixtureSetUp andTestFixtureTearDown特性工作方式相似。

另一方面,在相同情况下使用返回ActionTargets.Test 的特性。NUnit在执行测试是会优先执行BeforeTest方法,然后执行测试用例,最后执行AfterTest方法,这个执行方式与SetUp and TearDown特性的工作方式类似。

返回ActionTargets.Default 的操作会附加到特定的代码中。当附加到一个方法时体现的就像已经指定了ActionTargets.Test 。当附加到一个类或者程序集是,体现为好像已经返回 ActionTargets.Suite值。

Test Details

BeforeTest and AfterTest方法为将要运行的或者已经运行的测试提供某些信息。TestDetails类提供了如下的私有属性, before or after方法可以使用这些属性来决定执行哪些操作:

  • Fixture - an object representing the user fixture, if available, or null
  • Method - the MethodInfo that implements the test, if available, or null
  • FullName - a string giving the full name of the test
  • Type - a string representing the type of the test, e.g. "Test Case"
  • IsSuite - true if the test is a suite, otherwise false

Examples

下面的示例使用相同的操作特性:

 

注意,上面的操作特性返回的是ActionTargets.Test and ActionTargets.Suite集合。可以这样,但可能不是正常情况。这样做了之后我们可以在多个实例中重用这个特性。这个特性的构造函数使用了一个参数:message,用于在控制台进行输出。Before and After方法都会通过WriteToConsole方法来进行输出。

Method Attached Actions

Example 1 (applied to simple test method):

Example 2 (applied action twice to test method):

Remarks

允许相同的特性应用多次。注意尽管这个以稳定的.NET版本,但是特性应用的顺序是不确定的。

Example 3 (applied to a test method with test cases):

Remarks

当一个方法应用了一个或者多个TestCase特性时,NUnit会将这个方法当作一个 test suite。你会注意到BeforeTest会在suite运行前执行一次,AfterTest会在运行后执行一次。另外,BeforeTest and AfterTest会在每个测试用例再执行一次。注意测试用例的执行顺序是不确定的。

Type Attached Actions

Example 1:

Remarks

在这个测试中,这个类是test suite,BeforeTest and AfterTes在这个类构造时执行一次,在每个用例再执行一次。

Example 2 (attached to interface):

Remarks

操作特性可以应用于接口。如果标记为TestFixture的类实现了这个接口,那么这个类会从接口继承这个操作特性,就像你在这个类本身应用了操作特性。

Example 3 (action attribute is applied to interface and attribute uses interface to provide data to tests):

Console Output:
  Hello, World!
Remarks

这里我们看到一个新的操作特性:InterfaceAwareAction。这个特性在BeforeTest方法中使用TestDetails的Fixture属性并强制转换为IHaveAnAction接口。如果这个fixture实现了IHaveAnAction接口,那么会将这个特性在构造函数时传入的string赋值给Message属性。因为这个特性应用于接口,任何实现了这个接口的类都会将构造函数输入的sring赋值为Message属性。在操作特性为测试用例提供数据、服务时非常有用。

注意这个特性从TestActionAttribute继承。它使用默认的AfterTest,并且重写了BeforeTest and Target。

Assembly Attached Action

Example 1:

Remarks

这个示例中的ConsoleAction特性是应用于整个程序集,NUnit会将整个程序集当作一个test suite (in fact, a suite of suites)。由于ConsoleAction特性实现了 ITestSuiteAction and ITestCaseAction两个接口,NUnit会程序集运行任何测试用例之前执行BeforeTest,运行所有测试用例之后执行AfterTest。另外,在构建保障清除状态、防止某个测试用例影响其他测试用例输出的操作特性时时非常有用的。例如,你可以使用操作特性来清除静态或者缓存的数据、者服务。

哎!翻译的很痛苦,自己都觉得不伦不类的,但是为了进步为了将来还是坚持下去。

Fighting!

[翻译]NUnit---Action Attributes(八)的更多相关文章

  1. 深度学习论文翻译解析(十八):MobileNetV2: Inverted Residuals and Linear Bottlenecks

    论文标题:MobileNetV2: Inverted Residuals and Linear Bottlenecks 论文作者:Mark Sandler Andrew Howard Menglong ...

  2. 行为识别(action recognition)相关资料

    转自:http://blog.csdn.net/kezunhai/article/details/50176209 ================华丽分割线=================这部分来 ...

  3. Struts2学习笔记三:深入Action

    一:Action中获取参数值 在Servlet中,我们通过doGet()/doPost()方法中的参数,获取request/response对象,然后提取参数值: 处理请求结束后,有数据需要携带返回客 ...

  4. NUnit使用

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

  5. 【计算机视觉】行为识别(action recognition)相关资料

    ================华丽分割线=================这部分来自知乎==================== 链接:http://www.zhihu.com/question/3 ...

  6. 【Core Swagger】.NET Core中使用swagger

    一.入门 https://www.nuget.org/packages/Swashbuckle.AspNetCore.SwaggerGen/ 1.添加核心NUGET包 Swashbuckle.AspN ...

  7. asp.net core 系列之Response caching(1)

    这篇文章简单的讲解了response caching: 讲解了cache-control,及对其中的头和值的作用,及设置来控制response caching; 简单的罗列了其他的缓存技术:In-me ...

  8. SSH网上商城一

    Java高级项目之SSH网上商城项目实战: 1.采用目前最主流的三大框架开发即Struts2+Spring+Hibernate框架整合开发.2.通过AJAX技术提供良好的用户体验.3.提供了邮箱激活的 ...

  9. 解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现

    前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将 ...

随机推荐

  1. [Python3网络爬虫开发实战] 1.2.2-Selenium的安装

    Selenium是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击.下拉等操作.对于一些JavaScript渲染的页面来说,这种抓取方式非常有效.下面我们来看看Selenium的安装 ...

  2. python+selenium之元素的八大定位方法

    以百度搜索框为例,先打开百度网页 1.点右上角爬虫按钮 2.点左下角箭头 3.讲箭头移动到百度搜索输入框上,输入框高亮状态 4.下方红色区域就是单位到输入框的属性: <input id=&quo ...

  3. Pycharm下GitHub配置使用

    1.下载并安装git 要连接GitHub,首先git是必不可少的,git的安装的基本使用很简单,这里略过.. 2.如图所示,进入Pycharm的Setting>>> Version ...

  4. 从PDF复制到word(换行问题)

    当我们从pdf文档中复制一部分内容到word的时候,pdf的自动换行会自动给文字添加换行,也就是一个回车,让文字另起一行,这样粘贴到word中的时候,word中也会有很多换行符,排版比较麻烦,需要一个 ...

  5. [luoguP1388] 算式(DP)

    传送门 看这个n<=15本以为是个状压DP 还是too young 这个题最神奇的地方是加括号是根据贪心的策略. 发现只有在一连串的加号两边加上括号才是最优的(想一想,为什么?) f[i][j] ...

  6. 2018/2/15 ES Beats的学习笔记

    Beats其实是几种服务的统称(你也可以把收集到的数据存储到别的数据源,不一定非要ES),这几种服务分别是: 1.PacketBeat 通过抓包的方式来监控一些服务.如:HTTP,DNS,Redis, ...

  7. 【HDOJ6118】度度熊的交易计划(费用流)

    题意: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个 ...

  8. PHP_pear的安装和使用

    --------------            安装pear -------------- pear是PHP的扩展和应用程序库,包含了很多有用的类,安装好php5.0后,pear实际上并没有被安装 ...

  9. Codeforces 631D Messenger【KMP】

    题意: 给定由字符串块(字符及连续出现的个数)组成的字符串t,s,求t串中有多少个s. 分析: KMP 这题唯一需要思考的地方就是如何处理字符串块.第一想到是把他们都展开然后进行KMP,可是展开后实在 ...

  10. 常用的delphi 第三方控件

    Devexpress VCL 这个基本上覆盖了系统界面及数据库展示的方方面面,是做桌面系统必备的一套控件,目前的版本是2011.2.3, 支持win32 及win64. AutoUpgrader 这个 ...