使用 Visual Studio Team Test 进行单元测试和java中的测试

原文:使用 Visual Studio Team Test 进行单元测试和java中的测试

 

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后就可以开始测试了。如下代码():

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using NUnit.Framework;

namespace StartNUnit{    [TestFixture]    public class TheFirstTest    {        [Test]        public void TestMethod()        {             …………        }    }}

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

单元测试中 我也碰到a类中调用b类的方法,我想测试a 然后mock b被调用的方法
public class A
    {
        public int MethodA(int i,IB b)
        {
            return b.MethodB(i) - i;
        }

        public int MethodB(int i)
        {
            return new B().MethodB(i) - 1;
        }
    }

    public interface IB
    {
        int MethodB(int i);
    }

    public class B :IB
    {
        public int MethodB(int i)
        {
            throw new Exception();
        }
    }

测试A类中的MethodA方法
        [TestMethod()]

        public void MethodATest()
        {
            A target = new A(); // TODO: 初始化为适当的值
            int i = 11; // TODO: 初始化为适当的值
            var mock = new Mock<IB>();
            mock.Setup(p => p.MethodB(11))
                .Returns(20);
            IB b = mock.Object; // TODO: 初始化为适当的值
            int expected = 9; // TODO: 初始化为适当的值
            int actual;
            actual = target.MethodA(i, b);
            Assert.AreEqual(expected, actual);
        }

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CalculatorPkg
{
public interface ICalculator
{
int Add(int param1, int param2);
int Subtract(int param1, int param2);
int Multipy(int param1, int param2);
int Divide(int param1, int param2);
int ConvertUSDtoRMB(int unit);
}
}

