mock工具测试web程序(mock测试的使用场景)

网友投稿 304 2023-05-03


本篇文章给大家谈谈mock工具测试web程序,以及mock测试的使用场景对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享mock工具测试web程序的知识,其中也会对mock测试的使用场景进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何用python 来mock一个web响应

什么是mock?
mock在翻译过来有模拟的意思。这里要介绍的mock是辅助单元测试的一个模块。它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言。
在Python2.x 中 mock是一个单独模块,需要单独安装。
pip install -U mock
在Python3.x中,mock已经被集成到了unittest单元测试框架中,所以,可以直接使用。
可能你和mock工具测试web程序我初次接触这个概念的时候会有这样的疑问:把要测的东西都模拟掉了还测试什么呢?
但在,实际生产中的项目是非常复杂的,对其进行单元测试的时候,会遇到以下问题:
接口的依赖
外部接口调用
测试环境非常复杂
单元测试应该只针对当前单元进行测试, 所有的内部或外部的依赖应该是稳定的, 已经在别处进行测试过的.使用mock 就可以对外部依赖组件实现进行模拟并且替换掉, 从而使得单元测试将焦点只放在当前的单元功能。
简单的例子
mock工具测试web程序我们先从最简单例子开始。
modular.py
#modular.py
class Count():
def add(self):
pass
这里要实现一个Count计算类,add() 方法要实现两数相加。但,这个功能我还没有完成。这时就可以借助mock对其进行测试。
mock_demo01.py
from unittest import mock
import unittest
from modular import Count
# test Count class
class TestCount(unittest.TestCase):
def test_add(self):
count = Count()
count.add = mock.Mock(return_value=13)
result = count.add(8,5)
self.assertEqual(result,13)
if __name__ == '__main__':
unittest.main()
count = Count()
首先,调用被测试类Count() 。
count.add = mock.Mock(return_value=7)
通过Mock类模拟被调用的方法add()方法,return_value 定义add()方法的返回值。
result = count.add(2,5)
接下来,相当于在正常的调用add()方法,传两个参数2和5,然后会得到相加的结果7。然后,7的结果是我们在上一步就预先设定好的。
self.assertEqual(result,7)
最后,通过assertEqual()方法断言,返回的结果是否是预期的结果7。
运行测试结果:
python3 mock_demo01.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
这样一个用例就在mock的帮助下编写完成,并且测试通过了。
完成功能测试
再接下来完成module.py文件中add()方法。
#module.py
class Count():
def add(self, a, b):
return a + b
然后,修改测试用例:
from unittest import mock
import unittest
from module import Count
class MockDemo(unittest.TestCase):
def test_add(self):
count = Count()
count.add = mock.Mock(return_value=13, side_effect=count.add)
result = count.add(8, 8)
print(result)
count.add.assert_called_with(8, 8)
self.assertEqual(result, 16)
if __name__ == '__main__':
unittest.main()
count.add = mock.Mock(return_value=13, side_effect=count.add)
side_effect参数和return_value是相反的。它给mock分配了可替换的结果,覆盖了return_value。简单的说,一个模拟工厂调用将返回side_effect值,而不是return_value。
所以,设置side_effect参数为Count类add()方法,那么return_value的作用失效。
result = count.add(8, 8)
print(result)
这次将会真正的调用add()方法,得到的返回值为16(8+8)。通过print打印结果。
assert_called_with(8,8)
检查mock方法是否获得了正确的参数。
解决测试依赖
前面的例子,只为了让大家对mock有个初步的印象。再接来,我们看看如何mock方法的依赖。
例如,我们要测试A模块,然后A模块依赖于B模块的调用。但是,由于B模块的改变,导致了A模块返回结果的改变,从而使A模块的测试用例失败。其实,对于A模块,以及A模块的用例来说,并没有变化,不应该失败才对。
这个时候就是mock发挥作用的时候了。通过mock模拟掉影响A模块的部分(B模块)。至于mock掉的部分(B模块)应该由其它用例来测试。
# function.py
def add_and_multiply(x, y):
addition = x + y
multiple = multiply(x, y)
return (addition, multiple)
def multiply(x, y):
return x * y
然后,针对 add_and_multiply()函数编写测试用例。func_test.py
import unittest
import function
class MyTestCase(unittest.TestCase):
def test_add_and_multiply(self):
x = 3
y = 5
addition, multiple = function.add_and_multiply(x, y)
self.assertEqual(8, addition)
self.assertEqual(15, multiple)
if __name__ == "__main__":
unittest.main()
运行结果:
python3 func_test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
目前运行一切正确常,然而,add_and_multiply()函数依赖了multiply()函数的返回值。如果这个时候修改multiply()函数的代码。
……
def multiply(x, y):
return x * y + 3
这个时候,multiply()函数返回的结果变成了x*y加3。
再次运行测试:
python3 func_test.py
F
======================================================================
FAIL: test_add_and_multiply (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "fun_test.py", line 19, in test_add_and_multiply
self.assertEqual(15, multiple)
AssertionError: 15 != 18
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
测试用例运行失败了,然而,add_and_multiply()函数以及它的测试用例并没有做任何修改,罪魁祸首是multiply()函数引起的,我们应该把 multiply()函数mock掉。
import unittest
from unittest.mock import patch
import function
class MyTestCase(unittest.TestCase):
@patch("function.multiply")
def test_add_and_multiply2(self, mock_multiply):
x = 3
y = 5
mock_multiply.return_value = 15
addition, multiple = function.add_and_multiply(x, y)
mock_multiply.assert_called_once_with(3, 5)
self.assertEqual(8, addition)
self.assertEqual(15, multiple)
if __name__ == "__main__":
unittest.main()
@patch("function.multiply")
patch()装饰/上下文管理器可以很容易地模拟类或对象在模块测试。在测试过程中,您指定的对象将被替换为一个模拟(或其他对象),并在测试结束时还原。
这里模拟function.py文件中multiply()函数。
def test_add_and_multiply2(self, mock_multiply):
在定义测试用例中,将mock的multiply()函数(对象)重命名为 mock_multiply对象。
mock_multiply.return_value = 15
设定mock_multiply对象的返回值为固定的15。
ock_multiply.assert_called_once_with(3, 5)
检查ock_multiply方法的参数是否正确。
再次,运行测试用例,通过!
---------------------------------------------------

怎样使用mock模拟一个rest web进行测试

spring 集成测试中 对mock mock工具测试web程序的集成实在是太棒了!但是使用请注意一下三个条件。 junit 必须使用四.9以上 同时您的框架必须是用spring mvc spring 三.二以上才完美支持 目前使用spring MVC 取代struts二 的很多mock工具测试web程序,spring MVC 的各种灵活让人无比销魂!所以使用spring MVC吧! 以前在对接口(主要是java服务端提供的接口(一般是:webService,restful))进行测试的中 一般用以下俩种方法

接口自动化测试之Mock




Mock介绍









1.找到要替换的对象:我们需要测试的是visit_ustack这个函数,那么我们需要替换掉send_request这个函数。


2.实例化Mock类得到一个mock对象,并且设置这个mock对象的行为。在成功测试中,我们设置mock对象的返回值为字符串“200”,在失败测试中,我们设置mock对象的返回值为字符串"404"。


3.使用这个mock对象替换掉我们想替换的对象。我们替换掉了client.send_request


4.写测试代码。我们调用client.visit_ustack(),并且期望它的返回值和我们预设的一样。


上面这个就是使用mock对象的基本步骤了。在上面的例子中我们替换了自己写的模块的对象,其实也可以替换标准库和第三方模块的对象,方法是一样的:先import进来,然后替换掉指定的对象就可以了。



Mockrunner用在J2EE环境中进行应用程序的模拟测试。它不仅支持Struts actions,servlets,过滤器和标签类,还包括一个JDBC和一个JMS测试框架,可以用于测试基于EJB的应用程序。


Mockrunner扩展了JUnit并模拟了必要的行为,而无需调用实际的基础结构。它不需要正在运行的应用程序服务器或数据库。此外,它不会调用web容器或Struts ActionServlet。它非常快速,使用户可以在测试的所有步骤中操纵所有涉及的类和模拟对象。它可以用于为基于J2EE的应用程序编写非常复杂的单元测试,而不会产生任何开销。Mockrunner不支持任何类型的容器内测试。


Mockrunner不会读取任何配置文件,例如web.xml或struts-config.xml。您可以使用Mockrunner API指定所有参数。因此,可以将servlet,过滤器,标签和Struts动作作为可重用组件进行测试,而不管您在一个或另一个应用程序中使用的设置如何。无法测试配置文件中的定义。如果要这样做,可以将StrutsTestCase用于基于Struts的应用程序或Cactus。


Mockrunner支持Java版本从1.3到1.6以及J2EE 1.3,J2EE 1.4和JavaEE5。尚不支持EJB 3.0。Mockrunner支持Struts版本1.1、1.2和1.3。


下载地址:Mockrunner download | SourceForge.net





最后:【可能给你带来帮助的教程】软件测试最新自学教程

使用MOCK对象进行单元测试

出了什么问题?      单元测试的目标是一次只验证一个方法 小步的前进 细粒度的测试 但是假如某个方法依赖于其他一些难以操控的东东 比如说网络连接 数据库连接 或者是Servlet容器 那么我们该怎么办呢?      要是你的测试依赖于系统的其他部分 甚至是系统的多个其他部分呢?在这种情况下 倘若不小心 你最终可能会发现自己几乎初始化了系统的每个组件 而这只是为了给一个测试创造足够的运行环境让它们可以运行起来 忙乎了大半天 看上去我们好像有点违背了测试的初衷了 这样不仅仅消耗时间 还给测试过程引入了大量的耦合因素 比如说 可能有人兴致冲冲地改变了一个接口或者数据库的一张表 突然 你那卑微的单元测试的神秘的挂掉了 在这种情况发生几次之后 即使是最有耐心的开发者也会泄气 甚至最终放弃所有的测试 那样的话后果就不能想像了    再让我们看一个更加具体的情况 在实际的面向对象软件设计中 我们经常会碰到这样的情况 我们在对现实对象进行构建之后 对象之间是通过一系列的接口来实现 这在面向对象设计里是最自然不过的事情了 但是随着软件测试需求的发展 这会产生一些小问题 举个例子 用户A现在拿到一个用户B提供的接口 他根据这个接口实现了自己的需求 但是用户A编译自己的代码后 想简单模拟测试一下 怎么办呢?这点也是很现实的一个问题 我们是否可以针对这个接口来简单实现一个代理类 来测试模拟 期望代码生成自己的结果呢?      幸运的是 有一种测试模式可以帮助我们 mock对象 Mock对象也就是真实对象在调试期的替代品

现在需要Mock对象吗?      关于什么时候需要Mock对象 Tim Mackinnon给我们了一些建议          真实对象具有不可确定的行为(产生不可预测的结果 如股票的行情)        真实对象很难被创建(比如具体的web容器)        真实对象的某些行为很难触发(比如网络错误)         真实情况令程序的运行速度很慢         真实对象有用户界面        测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)        真实对象实际上并不存在(当需要和其他开发小组 或者新的硬件系统打交道的时候 这是一个普遍的问题) 如何实现Mock对象?      使用mock对象进行测试的时候 我们总共需要 个步骤 分别是        使用一个接口来描述这个对象       为产品代码实现这个接口       以测试为目的 在mock对象中实现这个接口      在此我们又一次看到了针对接口编程的重要性了 因为被测试的代码只会通过接口来引用对象 所以它完全可以不知道它引用的究竟是真实的对象还是mock对象 下面看一个实际的例子 一个闹钟根据时间来进行提醒服务 如果过了下午 点钟就播放音频文件提醒大家下班了 如果我们要利用真实的对象来测试的话就只能苦苦等到下午五点 然后把耳朵放在音箱旁 我们可不想这么笨 我们应该利用mock对象来进行测试 这样我们就可以模拟控制时间了 而不用苦苦等待时钟转到下午 点钟了 下面是代码

