51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2914|回复: 1
打印 上一主题 下一主题

python Mock 使用

[复制链接]
  • TA的每日心情
    郁闷
    2016-5-14 16:08
  • 签到天数: 60 天

    连续签到: 3 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2016-3-18 17:03:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。类似于Hot Pat[size=1em]class Mock(spec[size=1em]=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, **kwargs)class Mock的参数
    先来看看Mock这个类的参数,在上面看到的类定义中,我们知道它有好几个参数,这里介绍最主要的几个:
    • name: 这个是用来命名一个mock对象,只是起到标识作用,当你print一个mock对象的时候,可以看到它的name。
    • return_value: 这个字段可以指定一个值(或者对象),当mock对象被调用时,如果side_effect函数返回的是DEFAULT,则对mock对象的调用会返回return_value指定的值。
    • side_effect: 这个参数指向一个可调用对象,一般就是函数。当mock对象被调用时,如果该函数返回值不是DEFAULT时,那么以该函数的返回值作为mock对象调用的返回值。

    几种常见的场景
    1. Mock一个函数  @mock.patch('function_name')
    2. Mock Mock一个对象里面的方法  @mock.patch.object(class, 'function_name')
    3. 让Mock的函数每次被调用返回不同的值,而1,2中的方法每次调用都会返回同样的值  --side-effect= []  (序列)
    4. 让Mock的函数抛出exception   --side-effect=side_effect = Exception
    5. Mock多个函数,主要是注意顺序  (patch顺序和函数参数顺序相反)


    patch.objectpatch , with 用法 举例


    @patch
    def test_success_request(mock_send_request):
        mock_send_request.return_value = "200"
        assert_equal(client.visit_ustack(), '200')
        assert_true(True,mock_send_request.assert_has_calls)
        call_args = mock_send_request.call_args
        print(call_args)
        assert_is_instance(call_args[0][0], str)

    @patch.object
    @patch.object(client,'send_request')
    def test_fail_request2(mock_request):
        mock_request.return_value = "404"
        assert_equal(client.visit_ustack(), '404')


    with patch & with patch.object
    def test_success_request1():
        status_code = "404"
        mock_request = mock.Mock(return_value=status_code)
       
        with patch('client.send_request', mock_request):
            assert_equal(client.visit_ustack(), status_code)

    def test_success_request2():
        status_code = '200'
        mock_request = mock.Mock(return_value=status_code)

        with patch.object(client, 'send_request', mock_request):
            assert_equal(client.visit_ustack(), status_code)



    参考文档:
       http://www.blogjava.net/qileilove/archive/2014/05/27/414143.html
       https://segmentfault.com/a/1190000002965620








    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-8-10 13:25
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2016-8-10 11:22:23 | 只看该作者
    谢谢分享   学习python中      
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-3 11:20 , Processed in 0.069496 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表