Nunit单元测试基础知识

简介:

推行单元测试的目的:

1、 减少BUG提高项目的质量

2、 养成良好的编码习惯,提高开发人员编码水平

 

要测什么What?

最小的可测试软件元素(单元)包括单元的内部结构(如逻辑和数据流)以及单元的功能和可观测的行为.

 

由于开发方式的不同,单元测试一般划分方法如下:

 

1. 面向对象的软件开发:以Class()作为测试的最小单元。以方法的内部结构作为测试的重点。

 

2. 结构化的软件开发:以模块(函数、过程)作为测试的最小单元。

 

 

如何测试How?

白盒测试方法:测试单元的内部结构, Nunit  Nmock

黑盒测试方法:测试单元的功能和可观测的行为 《通用测试用例》

 

步骤:

一、如何设计单元测试

 

需要弄清楚被测试代码实现的功能和相应的逻辑关系;

 If…else…

 Switch..case…

 While...

 

同时还要考虑到测试的输入内容,以及返回的结果;

用例的设计要保证面面俱到,是否覆盖了每一条路径。
  

而如何做到面面俱到这就需要恶我们对每个函数进行详细的分析,将分析和讨论的结果归入相关的测试库中。初期工作的进度慢并不要紧,只要能做得很详细对于以后的测试还是有很大的帮助。或许以后的测试中,只要直接调用原来写过的测试类库,修改部分简单的语句就可以实现新模块的单元测试了

[TestFixture]表示:类包含了测试代码(这个特性可以被继承)。这个类必须是公有的,这个类还必须有一个默认构造函数

[Test]表示它是一个测试方法。测试方法的返回值必须为void并且不能带有参数

 [SetUp]属性:用来标识方法,在开始所有测试之前执行,用来在测试前初始化一些资源,比如初始化类。

[TearDown]属性:用来标识方法,在所有测试完成之后执行,用来释放一些资源。

[Ignore]属性:用来标识方法,指示这个方法由于某些原因暂时不需要测试(比如没有完成相关代码)

 

 

二、Nunit工具的使用

 

    参考 :Nunit框架在VS2005环境下单步调试  

 

三、Nunit常用类和方法

Assert(断言)

如果断言失败,方法将没有返回,并且报告一个错误。

如果一个方法中包括了多个断言,在失败的断言之后的所有断言将不会被执行。基于这个原因,最好是为每个测试的断言使用try语句。

 

1、法测试二个参数是否相等

Assert.AreEqual( int expected, int actual );

Assert.AreEqual( decimal expected, decimal actual );

。。。。

 

2、测试二个参数是否引用同一个对象

Assert.AreSame( object expected, object actual );

Assert.AreNotSame( object expected, object actual );

 

3、测试一个对象是否被一个数组或列表所包含

Assert.Contains( object anObject, IList collection );

 

   比较断言:

4、测试一个对象是否大于另一个对象

Assert.Greater( int arg1, int arg2 );

 

5、法测试一个对象是否小于另一个对象

Assert.Less( int arg1, int arg2 );

 

类型断言:

Assert.IsInstanceOfType( Type expected, object actual );

 

条件测试:

Assert.IsTrue( bool condition );

Assert.IsFalse( bool condition);

Assert.IsNull( object anObject );

Assert.IsNotNull( object anObject );

Assert.IsNaN( double aDouble );

Assert.IsEmpty( string aString );

Assert.IsNotEmpty( string aString );

Assert.IsEmpty( ICollection collection );

Assert.IsNotEmpty( ICollection collection );

 

字符串断言(StringAssert)提供了许多检验字符串值的有用的方法

StringAssert.Contains( string expected, string actual );

StringAssert.StartsWith( string expected, string actual );

StringAssert.EndsWith( string expected, string actual );

StringAssert.AreEqualIgnoringCase( string expected, string actual );

 

四、属性(Attribute):

TestFixtureAttribute (NUnit 2.0)

此特性标记一个类包含有测试方法,以及可选的安装(setup)和卸载(teardown)方法。

􀁺 必须是一个公开类型,否则NUnit将无法查找到它;

􀁺 必须带有一个默认构造函数,否则NUnit将不能构造它;

􀁺 构造函数不能带有任何副作用,因为NUnit在一个会话的过程中也许会多次构造类。

 

 

TestAttribute (NUnit 2.0)

Test特性标记一个在标记为TestFixture的类中指定的方法为测试方法

 

SetUpAttribute (NUnit 2.0)

这个特性在一个TestFixture中提供一个通用的功能集,这个功能集在每个测试方法调用前执行。一个TestFixture 只能有一个SetUp方法。如果定义了多个SetUp方法,TestFixture可以成功编译,但是它的测试将不会运行。

 