public interface Environmental {    private boolean playedWav = false;    public long getTime();    public void playWavFile(String fileName);    public boolean wavWasPlayed();    public void resetWav();    }

真实的实现代码

public class SystemEnvironment implements Environmental {    public long getTime() {    return System currentTimeMillis();          }    public void playWavFile(String fileName) {             playedWav = true;          }    public boolean wavWasPlayed() {    return playedWav;          }    public void resetWav() {             playedWav = false;          }    }

下面是mock对象

public class MockSystemEnvironment implements Environmental {    private long currentTime;    public long getTime() {    return currentTime;          }    public void setTime(long currentTime) {    this currentTime = currentTime;          }    public void playWavFile(String fileName) {             playedWav = true;          }    public boolean wavWasPlayed() {    return playedWav;          }    public void resetWav() {             playedWav = false;          }    }

下面是一个调用getTime的具体类

import java util Calendar;     public class Checker {    private Environmental env;    public Checker(Environmental env) {    this env = env;          }    public void reminder() {             Calendar cal = Calendar getInstance();             cal setTimeInMills(env getTime());    int hour = cal get(Calendar HOUR_OF_DAY);    if(hour = ) {                env playWavFile( quit_whistle wav );             }          }    } 

使用env getTime()的被测代码并不知道测试环境和真实环境之间的区别 因为它们都实现了相同的接口 现在 你可以借助mock对象 通过把时间设置为已知值 并检查行为是否如预期那样来编写测试

