什么是Mock测试方法

2021-03-24 08:52发布

6条回答
小磊子
2楼 · 2021-03-24 09:33

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

是开心果呀 - 热爱生活
3楼 · 2021-03-24 11:47

Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。

三岁奶猫
4楼 · 2021-03-24 13:49

mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为

梵梵
5楼 · 2021-03-27 10:30

mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对上级模块的测试。

这里分为两类测试:一类是前端对接口的mock,一类是后端单元测试中涉及的mock

单纯的前端mock可以通过抓包工具Fiddler,Charles实现,通过修改代理返回的数据,实现多种场景的测试。这里在抓包工具之中会解释。

后端的Mock则是从接口的角度,如果一个接口A返回的数据需要依赖于另一个接口B,当敏捷开发中B接口还未开发完全时候这里会需要用到Mock。



我的网名不再改
6楼 · 2021-03-28 13:34

mock测试:就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。


  mock对象:这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。


  mock对象使用范畴:


  真实对象具有不可确定的行为,产生不可预测的效果,(如:股票行情,天气预报)


  真实对象很难被创建的


  真实对象的某些行为很难被触发


  真实对象实际上还不存在的(和其他开发小组或者和新的硬件打交道) 等等...


  使用mock对象测试的关键步骤:


  使用一个接口来描述这个对象


  在产品代码中实现这个接口


  在测试代码中实现这个接口


  在被测试代码中只是通过接口来引用对象,所以它不知道这个引用的对象是真实对象还是mock对象。


  MockObject概述


  使用Mock Object进行测试,主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)从而使测试顺利进行的工具。


  目前,在Java阵营中主要的Mock测试工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微软的.Net阵营中主要是Nmock,.NetMock等。


  以下就对在Java中使用的Mock Object进行测试的常用工具做一下使用说明。


  JMock


  简介


  准备


  1.获取J2SDK;


  2.获取JUnit V3.8.1(从http://www.junit.org获取开发包);


  3.获取JMock V1.0(从http://www.jmock.org获取JMock开发包)。


  4.为了开发方便,建议使用一个好IDE。以下例子中的代码均是在Eclipse V3.0环境下进行的调试。


  例子一


  以下是一个简单例子,代码如下:


package  test1;


   import  org.jmock. * ;


   import  javax.servlet.http. * ;


   public   class  MockRequestTest  extends  MockObjectTestCase{


   public   void  testMockRequest1(){


   // 构造一个Mock对象


  Mock mock  =   new  Mock(HttpServletRequest. class );


   // 设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的


   // getParameter方法,传递的参数是"name",期望的返回是"kongxx"


  mock.eXPects(once()).method( " getParameter " ).with(eq( " name " )).will(returnValue( " kongxx " ));


   // 根据Mock对象获取一个HttpServletRequest对象


  HttpServletRequest request  =  (HttpServletRequest)mock.proxy();


   // 断言调用结果


  assertEquals( " kongxx "  ,request.getParameter( " name " ));


  }


   public   void  testMockRequest2(){


   // 构造一个Mock对象


  Mock mock  =   new  Mock(HttpServletRequest. class );


   // 设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的


   // getParameter方法,传递的参数是"name",期望的返回是"kongxx"


  mock.expects(once()).method( " getParameter " ).with(eq( " name " )).will(returnValue( " kongxx " ));


   // 根据Mock对象获取一个HttpServletRequest对象


  HttpServletRequest request  =  (HttpServletRequest)mock.proxy();


   // 调用HttpServletRequest对象的方法


  request.getParameter( " name " );


   // 验证执行结果


  mock.verify();


  }


  }

  编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。


  例子二


  MyClass需要测试的类,提供了两个方法getName和getPassWord,都使用HttpServletRequest作为输入参数并返回从HttpServletRequest中取得的参数,具体代码如下: 


package  test2;


   import  javax.servlet.http. * ;


   public   class  MyClass {


   public  String getName(HttpServletRequest request) {


   return  request.getParameter( " name " );


  }


   public  String getPassword(HttpServletRequest request) {


   return  request.getParameter( " password " );


  }


  }

  TestMyClass测试类,其中构造了一个假的HttpServletRequest对象,用来测试MyClass中的getName和getPassword方法,代码如下: 


package  test2;


   import  org.jmock. * ;


   import  javax.servlet.http. * ;


   public   class  TestMyClass  extends  MockObjectTestCase{


   private  MyClass myclass ;


   private  Mock mockRequest ;


   private  HttpServletRequest request ;


   public   void  setUp() {


  myclass  =   new  MyClass();


   // 构造一个Mock对象


  mockRequest  =   new  Mock(HttpServletRequest. class );


   // 根据Mock对象获取一个HttpServletRequest对象


  request  =  (HttpServletRequest)mockRequest.proxy();


  }


   public   void  tearDown() {


   // TODO


  }


   public   void  testGetName(){


   // 设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的


   // getParameter方法,传递的参数是"name",期望的返回是"kongxx"


  mockRequest.expects(atLeastOnce()).method( " getParameter " ).with(eq( " name " )).will(returnValue( " kongxx " ));


  assertNotNull(myclass.getName(request));


  assertEquals( " kongxx "  ,myclass.getName(request));


  }


   public   void  testGetPassword(){


   // 设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的


   // getParameter方法,传递的参数是"password",期望的返回是"123456789"


  mockRequest.expects(atLeastOnce()).method( " getParameter " ).with(eq( " password " )).will(returnValue( " 123456789 " ));


  assertNotNull(myclass.getPassword(request));


  assertEquals( " 123456789 "  ,myclass.getPassword(request));


  }


  }

  编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。


  EasyMock


  简介


  准备


  1.获取J2SDK;


  2. 获取JUnit V3.8.1(从http://www.junit.org获取开发包);


  3.获取EasyMock V1.1(从http://www.easymock.org获取EasyMock开发包)。


  4.为了开发方便,建议使用一个好IDE。以下例子中的代码均是在Eclipse V3.0环境下进行的调试。


  例子一


  以下是一个简单例子,为了方便对比,这里重新实现了JMock例子一,代码如下:


package  test1;


   import  org.easymock. * ;


   import  junit.framework. * ;


   import  javax.servlet.http. * ;


   public   class  MockRequestTest  extends  TestCase{


   private  MockControl control;


   private  HttpServletRequest mockRequest;


   public   void  testMockRequest(){


   // 创建一个Mock HttpServletRequest的MockControl对象


  control  =  MockControl.createControl(HttpServletRequest. class );


   // 获取一个Mock HttpServletRequest对象


  mockRequest  =  (HttpServletRequest) control.getMock();


   // 设置期望调用的Mock HttpServletRequest对象的方法


  mockRequest.getParameter( " name " );


   // 设置调用方法期望的返回值,并指定调用次数


   // 以下后两个参数表示最少调用一次,最多调用一次


  control.setReturnValue( " kongxx "  , 1  , 1 );


   // 设置Mock HttpServletRequest的状态,


   // 表示此Mock HttpServletRequest对象可以被使用


  control.replay();


   // 使用断言检查调用


  assertEquals( " kongxx " ,mockRequest.getParameter( " name " ));


   // 验证期望的调用


  control.verify();


  }


  }

  编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。


  例子二


  同例子一样,对JMock例子二重新实现产生了EasyMock的例子二。


  需要测试的类代码如下:


package  test2;


   import  javax.servlet.http. * ;


   public   class  MyClass {


   public  String getName(HttpServletRequest request) {


   return  request.getParameter( " name " );


  }


   public  String getPassword(HttpServletRequest request) {


   return  request.getParameter( " password " );


  }


  }

  测试类代码如下: 


package  test2;


   import  org.easymock. * ;


   import  junit.framework. * ;


   import  javax.servlet.http. * ;


   public   class  TestMyClass  extends  TestCase{


   private  MockControl control;


   private  HttpServletRequest mockRequest;


   private  MyClass myclass ;


   public   void  setUp() {


  myclass  =   new  MyClass();


   // 创建一个Mock HttpServletRequest的MockControl对象


  control  =  MockControl.createControl(HttpServletRequest. class );


   // 获取一个Mock HttpServletRequest对象


  mockRequest  =  (HttpServletRequest) control.g


征戰撩四汸
7楼 · 2022-04-19 16:25

   Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。

3、Mock对象适用场景

(1)需要将当前被测单元和其依赖模块独立开来,构造一个独立的测试环境,不关注被测单元的依赖对象,只关注被测单元的功能逻辑。

  -----比如被测代码中需要依赖第三方接口返回值进行逻辑处理,可能因为网络或者其他环境因素,调用第三方经常会中断或者失败,无法对被测单元进行测试,这个时候就可以使用mock技术来将被测单元和依赖模块独立开来,使得测试可以进行下去。

(2)被测单元依赖的模块尚未开发完成,而被测单元需要依赖模块的返回值进行后续处理。

 1)前后端项目中,后端接口开发完成之前,接口联调;

 2)依赖的上游项目的接口尚未开发完成,需要接口联调测试;

  -----比如service层的代码中,包含对Dao层的调用,但是,DAO层代码尚未实现

(3)被测单元依赖的对象较难模拟或者构造比较复杂。

  -----比如,支付宝支付的异常条件有很多,但是模拟这种异常条件很复杂或者无法模拟,比如,查询聚划算的订单结果,无法在测试环境进行模拟。


相关问题推荐

  • 回答 157

    虽然从事开发行业的女生越来越多,但女生的比例还是远比不上男生。软件测试的男女生比例则基本相当,软件测试要求细心、耐心,大部分女生也是比较适合学的。而且软件测试课程分为手工测试和自动化测试,手工测试分为功能测试、性能测试、接口测试。自动化测试...

  • 回答 121

    需要。很多人当初抱着测试不需要懂代码,才选择了这个行业,这个就要看对自己的职业定位了,是止步于月薪过万就可以了,还是往20k、30k去突破,如果这样的话,是肯定要会接口、会自动化,就必然要涉及到代码。如果真的看不懂代码,实际的测试后期的工作会出现...

  • 回答 91

    在我看来游戏开发挺难的,尤其像手游一类的还有网游,里面有很多的程序代码而且伤神又费力,不过也有女生在这方面做的很好的,如果你感兴趣,非常想学,可以试试

  • 回答 80

    软件测试专业现在很火热,很缺少人才,25岁学软件测试能学会,就业薪资也高,工作也相对轻松

  • 回答 11
    已采纳

    测试类型有:功能测试,性能测试,界面测试。功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用...

  • 回答 15
    已采纳

    这个其实和接口测试的场景密不可分的,比如说:外部接口测试:    必须先接口测试通过了,才能执行功能测试子系统或者各个模块之间的联调测试:    必须各子系统后台代码完成,并提供接口才可以完成测试,一般来说都要求各子系统功能测试通过后再进行...

  • 回答 6
    已采纳

    这个是会因为公司的架构不同而不同的,并不是固定的,但是一般是会有专门的测试部门,或者叫质量保证部,也有可能是叫别的名字。

  • 回答 43
    已采纳

    移动端测试,包括App兼容性测dao试,7*24小时稳定性测试,功耗性能测试,UI测试,交互测试等,课程主要学习的内容有:1、功能测试主要包括计算机基础、软件测试核心理论、Linux、数据库,学习目标是掌握软件测试核心理论,结合Linux、数据库等可实现移动端、w...

  • 回答 1

    标题  1. 首先要做一个标题党(此标题党非彼标题党)。标题一定要清晰简洁易理解,不应该臃长  2. 尽量前缀要规范,例如模板: [Product][Version]_[Feature]_[Title],这样描述会很清晰,也方便查找  3. 缺陷的标题一定要描述在什么情况下发生了什么问...

  • 回答 1

    1、 缺陷报告可以记录缺陷2、可以对缺陷进行跟踪管理3、可以对缺陷报告进行分类 总结 统计

  • 回答 1

    1、缺陷编号(Defect ID),提交BUG的顺序。2、缺陷标题(summary),简明扼要的说明一下这个BUG。3、缺陷的发现者(DetectedBy) ,一般是自己。4、发现缺陷的日期(Detected on date),一般是当天。5、缺陷所属的模块(subject), 在测试哪个模块的时候发现的BUG...

  • 回答 1

    缺陷标题好的缺陷标题需要让相关人员一目了然,一般建议的格式是条件+失败。缺陷类型缺陷类型也是根据具体的项目而定的。但一般情况下分为功能、界面、建议。重现步骤重现步骤的编写规则可以参考测试用例中的操作步骤 ,一定要足够详细、说明清楚问题的操作顺...

  • 回答 1

    工具:NoSQLUnitJsTestDriverQTRunnerVenusFluintBuster.JSSQLUnitECUTQTestlibUnitilsgreatestDbUnitAbbotGoogleTest框架:JUnitMoqJSCaptureMockCUnitPyUnitCppUTestCppUnitzCUTcipra

  • 回答 1

    JunitTestNGGoogleTestpytestunittestJmockitJaCoCogcov、lcov、gcovrCoverage.pyEvoSuiteDiffblue Cover

  • 回答 1

      React Hooks测试库( Testing Library)是一个简单而完整的React Hooks测试工具。  React Hooks测试库让用户可以为React钩子创建简单的测试工具,自定义钩子的输入和检索输出,以处理在功能组件体内运行的情况。  使用React Hooks,用户不必为了测试而去担...

  • 回答 1

    1、单元测试注重代码逻辑,接口测试注重业务逻辑;2、单元测试的粒度最小,是测试最小独立的单元模块(不依赖其他模块);接口测试不是,会覆盖很多;3、单元测试是白盒测试,接口测试是黑盒测试;4、单元测试关注的是代码的实现和逻辑,测试范围较小,保证实...

没有解决我的问题,去提问