NUNIT1. NUNIT简介 NUnit是一个为Net准备的自动化单元测试框架,它的作用就是帮助你方便的完成单元测试工作,同鼎鼎有名的JUnit一样,都是xUnit家族的成员。它的下载地址是:http://www.。 NUnit Framework(NUnit 单元测试框架)简介
TestFixture Attribute简介 使用TextFixture Attribute的class需要符合另一项唯一附加的限制,就是需要有一个public的default constructor(或者是没有定义任何的constructor,这其实是相同的意思)。
TestFixtureSetUp 和TestFixtureTearDown简介 底下这段程序代码示范了如何使用TestFixtureSetUp/TestFixtureTearDown ````[TestFixtureTearDown] ``` [SetUp] [Test] Test Attribute简介 SetUp 和 Teardown Attributes简介 ExpectedException Attributes简介 如果上面的程序被执行的时候,如果一旦exception发生,而且这个exception的type(类型信息)是 InvalidOperationException 的话,这个test就会顺利通过验证。如果你预期你的程序代码会产生多个exception的话,你也可以一次使用多个 ExpectedException attribute。但是,一个test method应该只测试一件事情,一次测试多个功能是不好的做法,你应该尽量避免之。另外,这个attributes并不会检查inheirtance的 关系,也就是说,如果你的程序代码产生的exception是继承自InvalidOperationException 的subclass(子类化)的话,这个test执行的时候将不会通过验证。简而言之,当你使用这个attribute的时候,你要明确的指明所预期的 exception是哪个type(类型信息)的。 Ignore Attributes简介 namespace UnitTestingExamples NUnit Assert Class简介 好,现在我们已经讨论过写Unit Tests的基本步骤及方法,现在让我们来看看如何执行你所写的Unit Tests。事实上非常简单。NUnit里面有两个已经写好的Test Runner applications:一个是窗口GUI程序,一个是console XML(命令列)程序。你可以自由选择你所喜欢的方式,基本上是没有什么差别的。 2. 基本用法 a. 目前项目中的用法 例1: 初始化 [SetUp] public void InitializeOperands() { pub=new PUB(); } 可以对需要初始化才能使用的类,进行初始化。例如,与数据库相关的操作。 例2: 简单测试 [Test] public void ReqToRes_Test() { string reqfile="REQ-CKI-CIQU-123456789-20060317.csv"; string resfile=null; bool returnVal=pub.ReQToRes(reqfile,ref resfile); Assert.IsFalse(returnVal); } 例3: 对抛出的异常做测试 [Test] [ExpectedException(typeof(Exception))] public void Check_bgdh_test() { string b="125698300"; ciq.Check_bgdh(b); } b. 未使用的用法 [TestFixtureSetUp] [TestFixtureTearDown] 当整个测试框架都需要引用某个类是,可以在 [TestFixtureSetUp]中将它初始化,然后在[TestFixtureTearDown]中将它释放。 c. 不建议使用: [Ignore("We‘re skipping this one for now.")],因为这样可能会忽略这个被测函数。 3. 解决方案 a.新生成一个解决方案 b.添加测试项目 c.设置属性 d.在NUNIT-GUI环境下调试 通过【运行】按钮,在NUNIT-GUI下调试 e.注意:这种方法在调试过程中如果发生错误,必须在原来的项目中修改,然后再将源文件复制到NUNIT项目中再进行测试。否则的话,容易发生混淆。 4. 其它的解决方案 a. 在原有的解决方案上新增加一个项目 b. 添加一个测试类 c. 导入所需要的引用 包括测试类:NUNIT.FRAMEWORD和需要被测试的项目 d. 添加引用: e. 接下来就可以测试了。 f.这种测试方法比较适用于测试人员。 5. 测试用例 a. 条件判断 例1:对参数为NULL值进行测试 [Test] public void CheckFileName_Test_null() { string reqfile=null; string asktype=null; bool returnVal=pub.CheckFileName(ref reqfile,ref asktype); Console.WriteLine(asktype); Assert.IsFalse(returnVal); } 例2:对参数为空字符串进行测试 [Test] public void CheckFileName_Test_empty() { string reqfile=""; string asktype="DCL"; bool returnVal=pub.CheckFileName(ref reqfile,ref asktype); Console.WriteLine(asktype); Assert.IsFalse(returnVal); } 例3:对不合法的参数进行测试(报关单号不足9位) [Test] public void CheckFileName_Test1() { string reqfile="REQ-CKI-DCL-12345679-20060317.csv"; string asktype= "DCL"; bool returnVal=pub.CheckFileName(ref reqfile,ref asktype); Console.WriteLine(asktype); Assert.IsFalse(returnVal); // Assert.IsTrue(returnVal); } 例4:对不合法的参数进行测试2(日期长度不符合) [Test] public void CheckFileName_Test2() { string reqfile="REQ-CKI-DCL-123456789-2006031.csv"; string asktype= "DCL"; bool returnVal=pub.CheckFileName(ref reqfile,ref asktype); Console.WriteLine(asktype); Assert.IsFalse(returnVal); } b. 数据库操作 [Test] public void getConnectionSQl_test() { bool returnVal=pub.GetConnectionSQL(); Assert.IsTrue(returnVal); } 对数据库操作的测试,需要对数据库中数据进行修改,才可以对不同的数据进行测试。 6.对今后的项目提出的一些建议和改善: a. 需求分析 首先,将项目需求进行分析,从中搞清楚输入和输出,流程图,错误信息等。最好将它文档化。 例:FTP处理主要分为几个功能 1. 显示FTP目录下需要处理的文件名:public string[] getFileList(string mask) 2. 将选中的文件下载到本地:public void download(string remFileName,string path) 输入:需要下载的文件名:string remFileName,路径:string path 输出:在本地生成一个同名的文件 3. 将生成的回执文件上传:public void upload(string fileName) 将上传的回执文件改名:public void renameRemoteFile(string oldFileName,string newFileName) 4. 将请求文件在FTP上删除:public void deleteRemoteFile(string fileName) b. 函数细化 例:将选中的文件下载到本地:public void download(string remFileName,string path) 其中对下载作了3个重载函数,以适应于不同的需要。 a. public void download(string remFileName,string path) :下载到本地路径 b. public void download(string remFileName,string path,string locFileName) :下载到本地路径,支持改名 c. public void download(string remFileName,//远程文件名 string locFileName,//本地文件名 Boolean resume)//是否续传 :下载到本地路径,支持改名,支持续传 其中前两个函数是对第三个函数的变种,都是调用第三个函数,只是限制了某些功能。这样可以增加函数的灵活性。 其中DOWNLOAD函数使用了如下几个独立的子函数来完成的 1. LOGIN if(!logined) { login(); } 2. 生成SOCKET连接 Socket cSocket = createDataSocket(); 3. 发送下载命令 sendCommand("RETR " + remFileName); 4. 接受数据 while(true) //开始下载 { bytes = cSocket.Receive(buffer, buffer.Length, 0); output.Write(buffer,0,bytes); if(bytes <= 0) { break; } }//while 5. 判断是否下载完成 if (!isDownComplete()) { throw new Exception(replay); } c. 异常处理 1. 自定义异常 a. 实现自己的异常类 MyImportantException 2. 异常的分类处理:引用上面一个例子,FTP下载是一个公用的函数,而通过对它的细分,可以将它分为几个较小的独立的私有函数。所以自定义异常就可以在这里发挥作用,每个独立的私有函数都可以抛出各自定义的异常,而在FTP下载这个公有函数中将捕获被抛出的异常,并对它们进行处理或者抛给它的上一级函数。 d. 通过对函数的细化,分解出一个个独立的、只完成特定功能的函数。并且通过结构化的异常处理可以使测试简单化。 7. 总结 a.如果将UNIT作为测试用途的化,它可以起到自动化的作用,减轻测试人员的工作量。如果发生功能改变或BUG修正,需要修改源代码时,利用自动化测试可以大量减轻测试人员工作量。 建议:提供功能函数的接口给测试人员,这样在不改变函数名的情况下,仅修改函数内部的逻辑。而测试人员仅需要增加或修改测试用例,就可以保持新版本的测试。 b.如果将UNIT作为测试驱动的话,就使得程序员对测试给予足够的重视,从而可以编写较高质量的程序。 |
|
来自: barbarossia > 《.NET》