import java util Calendar;    import junit framework TestCase;     public class TestChecker extends TestCase {    public void testQuittingTime() {                MockSystemEnvironment env = new MockSystemEnvironment();                Calendar cal = Calendar getInstance();                cal set(Calendar YEAR );                cal set(Calendar MONTH );                cal set(Calendar DAY_OF_MONTH );                cal set(Calendar HOUR_OF_DAY );  

cal set(Calendar MINUTE );    long t = cal getTimeInMillis();                env setTime(t );                Checker checker = new Checker(env);                checker reminder();                assertFalse(env wavWasPlayed());                 t += ( * * );                env setTime(t );                checker reminder();                assertTrue(env wavWasPlayed());                env resetWav();                t += * * * ;                env setTime(t );                checker reminder();               assertTrue(env wavWasPlayed());          }    }

 

这就是mock对象的全部 伪装出真实世界的某些行为 使你可以集中精力测试好自己的代码

好像有一些麻烦      如果每次都像上面那样自己写具体的mock对象 问题虽然解决了 但是好像有一些麻烦 不要着急 已经有一些第三方现成的mock对象供我们使用了 使用Mock Object进行测试 主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)从而使测试顺利进行的工具 目前 在Java阵营中主要的Mock测试工具有JMock MockCreator Mockrunner EasyMock MockMaker等 在微软的 Net阵营中主要是Nmock NetMock等       下面就以利用EasyMock模拟测试Servlet组件为例 代码如下       编译并将其当做一个Test Case运行 会发现两个测试方法均测试成功 我们可以看到easymock已经帮助我们实现了一些servlet组件的mock对象 这样我们就可以摆脱web容器和servlet容器来轻松的测试servlet了