假定人民币转美元的接口定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MoneyExchangeRatePkg
{
public interface IUSD_RMB_ExchangeRateFeed
{
int GetActualUSDValue();
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MoneyExchangeRatePkg
{
public interface IUSD_RMB_ExchangeRateFeed
{
int GetActualUSDValue();
}
}

下面是Calculator的实现类,其中人民币转美元的接口实例以构造函数参数的形式传给Calculator类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MoneyExchangeRatePkg;

namespace CalculatorPkg
{
public class Calculator : ICalculator
{
private IUSD_RMB_ExchangeRateFeed _feed;
public Calculator(IUSD_RMB_ExchangeRateFeed feed)
{
this._feed = feed;
}
#region ICalculator Members
public int Add(int param1, int param2)
{
throw new NotImplementedException();
}
public int Subtract(int param1, int param2)
{
throw new NotImplementedException();
}
public int Multipy(int param1, int param2)
{
throw new NotImplementedException();
}
public int Divide(int param1, int param2)
{
return param1 / param2;
}
public int ConvertUSDtoRMB(int unit)
{
return unit * this._feed.GetActualUSDValue();
}
#endregion
}
}

下面我们开始准备Calculator组件的测试环境,我们使用NUnit框架和Moq来做Mock。

您可以到http://www.nunit.org/获得nunit,到http://code.google.com/p/moq/获得moq框架的源码和dll文件。

然后我们就可以创建测试项目,并添加nunit和moq的引用。

我们要mock汇率的接口,下面是mock的方法:

Mock<IUSD_RMB_ExchangeRateFeed> mockObject = new Mock<IUSD_RMB_ExchangeRateFeed>();
mockObject.Setup(m => m.GetActualUSDValue()).Returns(500);
IUSD_RMB_ExchangeRateFeed value = mockObject.Object;

对汇率接口的MOCK只需要三行代码,第一行声明mock接口,第二行设定要mock方法的返回值,第三步通过Object属性获得mock的对象。

下面是完整的测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Moq;
using CalculatorPkg;
using MoneyExchangeRatePkg;

namespace CalculatorPkg.Tests
{
// 添加TestFixture标识类是测试类
[TestFixture]
public class CalculatorTester
{
// 定义mock的逻辑
private IUSD_RMB_ExchangeRateFeed prvGetMockExchangeRateFeed()
{
Mock<IUSD_RMB_ExchangeRateFeed> mockObject = new Mock<IUSD_RMB_ExchangeRateFeed>();
mockObject.Setup(m => m.GetActualUSDValue()).Returns(500);
return mockObject.Object;
}
// 测试divide方法
[Test(Description="Divide 9 by 3. Expected result is 3.")]
public void TC1_Divide9By3()
{
IUSD_RMB_ExchangeRateFeed feed = this.prvGetMockExchangeRateFeed();
ICalculator calculator = new Calculator(feed);
int actualResult = calculator.Divide(9,3);
int expectedResult = 3;
Assert.AreEqual(expectedResult, actualResult);
}
[Test(Description = "Divide any number by zero. Should throw an System.DivideByZeroException exception.")]
[ExpectedException(typeof(System.DivideByZeroException))]
public void TC2_DivideByZero()
{
IUSD_RMB_ExchangeRateFeed feed = this.prvGetMockExchangeRateFeed();
ICalculator calculator = new Calculator(feed);
int actualResult = calculator.Divide(9, 0);
}
[Test(Description = "Convert 1 USD to RMB. Expected result is 500.")]
public void TC3_ConvertUSDtoRMBTest()
{
IUSD_RMB_ExchangeRateFeed feed = this.prvGetMockExchangeRateFeed();
ICalculator calculator = new Calculator(feed);
int actualResult = calculator.ConvertUSDtoRMB(1);
int expectedResult = 500;
Assert.AreEqual(expectedResult, actualResult);
}
}
}
我们在做单元测试的时候,常常困扰于数据的持久化疑问 ,很多情况下我们不希望单元测试影响到数据库中的内容,而且受数据库的影响有时我们的单元测试的速度会很慢,所以我们往往希望将持久化部分隔离开,做单元测试的时候不真实 的将数据持久化。这种隔离我们一般运用 抽象的方式,也就是运用 接口或抽象类将持久化层隔离开,然后运用 mock来模拟相应的接口或抽象类来完成相应的持久化类。MoQ就是这种Mock框架之一,MoQ运用 了C#3.0,跟 NMock相比MoQ运用 起来更基本 ,而且是强类型的方式的,源码和dll可以到http://code.Google.com/p/moq/下载。现在MoQ最新的揭晓 版本是3.1版,4.0还处在beta版中,所以我们这里运用 的是3.1版。
  下面我们就来介绍一下MoQ的具体用法:
  一、基础知识
  在运用 MoQ之前我们必须要先在测试程序中引入Moq.dll,运用 MoQ的主要命名空间是Moq,其中最重的类就是Mock<T>,我们可以用这个类来模拟接口。
  1、要领
      public interface ITest
    {
        string Test();
    }
  测试代码:
  基本 测试代码
      [TestMethod()]
      public void TestTest()
      {
         var test = new Mock<ITest>();
         test.Setup(p => p.Test()).Returns("lfm");
         Assert.AreEqual("lfm", test.Object.Test());
      }
  2、匹配参数
         public interface IMatchTest
    {
        string Test(int test);
    }

  匹配测试
var testMatch = new Mock<IMatchTest>();
            testMatch.Setup(p => p.Test(It.Is<int>(i => i % 2 == 0))).Returns("偶数");
            testMatch.Setup(p => p.Test(It.Is<int>(i => i % 2 != 0))).Returns("奇数");
            Assert.AreEqual("偶数", testMatch.Object.Test(4));
            Assert.AreEqual("奇数", testMatch.Object.Test(3));
  上边测试代码模拟实现IMathTest接口实例,其中如果Test要领 的参数是偶数,其返回值为“偶数”。这里的IT用来过滤参数的类,其具体解释可以参见MoQ的文档
  3、属性
         public interface IPropertiesTest
    {
         int Test { get; set; }
    }
 
            var testProperties = new Mock<IPropertiesTest>();
            testProperties.Setup(p => p.Test).Returns(1);
            Assert.AreEqual(1, testProperties.Object.Test);
或者
                                 var testProperties = new Mock<IPropertiesTest>();
            testProperties.SetupProperty(p => p.Test,1);
            Assert.AreEqual(1, testProperties.Object.Test);
  4、Callback
  当执行某要领 时调用其内部输入的Action委托

int count = 0;
            var testProperties = new Mock<IPropertiesTest>();
            testProperties.Setup(p => p.Test).Returns(1).Callback(()=>count++);
            Assert.AreEqual(1, testProperties.Object.Test);
            Assert.AreEqual(1, count);
  在调用Test要领 是执行了count++
  5、Verification
  判断某要领 或属性能不能 执行过
  如果代码如下:
                                   var testProperties = new Mock<IPropertiesTest>();
             testProperties.Setup(p => p.Test).Returns(1);
             testProperties.Verify(p => p.Test);
             Assert.AreEqual(1, testProperties.Object.Test);
  会抛出异常,因为第3行执行时Test要领 还没有被调用过,改为如下代码可以通过测试
                         var testProperties = new Mock<IPropertiesTest>();
            testProperties.Setup(p => p.Test).Returns(1);
            Assert.AreEqual(1, testProperties.Object.Test);
            testProperties.Verify(p => p.Test);
  其他细节可以查看MoQ文档。
  二、运用
  先建立 一个Account类:

     建立 一个数据库Provider接口:
   public interface ITransferProvider
    {
        void TransferTo(Account accountFrom, Account accountTo);
    }
  然后建立 转账处理类:
             TransferProcess
             public class TransferProcess
      {
          private Account From;
          private Account To;
          private ITransferProvider transfer;
          public TransferProcess(Account from, Account to, ITransferProvider transfer)
          {
              this.From = from;
              this.To = to;
             this.transfer = transfer;
         }
         public void Transfer(decimal money)
         {
             if (money<From.Money)
             {
                 From.Money = From.Money - money;
                 To.Money = To.Money + money;
                 transfer.TransferTo(From, To);
             }
             else
             {
                 throw new Exception("超出余额");
             }
         }
     }

      下边我们来测试这个转账处理类:
   var transfer = new Mock<ITransferProvider>();
            Account accountFrom = new Account() { AccountNum = 1, Money = 1000, Name = "lfm1" };
            Account accountTo = new Account() { AccountNum = 2, Money = 1000, Name = "lfm1" };
            TransferProcess tp = new TransferProcess(accountFrom, accountTo, transfer.Object);
            tp.Transfer(500);
            Assert.AreEqual(500, accountFrom.Money);
            Assert.AreEqual(1500, accountTo.Money);

下面是java

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

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

@Test
    public void testUser(){
        //创建实体对象
        UserBean bean = new UserBean();
        //设定实体对象值,预期值
        bean.setId("1001");
        bean.setUsername("hzg");
        bean.setPassword("123");
        //1、创建mock对象,以接口形式创建
        BaseDao daoMock = EasyMock.createMock(BaseDao.class);
        //2、设定参预期和返回,查询预期值得到所设定的预期结果
        EasyMock.expect(daoMock.queryById("1001")).andReturn(bean);
        //3、结束录制
        EasyMock.replay(daoMock);

        //比较service调用的值是否与设定的值相同
        UserService s = new UserService();
        s.setDao(daoMock);
        UserBean user = s.getUserInfo("1001");
        assertNotNull(user);
        assertEquals("1001",user.getId());
        assertEquals("hzg",user.getUsername());
        assertEquals("123",user.getPassword());
        //4、回放录制
        EasyMock.verify(daoMock);

    }
 
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class Junit4TestCase {

    @BeforeClass
    public static void setUpBeforeClass() {
        System.out.println("Set up before class");
    }

    @Before
    public void setUp() throws Exception {
        System.out.println("Set up");
    }

    @Test
    public void testMathPow() {
        System.out.println("Test Math.pow");
        Assert.assertEquals(4.0, Math.pow(2.0, 2.0), 0.0);
    }

    @Test
    public void testMathMin() {
        System.out.println("Test Math.min");
        Assert.assertEquals(2.0, Math.min(2.0, 4.0), 0.0);
    }

        // 期望此方法抛出NullPointerException异常
    @Test(expected = NullPointerException.class)
    public void testException() {
        System.out.println("Test exception");
        Object obj = null;
        obj.toString();
    }

        // 忽略此测试方法
    @Ignore
    @Test
    public void testMathMax() {
          Assert.fail("没有实现");
    }
        // 使用“假设”来忽略测试方法
    @Test
    public void testAssume(){
        System.out.println("Test assume");
                // 当假设失败时,则会停止运行,但这并不会意味测试方法失败。
        Assume.assumeTrue(false);
        Assert.fail("没有实现");
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("Tear down");
    }

    @AfterClass
    public static void tearDownAfterClass() {
        System.out.println("Tear down After class");
    }

}

地址:

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

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

 

时间: 2024-11-18 21:47:30

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

求 Visual Studio Team Suite 2008 英文版 安装包中的 vs_setup.msi

问题描述 求VisualStudioTeamSuite2008英文版安装包中的vs_setup.msi安装后将安装文件删了现在填序列号需要vs_setup.msi 解决方案 解决方案二:顶~~~~~

Visual Studio Team Architect团队的敏捷软件开发(第三部分)

在开始之前,首先来回顾一下我们是如何得到在sprint中需要实现的用户故事(User Story)列表的 :首先,团队会根据开发团队在以往sprint的经验中得出的团队开发速度评估,以及对产品待开发事项( Product Backlog)的粗略的成本评估.基于这两个评估,开发团队从产品待开发事项中挑选出一个用户 故事的候选列表,提交给产品利益相关者(Stakeholder)进行讨论.在讨论的过程中,伴随着用户需求 的进一步明确与细化,该列表的优先级可能会有相应的调整.回顾这个过程,不正是敏捷开发

Visual Studio Team System 2010中的敏捷规划工具

本文以 Visual Studio Team System (VSTS) 2010 的预发布版为基础.所有信息均有可能发生变更. 本文将介绍以下内容: 产品和小版本规划 产品积压工作簿 容量规划和报表 小版本积压工作簿 本文使用了以下技术: VSTS 2010.VSTS Process for Agile Software Development 1.0 "敏捷规划"存在语意矛盾吗?希望您不会这样认为,但在最近于洛杉矶召开的一次专项小组会议中,其中一位与会者指出其组织已从敏捷开发转为采

Visual Studio Team Architect团队的敏捷软件开发(第二部分)

为了延续整个系列的行文思路,我也会涉及一些我们团队计划sprint的方法以及sprint过程中发生的 事情,并穿插着回答你们提出的那些问题. 首先,我想说的是,不存在敏捷无需计划的神话.可是,敏捷开发中的计划的确和传统软件开发中的 计划有着很大区别.正如我在上一篇博文中所说,我们针对利益攸关方(stakeholders)给出的上层需求创 建了带有优先级的产品待开发事项(product backlog).这一带有优先级的任务列表形成了最基本的 sprint计划.在这一过程中,我们一般遵循三阶段的步

Visual Studio Team Architect 团队的敏捷软件开发(第一部分)

在最近几次与客户面对面的交流中,我有幸分享了我们团队如何在日常工作中进行敏捷软件开发.毫 无疑问,这在中国开发人员中是个热门话题,我也想利用博客这个平台与更多的读者进行书面的交流.当 然关于敏捷开发利弊得失的争论有不少,而相关的开发模式也分成了TDD (Test Driven Development), Scrum, XP(eXtreme Programming)等流派.就我个人而言,一个团队是否严格遵循某种既定的敏捷方法并 不重要,但一定得选择并采用一种(或几种)最适合自己开发团队和开发项目的

visual studio (C++)如何调用matlab中的p文件

问题描述 visual studio (C++)如何调用matlab中的p文件 matlab中的p文件提供了一个算法函数,如何在visual studio中调用该函数呢?网上都提供的是visual studio使用matlab中M文件的方法,求大神指点.

Visual Studio Many Projects in One Solution VS中多工程开发

在用VS开发项目的时候,我们可以将不同的模块拆分开来,分别建立单独的Project来开发调试,整个放到一个Solution中就行了.这样做的好处是结构清晰,每个功能模块可以单独调试,而不用编译整个Solution,尤其当项目很大的时候,能节省很多编译时间.而且各个项目之间相互独立,对于每个模块,我们可以选择生成静态库Static Library或是应用程序Application,便于维护.那么下面来看如何将一个大项目拆分为若干个子项目: 1. Add new project in same so

在Visual Studio 2005和ASP.NET 2.0中使用强类型数据存取

asp.net|visual|数据 "Never put off until run time what can be done at compile time."David Gries, Compiler Construction for Digital Computers Introduction 作为程序员,我们在学习一些新技术的时候,范例有时候会是我们最大的敌人.指南通常被设计成简单易懂,但同时里面的懒惰.无效率的甚至是危险的代码编写会增多.像这种情况最普遍存在的就是在ADO.

想要Visual Studio Team System 2008 Team Suite 的朋友近来看看

问题描述 微软这个月每天送一张VisualStudioTeamSystem2008TeamSuite光盘,还送商业智能经典教材,感兴趣的就去微软网站看看吧!!http://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx 解决方案 解决方案二:really?解决方案三:LZ,应该是:VisualStudioTeamSystem2008TeamSuite beta2早就下了一个解决方案四:是be