NUnit单元测试工具简介

本博客( http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
                                        
                                        

NUnit单元测试工具简介

                                        
                                        

1. 测试驱动简介(TDD)简介

                                        
                                        
1.1文档驱动开发
                                        
                                        
    1.传统的开发过程要求有设计文档
       只有源代码:不能算软件,不可理解,不可维护
       源代码+文档:才算程序员完整地交付了自己的工作
                                        
       概要设计:描述一个模块做什么事
       详细设计:描述一个模块如何做这些事
                                            
    2.这种文档的缺陷
       自然语言的描述容易产生歧义
       不能自动化地验证
       不能保证文档与程序同步
                                        
       要做任何一件事之前,你必须首先清楚地知道自己要做什么以及不做什么,否则那就是crack,不是在从
事职业的软件开发。
                                        
                                        
1.2测试驱动开发
                                        
                                        
      测试驱动开发正是为了解决上述缺陷而产生的
      TDD是一种开发过程,这里的测试是一个设计问题,而不是QA(Quality Assurance质量保证)问题
      TDD是一种设计方法,清晰地描述你的设计,并保证设计与实现一致
      TDD:Test Driven Development,测试驱动开发
                                        
                                        
      中文参考: http://dingsea.cnblogs.com/archive/2006/05/08/393944.html
      英文参考: http://www.agiledata.org/essays/tdd.html
                                        
                                        
1.3 单元测试
                                        
                                        
       概念:用于检验被测代码的一个很小的,很明确的功能是否正确
       用于判断某个特定条件或场景下某个特定函数或方法的行为
       对象:模块
       目标:高内聚、低耦合
       目的:验证模块的行为与开发者期望的一致
       依据:详细设计说明书
       方法:白盒法
       任务:模块接口
                   局部数据结构
                   边界
                   独立执行通路
                   错误处理
                                        
                                        
1.4典型问题
                                        
                                        
       单元测试的方法是否是白盒的?是
       原因:是描述如何实现这个模块,而不是验证它的输入输出正确性
                                        
                                        
       单元测试要不要把每个模块放到真实的事务或者并发环境下测试?不要
       原因:只是描述当前模块的实现,真实环境下的正确性由集成测试和QA来保证
                                        
                                        
       为什么模块内部实现的变化要同时导致测试变化?
       因为思路、设计变化了,应该有一个文档描述这件事情
                                        
                                        

2. Nunit简介

                                        
                                        
       Nunit是一个单元测试框架,供.net开发人员做单元测试之用
       专门针对于.NET,适合于所有.NET语言(NUnit is a unit-testing framework for all .Net languages.)
       xUnit家族的一员,从JUnit而来,完全有C#编写,且编写时充分利用了许多.NET的特性,比如反射,客户属性等等
       free and open software
       目前版本:Release 2.4.7,Alpha 2.5
                                        
       参考:
       http://www.nunit.org
       http://sourceforge.net/projects/nunit
       JUnit(Java)、CPPUnit(C++)、PHPUnit(PHP)、VBUnit(VB)
                                        
                                        
2.1 Nunit运行画面
                                        
                                        
NUnit单元测试工具简介_第1张图片
                                        
                                        
2.2 Nunit布局
                                        
                                        
       左面:我们写的每一个单元测试
       右边:测试进度条
       测试执行状态:进度条的颜色来反映
       绿色:所有测试案例运行成功
       黄色:某些测试被忽略,但没有失败
       红色:有测试案例没有成功执行
                                         
       文本窗口标签:
              Errors and Failures:显示失败的测试
              Tests Not Run:显示没有得到执行的测试
              Console.Error:显示运行测试产生的错误消息。这些此消息是应用程序代码使用Console.Error输出流输出的
              Console.Out:显示运行测试打印到Console.Error输出流的文本消息
                                  
       底部状态条:表示当前运行的测试的状态
              Ready:准备就绪
              Running:测试执行中(Running: test-name)
              Completed:所有测试完成时
              Test Cases:说明加载的程序集中测试案例的总个数,即测试树里叶子节点的个数
              Tests Run:已经完成的测试个数
              Failures:到目前为止,所有测试中失败的个数
              Time:测试运行时间(以秒计)
                                         
                                         
2.3 常用属性
                                                
                                         
       TestFixture属性:标记该类包含要测试的方法,即为测试类,对该测试类的限制:
              访问方式必须是Public,否则NUnit看不到它的存在
              必须有一个缺省的构造函数,否则是NUnit不会构造它
              构造函数应该没有任何副作用,因为NUnit在运行时经常会构造这个类多次
                                                
       Test属性:标记某个类(该类已经被标记为TestFixture)的某个方法是可以测试的,对该测试方法的限制:
              访问方式必须是Public
              不能有参数
              不能有返回值
                                         
                                         
2.4 使用Nunit框架
                                         
                                         
       使用要求
              使用NUint.Framework命名空间
              每个包含测试的类都必须带TestFixture属性标记,且这个类必须是public
              测试类中的每个测试方法必须带Test属性标记,且该方法必须是public
              每个测试的运行相互独立
              可在任何时候以任意顺序运行每个测试
                                         
                                         
       使用框架
                                         
using  System;
using  NUnit.Framework;
namespace  MyNunitTest.Tests
{
[TestFixture]
public class TestClass
{
[Test]
public void TestMethod()
{
 …
}

}

}
                                         
                                         
2.4 Nunit比较——Assert类的静态方法
                                         
                                         
        使用Assert(断言)进行比较,是一个类,包括的静态方法有:
        1. Assert.AreEqual(object expected, object actual[,string message])
                verifies that two objects are equal
                if they are not equal, an NUnit.Framwork.AssertionException is thrown
                参数说明:
                        expected:期望值(通常是硬编码的)
                        actual:被测试代码实际产生的值、
                        message:一个可选消息,将会在发生错误时报告这个消息
                                               
                比较浮点数(float或double)时,要指定一个额外的误差参数
                                                
        2. Assert.AreEqual(object expected, object actual, float tolerance[, string message])
                参数说明:
                        tolerance:指定的误差,即精确到小数点后X位
                        例如:精确到小数点后4位,Assert.AreEqual(0.6667, 2.0/3, 0.0001);
                                               
        3. Assert.AreNotEqual(object expected, object actual)
                asserts that two objects are not equal
        4. Assert.AreSame(object expected, object actual[, string message])
                asserts that two objects refer to the same object
                验证expected和actual两个参数是否引用一个相同的对象
        5. Assert.AreNotSame(object expected, object actual[, string message])
                asserts that two objects do refer to the same object
        6. Assert.IsNull(object[, string message])
        7. Assert.IsNotNull(object[, string message])
        8. Assert.IsTrue(bool condition [, string message])
        9. Assert.IsFalse(bool condition [, string message])
        10. Assert.Fail([string message])
                使测试立即失败
                该断言被用于标记某个不应被到达的分支,实际不常用
                                               
        其中很多方法的重载方法有很多种

你可能感兴趣的:(.net研究)