import easymock *;    import junit framework *;    import javax servlet *;     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 );           //设置Mock HttpServletRequest的状态 //表示此Mock HttpServletRequest对象可以被使用          control replay();    //使用断言检查调用          assertEquals( kongxx mockRequest getParameter( name ));    //验证期望的调用          control verify();         }    }

编译并将其当做一个Test Case运行 会发现两个测试方法均测试成功 我们可以看到easymock已经帮助我们实现了一些servlet组件的mock对象 这样我们就可以摆脱web容器和servlet容器来轻松的测试servlet了

底层技术是什么?      让我们来回忆一下 如果用户使用C++和java的程序的生成 C++在最后的阶段还需要连接才能生成一个整体程序 这在灵活性与java源代码的机制是不能比的 java的各个类是独立的 打包的那些类也是独立的 只有在加载进去才进行连接 这在代码被加载进去的时候 我们还可以执行很多的动作 如插入一些相关的业务需求 这也是AOP的一个焦点 javassit代码库的实现类似于这 正是利用这些 所以用java实现Mock对象是很简单的

lishixinzhi/Article/program/Java/JSP/201311/19222

关于mock工具测试web程序和mock测试的使用场景的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 mock工具测试web程序的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mock测试的使用场景、mock工具测试web程序的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:常见的浏览器Hack技巧整理
下一篇:Java IO 之文件读写简单实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~