TearDownAttribute (NUnit 2.0)

这个特性在一个TestFixture中提供一个通用的功能集,这个功能集在每个测试方法运行后执行。一个TestFixture只能有一个TearDown方法。如果定义了多个TearDown方法,TestFixture可以成功编译,但是它的测试将不会运行。

 

ExpectedExceptionAttribute (NUnit 2.0 / 2.2.4)

这是一种指定一个测试的运行将抛出一个异常。特性有二个构造函数,第一个构造函数(NUnit 2.0)接收一个表示精确的期望的异常的Type。第二个构造函数(NUnit 2.2.4)接受期望的异常的类型全名字符串。二种情况下,运行程序(runner)将运行测试,只有抛出指定异常的测试才能通过。如果测试抛出了不同的异常,测试将失败,这对于继承自期望异常的异常一样适用。

[TestFixture]

public class SuccessTests

{

[Test]

[ExpectedException(typeof(InvalidOperationException))]

public void ExpectAnExceptionByType()

{ /* ... */ }

[Test]

[ExpectedException("System.InvalidOperationException")]

public void ExpectAnExceptionByName()

{ /* ... */ }

}

 

/*以下方法不会讲解BEGIN*/

PlatformAttribute (NUnit 2.2.2)

Platform特性用于指定一个测试或套件(fixture)运行的平台,平台用大小写不敏感的字符串值指定,并且分别用Include和 Exclude来将测试包含在运行中或排除在外。平台被包含还可以做为一个参数指定给PlatformAttribute的构造函数,无论哪种情况,都可以指定多个以逗号分隔的值。

[TestFixture]

[Platform("NET-2.0")]

public class DotNetTwoTests

{

// ...

}

ExplicitAttribute (NUnit 2.2)

除非明确的选择运行,Explicite特性将导致一个测试或测试组件(fixture)被忽略。如果testfixtureGUI中被选择、在控制台运行程序的命令行中被指定或者被Category过滤器所包括,它将运行。

如果在运行测试期间遇到一个带有Explicit特性的测试或测试组件(fixtrue),运行程序将认为它已被忽略。这时,进度条将变成黄色,同时测试被列出在未运行的测试的报告中。

[TestFixture, Explicit]

public class ExplicitTests

{

// ...

}

SuiteAttribute (NUnit 2.0)

Suite特性用于定义基于用户优先级的套件子集。由这个版本的开发者所相信的是,这方面的需要将减少,因为framework提供了动态创建的机制。无论如何,它提供了向后兼容性。

public class AllTests

{

[Suite]

public static TestSuite Suite

{

get

{

TestSuite suite = new TestSuite("All Tests");

suite.Add(new OneTestCase());

suite.Add(new Assemblies.AssemblyTests());

suite.Add(new AssertionTest());

return suite;

}

}

}

CategoryAttribute (NUnit 2.2)

Category特性提供了套件(suites)分组测试的可选方法,任何一个单独的测试用例或组件(fixture)都可以指定属于一个特定的类别。GUI或例行运行程序都允许指定一个包含在运行内或排除在运行外的分类列表。当分类被指定时,只在被选择的分类中的测试会运行。那些在分类中,而没有被选择的测试,将根本不会被报告。这个特征可以在命令行中使用/include/exclude参数来访问,或者在GUI中通过一个分离的"Categories"标签来访问。在任何时候,GUI都提供一个可见的指出哪些分类被选择的指示。

[TestFixture]

[Category("LongRunning")]

public class LongRunningTests

{

// ...

}

 



              本文转自灵动生活博客园博客,原文链接:http://www.cnblogs.com/ywqu/archive/2009/11/06/1597669.html,如需转载请自行联系原作者


相关文章
|
21天前
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
130 64
|
26天前
|
测试技术 API 开发者
精通.NET单元测试:MSTest、xUnit、NUnit全面解析
【10月更文挑战第15天】本文介绍了.NET生态系统中最流行的三种单元测试框架:MSTest、xUnit和NUnit。通过示例代码展示了每种框架的基本用法和特点,帮助开发者根据项目需求和个人偏好选择合适的测试工具。
35 3
|
3月前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
275 8
|
3月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
162 0
|
JSON 前端开发 Java
Java基础知识第九讲:单元测试、前后端规约与联调
Java基础知识第九讲:单元测试、前后端规约与联调
177 0
|
Java 测试技术 Maven
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(1)
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(1)
316 0
|
Java 测试技术
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(2)
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(2)
255 0
|
Java 测试技术
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(3)
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(3)
211 0
|
Java 测试技术
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(4)
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(4)
873 0
|
Java 测试技术
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(5)
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(5)
168 0