C#中test测试地

方法一、

1、从NUnit官网(http://www.nunit.org/index.php)下载最新版本NUnit,当前版本为NUnit2.5.8。

2、安装后,在VS2008中新建测试项目StartNUnit

3、右击项目选择属性,在打开的窗口中选择调试。如图:

4、选择启动外部程序,并定位到NUnit的启动程序nunit.exe。如图:

5、在项目中添加NUnit引用,如图:

6、在测试类中引用命名空间NUnit.Framework后就可以开始测试了。如下代码():

  1. using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using NUnit.Framework;
  2.  
  3. namespace StartNUnit
    {
    [TestFixture]
    public class TheFirstTest
    {
    [Test]
    public void TestMethod()
    {
    …………
    }
    }
    }

址:http://msdn.microsoft.com/zh-cn/library/ms379625(VS.80).aspx

  1. 单元测试中 我也碰到a类中调用b类的方法,我想测试a 然后mock b被调用的方法
  1. public class A
  2. {
  3. public int MethodA(int i,IB b)
  4. {
  5. return b.MethodB(i) - i;
  6. }
  7.  
  8. public int MethodB(int i)
  9. {
  10. return new B().MethodB(i) - ;
  11. }
  12. }
  13.  
  14. public interface IB
  15. {
  16. int MethodB(int i);
  17. }
  18.  
  19. public class B :IB
  20. {
  21. public int MethodB(int i)
  22. {
  23. throw new Exception();
  24. }
  25. }
  26.  
  27. 测试A类中的MethodA方法
  28. [TestMethod()]
  29.  
  30. public void MethodATest()
  31. {
  32. A target = new A(); // TODO: 初始化为适当的值
  33. int i = ; // TODO: 初始化为适当的值
  34. var mock = new Mock<IB>();
  35. mock.Setup(p => p.MethodB())
  36. .Returns();
  37. IB b = mock.Object; // TODO: 初始化为适当的值
  38. int expected = ; // TODO: 初始化为适当的值
  39. int actual;
  40. actual = target.MethodA(i, b);
  41. Assert.AreEqual(expected, actual);
  42. }

在.net中有几种mock框架可供选择,比如NMock,PhinoMocks,FakeItEasy和Moq。尽管Moq相对较新,但是它非常易用。不需要像传统的Record/Replay。并且使用Moq在VS中可以得到智能提示。学习成本也不高。

这篇文章我们介绍下如何使用Moq来mock吧。

假定我们要做一个计算器提供基本的算术运算和不同货币的转换

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace CalculatorPkg
  7. {
  8. public interface ICalculator
  9. {
  10. int Add(int param1, int param2);
  11. int Subtract(int param1, int param2);
  12. int Multipy(int param1, int param2);
  13. int Divide(int param1, int param2);
  14. int ConvertUSDtoRMB(int unit);
  15. }
  16. }
  17.  
  18. 假定人民币转美元的接口定义如下:
  19.  
  20. using System;
  21. using System.Collections.Generic;
  22. using System.Linq;
  23. using System.Text;
  24.  
  25. namespace MoneyExchangeRatePkg
  26. {
  27. public interface IUSD_RMB_ExchangeRateFeed
  28. {
  29. int GetActualUSDValue();
  30. }
  31. }
  32.  
  33. using System;
  34. using System.Collections.Generic;
  35. using System.Linq;
  36. using System.Text;
  37.  
  38. namespace MoneyExchangeRatePkg
  39. {
  40. public interface IUSD_RMB_ExchangeRateFeed
  41. {
  42. int GetActualUSDValue();
  43. }
  44. }
  45.  
  46. 下面是Calculator的实现类,其中人民币转美元的接口实例以构造函数参数的形式传给Calculator类。
  47.  
  48. using System;
  49. using System.Collections.Generic;
  50. using System.Linq;
  51. using System.Text;
  52. using MoneyExchangeRatePkg;
  53.  
  54. namespace CalculatorPkg
  55. {
  56. public class Calculator : ICalculator
  57. {
  58. private IUSD_RMB_ExchangeRateFeed _feed;
  59. public Calculator(IUSD_RMB_ExchangeRateFeed feed)
  60. {
  61. this._feed = feed;
  62. }
  63. #region ICalculator Members
  64. public int Add(int param1, int param2)
  65. {
  66. throw new NotImplementedException();
  67. }
  68. public int Subtract(int param1, int param2)
  69. {
  70. throw new NotImplementedException();
  71. }
  72. public int Multipy(int param1, int param2)
  73. {
  74. throw new NotImplementedException();
  75. }
  76. public int Divide(int param1, int param2)
  77. {
  78. return param1 / param2;
  79. }
  80. public int ConvertUSDtoRMB(int unit)
  81. {
  82. return unit * this._feed.GetActualUSDValue();
  83. }
  84. #endregion
  85. }
  86. }
  87.  
  88. 下面我们开始准备Calculator组件的测试环境,我们使用NUnit框架和Moq来做Mock
  89.  
  90. 您可以到http://www.nunit.org/获得nunit,到http://code.google.com/p/moq/获得moq框架的源码和dll文件。
  91.  
  92. 然后我们就可以创建测试项目,并添加nunitmoq的引用。
  93.  
  94. 我们要mock汇率的接口,下面是mock的方法:
  95.  
  96. Mock<IUSD_RMB_ExchangeRateFeed> mockObject = new Mock<IUSD_RMB_ExchangeRateFeed>();
  97. mockObject.Setup(m => m.GetActualUSDValue()).Returns();
  98. IUSD_RMB_ExchangeRateFeed value = mockObject.Object;
  99.  
  100. 对汇率接口的MOCK只需要三行代码,第一行声明mock接口,第二行设定要mock方法的返回值,第三步通过Object属性获得mock的对象。
  101.  
  102. 下面是完整的测试代码:
  103.  
  104. using System;
  105. using System.Collections.Generic;
  106. using System.Linq;
  107. using System.Text;
  108. using NUnit.Framework;
  109. using Moq;
  110. using CalculatorPkg;
  111. using MoneyExchangeRatePkg;
  112.  
  113. namespace CalculatorPkg.Tests
  114. {
  115. // 添加TestFixture标识类是测试类
  116. [TestFixture]
  117. public class CalculatorTester
  118. {
  119. // 定义mock的逻辑
  120. private IUSD_RMB_ExchangeRateFeed prvGetMockExchangeRateFeed()
  121. {
  122. Mock<IUSD_RMB_ExchangeRateFeed> mockObject = new Mock<IUSD_RMB_ExchangeRateFeed>();
  123. mockObject.Setup(m => m.GetActualUSDValue()).Returns();
  124. return mockObject.Object;
  125. }
  126. // 测试divide方法
  127. [Test(Description="Divide 9 by 3. Expected result is 3.")]
  128. public void TC1_Divide9By3()
  129. {
  130. IUSD_RMB_ExchangeRateFeed feed = this.prvGetMockExchangeRateFeed();
  131. ICalculator calculator = new Calculator(feed);
  132. int actualResult = calculator.Divide(,);
  133. int expectedResult = ;
  134. Assert.AreEqual(expectedResult, actualResult);
  135. }
  136. [Test(Description = "Divide any number by zero. Should throw an System.DivideByZeroException exception.")]
  137. [ExpectedException(typeof(System.DivideByZeroException))]
  138. public void TC2_DivideByZero()
  139. {
  140. IUSD_RMB_ExchangeRateFeed feed = this.prvGetMockExchangeRateFeed();
  141. ICalculator calculator = new Calculator(feed);
  142. int actualResult = calculator.Divide(, );
  143. }
  144. [Test(Description = "Convert 1 USD to RMB. Expected result is 500.")]
  145. public void TC3_ConvertUSDtoRMBTest()
  146. {
  147. IUSD_RMB_ExchangeRateFeed feed = this.prvGetMockExchangeRateFeed();
  148. ICalculator calculator = new Calculator(feed);
  149. int actualResult = calculator.ConvertUSDtoRMB();
  150. int expectedResult = ;
  151. Assert.AreEqual(expectedResult, actualResult);
  152. }
  153. }
  154. }
  1. 我们在做单元测试的时候,常常困扰于数据的持久化疑问 ,很多情况下我们不希望单元测试影响到数据库中的内容,而且受数据库的影响有时我们的单元测试的速度会很慢,所以我们往往希望将持久化部分隔离开,做单元测试的时候不真实 的将数据持久化。这种隔离我们一般运用 抽象的方式,也就是运用 接口或抽象类将持久化层隔离开,然后运用 mock来模拟相应的接口或抽象类来完成相应的持久化类。MoQ就是这种Mock框架之一,MoQ运用 C#3.0,跟 NMock相比MoQ运用 起来更基本 ,而且是强类型的方式的,源码和dll可以到http://code.Google.com/p/moq/下载。现在MoQ最新的揭晓 版本是3.1版,4.0还处在beta版中,所以我们这里运用 的是3.1版。
  2.   下面我们就来介绍一下MoQ的具体用法:
  3.   一、基础知识
  4.   在运用 MoQ之前我们必须要先在测试程序中引入Moq.dll,运用 MoQ的主要命名空间是Moq,其中最重的类就是Mock<T>,我们可以用这个类来模拟接口。
  5.   、要领
  6.     public interface ITest
  7.     {
  8.         string Test();
  9.     }
  10.   测试代码:
  11.   基本 测试代码
  12.       [TestMethod()]
  13.       public void TestTest()
  14.       {
  15.          var test = new Mock<ITest>();
  16.          test.Setup(p => p.Test()).Returns("lfm");
  17.          Assert.AreEqual("lfm", test.Object.Test());
  18.       }
  19.   、匹配参数
  20.   public interface IMatchTest
  21.     {
  22.         string Test(int test);
  23.     }
  24.  
  25.   匹配测试
  26. var testMatch = new Mock<IMatchTest>();
  27.             testMatch.Setup(p => p.Test(It.Is<int>(i => i %  == ))).Returns("偶数");
  28.             testMatch.Setup(p => p.Test(It.Is<int>(i => i %  != ))).Returns("奇数");
  29.             Assert.AreEqual("偶数", testMatch.Object.Test());
  30.             Assert.AreEqual("奇数", testMatch.Object.Test());
  31.   上边测试代码模拟实现IMathTest接口实例,其中如果Test要领 的参数是偶数,其返回值为“偶数”。这里的IT用来过滤参数的类,其具体解释可以参见MoQ的文档
  32.   、属性
  33.   public interface IPropertiesTest
  34.     {
  35.          int Test { get; set; }
  36.     }
  37.  
  38.             var testProperties = new Mock<IPropertiesTest>();
  39.             testProperties.Setup(p => p.Test).Returns();
  40.             Assert.AreEqual(, testProperties.Object.Test);
  41. 或者
  42. var testProperties = new Mock<IPropertiesTest>();
  43.             testProperties.SetupProperty(p => p.Test,);
  44.             Assert.AreEqual(, testProperties.Object.Test);
  45.   Callback
  46.   当执行某要领 时调用其内部输入的Action委托
  47.  
  48. int count = ;
  49.             var testProperties = new Mock<IPropertiesTest>();
  50.             testProperties.Setup(p => p.Test).Returns().Callback(()=>count++);
  51.             Assert.AreEqual(, testProperties.Object.Test);
  52.             Assert.AreEqual(, count);
  53.   在调用Test要领 是执行了count++
  54.   Verification
  55.   判断某要领 或属性能不能 执行过
  56.   如果代码如下:
  57.   var testProperties = new Mock<IPropertiesTest>();
  58.              testProperties.Setup(p => p.Test).Returns();
  59.              testProperties.Verify(p => p.Test);
  60.              Assert.AreEqual(, testProperties.Object.Test);
  61.   会抛出异常,因为第3行执行时Test要领 还没有被调用过,改为如下代码可以通过测试
  62.       var testProperties = new Mock<IPropertiesTest>();
  63.             testProperties.Setup(p => p.Test).Returns();
  64.             Assert.AreEqual(, testProperties.Object.Test);
  65.             testProperties.Verify(p => p.Test);
  66.   其他细节可以查看MoQ文档。
  67.   二、运用
  68.   先建立 一个Account类:
  69.  
  70. 建立 一个数据库Provider接口:
  71.    public interface ITransferProvider
  72.     {
  73.         void TransferTo(Account accountFrom, Account accountTo);
  74.     }
  75.   然后建立 转账处理类:
  76.    TransferProcess
  77.    public class TransferProcess
  78.       {
  79.           private Account From;
  80.           private Account To;
  81.           private ITransferProvider transfer;
  82.           public TransferProcess(Account from, Account to, ITransferProvider transfer)
  83.           {
  84.               this.From = from;
  85.               this.To = to;
  86.              this.transfer = transfer;
  87.          }
  88.          public void Transfer(decimal money)
  89.          {
  90.              if (money<From.Money)
  91.              {
  92.                  From.Money = From.Money - money;
  93.                  To.Money = To.Money + money;
  94.                  transfer.TransferTo(From, To);
  95.              }
  96.              else
  97.              {
  98.                  throw new Exception("超出余额");
  99.              }
  100.          }
  101.      }
  102.  
  103.  下边我们来测试这个转账处理类:
  104.    var transfer = new Mock<ITransferProvider>();
  105.             Account accountFrom = new Account() { AccountNum = , Money = , Name = "lfm1" };
  106.             Account accountTo = new Account() { AccountNum = , Money = , Name = "lfm1" };
  107.             TransferProcess tp = new TransferProcess(accountFrom, accountTo, transfer.Object);
  108.             tp.Transfer();
  109.             Assert.AreEqual(, accountFrom.Money);
  110.             Assert.AreEqual(, accountTo.Money);

下面是java

maven3的一个测试项目,由到要用到easyMock

所用到的包:easymock-3.1.jar,cglib-nodep-2.2.2.jar

  1. @Test
  2. public void testUser(){
  3. //创建实体对象
  4. UserBean bean = new UserBean();
  5. //设定实体对象值,预期值
  6. bean.setId("1001");
  7. bean.setUsername("hzg");
  8. bean.setPassword("123");
  9. //1、创建mock对象,以接口形式创建
  10. BaseDao daoMock = EasyMock.createMock(BaseDao.class);
  11. //2、设定参预期和返回,查询预期值得到所设定的预期结果
  12. EasyMock.expect(daoMock.queryById("1001")).andReturn(bean);
  13. //3、结束录制
  14. EasyMock.replay(daoMock);
  15.  
  16. //比较service调用的值是否与设定的值相同
  17. UserService s = new UserService();
  18. s.setDao(daoMock);
  19. UserBean user = s.getUserInfo("1001");
  20. assertNotNull(user);
  21. assertEquals("1001",user.getId());
  22. assertEquals("hzg",user.getUsername());
  23. assertEquals("123",user.getPassword());
  24. //4、回放录制
  25. EasyMock.verify(daoMock);
  26.  
  27. }
  1. import org.junit.After;
  2. import org.junit.AfterClass;
  3. import org.junit.Assert;
  4. import org.junit.Before;
  5. import org.junit.BeforeClass;
  6. import org.junit.Ignore;
  7. import org.junit.Test;
  8.  
  9. public class Junit4TestCase {
  10.  
  11. @BeforeClass
  12. public static void setUpBeforeClass() {
  13. System.out.println("Set up before class");
  14. }
  15.  
  16. @Before
  17. public void setUp() throws Exception {
  18. System.out.println("Set up");
  19. }
  20.  
  21. @Test
  22. public void testMathPow() {
  23. System.out.println("Test Math.pow");
  24. Assert.assertEquals(4.0, Math.pow(2.0, 2.0), 0.0);
  25. }
  26.  
  27. @Test
  28. public void testMathMin() {
  29. System.out.println("Test Math.min");
  30. Assert.assertEquals(2.0, Math.min(2.0, 4.0), 0.0);
  31. }
  32.  
  33. // 期望此方法抛出NullPointerException异常
  34. @Test(expected = NullPointerException.class)
  35. public void testException() {
  36. System.out.println("Test exception");
  37. Object obj = null;
  38. obj.toString();
  39. }
  40.  
  41. // 忽略此测试方法
  42. @Ignore
  43. @Test
  44. public void testMathMax() {
  45. Assert.fail("没有实现");
  46. }
  47. // 使用“假设”来忽略测试方法
  48. @Test
  49. public void testAssume(){
  50. System.out.println("Test assume");
  51. // 当假设失败时,则会停止运行,但这并不会意味测试方法失败。
  52. Assume.assumeTrue(false);
  53. Assert.fail("没有实现");
  54. }
  55.  
  56. @After
  57. public void tearDown() throws Exception {
  58. System.out.println("Tear down");
  59. }
  60.  
  61. @AfterClass
  62. public static void tearDownAfterClass() {
  63. System.out.println("Tear down After class");
  64. }
  65.  
  66. }

地址:

http://www.blogjava.net/rongxh7/archive/2009/06/28/284438.html

http://thihy.iteye.com/blog/1771826

使用 Visual Studio Team Test 进行单元测试和java中的测试的更多相关文章

  1. 使用Visual Studio Team Services持续集成(四)——使用构建运行测试

    使用Visual Studio Team Services持续集成(四)--使用构建运行测试 使用构建来运行测试来验证集成是一个很好的实践. MyHealth.API.IntegrationTests ...

  2. 使用Visual Studio Team Services敏捷规划和项目组合管理(三)——使用Kanban板

    使用Visual Studio Team Services敏捷规划和项目组合管理(三)--使用Kanban板 1.要查看Kanban板,请单击Work>Backlogs页面上的Board 链接. ...

  3. Visual Studio Team Foundation Server 2015(TFS 秘钥、序列号)

    Visual Studio Team Foundation Server 2015 序列号:PTBNK-HVGCM-HB2GW-MXWMH-T3BJQ

  4. Visual Studio Team Services 帐户管理操作

    Visual Studio Team Services 网址: https://www.visualstudio.com/ 1.登陆 2.登陆后新建账户 3.删除团队项目 (1)点击自己的Visual ...

  5. 每次打开VS都报错:我们无法自动填充你的 Visual Studio Team Services 帐户

    我们无法自动填充你的 Visual Studio Team Services 帐户.遇到下面的错误: TF400813: Resource not available for anonymous ac ...

  6. 使用Visual Studio Team Services进行压力和性能测试(一)——创建基础的URL压力测试

    使用Visual Studio Team Services进行压力和性能测试(一)--创建基础的URL压力测试 概述 压力测试使应用程序更加健壮,并审核在用户负载下的行为,这样我们可以在当前的基础设施 ...

  7. 使用Visual Studio Team Services持续集成(三)——使用工件

    使用Visual Studio Team Services持续集成(三)--使用工件 工件是应用程序的可部署组件.Visual Studio Team Services有能力在构建过程中显式地管理工件 ...

  8. 使用Visual Studio Team Services持续集成(二)——为构建定义属性

    使用Visual Studio Team Services持续集成(二)--为构建定义属性 1.从VSTS帐户进入到Build 2.编辑构建定义并单击Options Description:如果这里明 ...

  9. 使用Visual Studio Team Services持续集成(一)——构建ASP.NET Core

    使用Visual Studio Team Services持续集成(一)--构建ASP.NET Core 概述 持续集成(CI)是将代码尽可能频繁地集成到共享仓库中的过程.在代码集成期间,构建中断或测 ...

随机推荐

  1. [xUI] ligerUI开发框架简介和搭建

    ligerUI开发者:谢略,网名daomi API:         http://api.ligerui.com/ 演示地址:  http://demo.ligerui.com/ 源码下载:  ht ...

  2. 【Android车载系统 News | Tech 2】News 谷歌开发新车载系统!安卓Auto不是终点 2014-12-20

    Google在今年推出了车载安卓系统Android Auto,旨在为汽车提供娱乐.导航等功能.不过,Android Auto并不是终点,现在有消息报道,Google正在开发一个能够彻底取代汽车底层控制 ...

  3. 【Mood-10】每个程序员都应该读的30本书

    “如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西.” 很多程序员响应,他们在推荐时也写下自己的评语. ...

  4. Myeclipse集成Jboss 6.1控制台不输出日志信息

    在使用myeclipse+jboss 6.1开发的时候发现jboss能够正常启动但是myeclipse的控制台却没有任何的信息输出,这使得我没有办法开发,在查找了大部分的资料发现很多说要改什么jbos ...

  5. Redis中的批量删除数据库中的Key

    本文参考:http://blog.csdn.net/spring21st/article/details/15771861 http://stackoverflow.com/questions/575 ...

  6. html背景自动移动

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. 破解软件感悟-PE文件格式之实例总结(五)

    有很多介绍PE文件的文章,但是我打算写一篇关于输入表的文章,因为它对于破解很有用.     我想解释它的最好的方法是举一个例子,你可以跟着我逐步深入,一步一步的思考,最后你将完全明白,我选择了一个我刚 ...

  8. 让文字在标签li的底部

    <ul> {aspcms:navlist type=6 } <li style="border-bottom:1px solid #d4d4d4;padding-top:2 ...

  9. 小菜鸟带着梦想学chromium

    风雨送春归, 飞雪迎春到. 已是悬崖百丈冰, 犹有花枝俏. 俏也不争春, 只把春来报. 待到山花烂漫时, 她在丛中笑. 这首卜算子·咏梅可是应了我的心情了.最近换工作,受到频频打击,面试过程中发现满世 ...

  10. c# js调用AjaxPro方法出错解析

    公司的项目的框架中有一部分用到了AjaxPro这个方法,看到这个方法的我一脸懵逼,老老实实去百度了一下. AjaxPro是.NET平台下的一个回调式AJAX框架,使用简单,功能强大.顾名思义ajax, ...