精华内容
下载资源
问答
  • import pytest import requests def test_requests_mock(requests_mock): requests_mock.get('http://demo.com', text='data') assert requests.get('http://demo.com').text == 'data' ...



    基本使用

    import pytest
    import requests
    
    
    def test_requests_mock(requests_mock):
        requests_mock.get('http://demo.com', text='data')
        assert requests.get('http://demo.com').text == 'data'
    
    

    https://requests-mock.readthedocs.io/en/latest/pytest.html



    有无 params 区别

    # import stuff ...
    
    def test_requests_mock_requests_get_with_params(requests_mock):
        requests_mock.get("http://demo.com", text='data')
        assert requests.get('http://demo.com', params={'foo': 'bar'}).text == 'data'
    
    def test_requests_mock_set_get_params(requests_mock):
        requests_mock.get('http://demo.com?page_size=1&page_num=10', text='data')
        assert requests.get('http://demo.com', params={'page_size': 1, 'page_num': 10}).text == 'data'
        assert requests.get('http://demo.com', params={'page_size': 2, 'page_num': 10}).text == 'anything'
    
    

    第一个测试通过;第二个测试失败!



    Reference

    展开全文
  • pytest mock的使用

    2020-12-30 22:58:52
    import mock def add(a, b): return a + b # 使用mock的return_value参数改变add返回的数据 @mock.patch('add', return_value=10) def test_add(): print(add(1, 2)) # 10 方法二,使用mock.path方法。import ...

    简单使用return_value返回固定的数据

    • 方法一,使用装饰器。
      import mock
      def add(a, b):
          return a + b
      
      
      # 使用mock的return_value参数改变add返回的数据
      @mock.patch('add', return_value=10)
      def test_add():
          print(add(1, 2))  # 10
      
    • 方法二,使用mock.path方法。
      import mock
      def test_add():
          with mock.patch('add', return_value=10):
              print(add(1, 2)) # 10
      

    使用side_effect返回可变的数据

    • 当一个方法被同一个测试调用多次,而自己又不想得到同一个返回值,就轮到side_effect上场了。
    • 依次返回list里的数据。
      # 方法一
      @mock.patch('add', side_effect=[10, 20])
      def test_add():
          print(add(1, 2))  # 10
          print(add(1, 2))  # 20
      
      # 方法二
      def test_add():
          with mock.patch('add', side_effect=[10, 20]):
              print(add(1, 2))  # 10
              print(add(1, 2))  # 20
      
    • 根据传入的参数返回指定的数据。
      # 方法一
      @mock.patch('add', side_effect={(1, 2): 10, (2, 3): 20})
      def test_add():
          print(add(2, 3))  # 20
          print(add(1, 2))  # 10
      
      # 方法二
      def test_add():
          with mock.patch('add', side_effect={(1, 2): 10, (2, 3): 20}):
              print(add(2, 3))  # 20
              print(add(1, 2))  # 10
      
    展开全文
  • Pytest - 高级进阶mock

    千次阅读 2019-02-12 11:50:03
    在Python中这种测试是通过第三方的mock库完成的,mock在Python3.3的时候被引入到Python标准库中,改名为unittest.mock。之前的Python版本都需要安装:pip install mock 初学者理解mock比较抽象,可以简单理...

    1. 概述

    Mock测试是在测试过程中对可能不稳定、有副作用、不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便完成测试的方法。在Python中这种测试是通过第三方的mock库完成的,mock在Python3.3的时候被引入到Python标准库中,改名为unittest.mock。之前的Python版本都需要安装:pip install mock

    初学者理解mock比较抽象,可以简单理解为函数指针,通过mock成员方法或变量,可以指定mock对象的返回值,获取是否被调用、被调用次数、调用时的参数等。

    2. 使用方法

    2.1. 简介

    • 在test方法前,添加decorator @mock.patch('pyfile.func', return_value='None'),可以完成对pyfile.func的mock,并指定return_value为‘None’,在test方法的参数中增加mock_func即可
    • 单个test方法引用多个mock.patch decorator时,patch从下向上,test方法的参数从左向右,依次对应(可以有剩余的参数,但是必学是已经声明的fixture),样例如下
    @mock.patch('os.remove')
    @mock.patch('os.listdir')
    @mock.patch('shutil.copy')
    def test_unix_fs(mocked_copy, mocked_listdir, mocked_remove):
        UnixFS.rm('file')
        os.remove.assert_called_once_with('file')
    
        assert UnixFS.ls('dir') == expected
        # ...
    
        UnixFS.cp('src', 'dst')
        # ...
    

    2.2. 示例代码

    pytest2.py

    # -*- coding:utf-8 -*-
    import pytest
    import mock
    
    @pytest.fixture(scope='function', params=[1, 2, 3])    # multiple test cases
    def mock_data_params(request):
        return request.param
    
    def test_not_2(mock_data_params):
        print('test_data: %s' % mock_data_params)
        assert mock_data_params != 2
    
    ##################
    
    def _call(x):
        return '{} _call'.format(x)
    
    def func(x):
        return '{} func'.format(_call(x))
    
    def test_func_normal():
        for x in [11, 22, 33]:                          # multiple test cases
            # print '{} - {}'.format(x, func(x))
            assert func(x) == '{} _call func'.format(x)
    
    @mock.patch('pytest2._call', return_value='None')   # set mock 'pytest2._call'.return_value is 'None', also could use mock_call.return_value='None'
    def test_func_mock(mock_call):
        for x in [11, 22, 33]:
            # print '{} - {}'.format(x, func(x))
            ret = func(x)
            assert mock_call.called                 # True or False
            assert mock_call.call_args == ((x,),)   # This is either None (if the mock hasn’t been called), or the arguments that the mock was last called with
            assert ret == 'None func'               # because mock_call.return_value is 'None', so the result here is 'None func'
    
    

    如何获取mock方法的调用次数和参数数据

    • mock_call.called # True or False

    • mock_call.call_args # This is either None (if the mock hasn’t been called), or the arguments that the mock was last called with

    • mock_call.return_value

       

      image.png

    • mock_call.side_effect # This can either be a function to be called when the mock is called, an iterable or an exception (class or instance) to be raised

       

      image.png

    详细内容参考官网

    2.3. 执行结果

    通过fixture的param功能,完成多用例测试

    $ pytest -v pytest2.py::test_not_2
    ============================================================================== test session starts ===============================================================================
    platform linux2 -- Python 2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1 -- /home/kevin/soft/anaconda2/bin/python
    cachedir: .cache
    Using --randomly-seed=1522926920
    rootdir: /home/kevin/learn/python-web/tox/case2, inifile:
    plugins: randomly-1.0.0, mock-1.2, cov-2.0.0
    collected 3 items
    
    pytest2.py::test_not_2[3] PASSED
    pytest2.py::test_not_2[2] FAILED
    pytest2.py::test_not_2[1] PASSED
    
    ==================================================================================== FAILURES ====================================================================================
    _________________________________________________________________________________ test_not_2[2] __________________________________________________________________________________
    
    mock_data_params = 2
    
        def test_not_2(mock_data_params):
            print('test_data: %s' % mock_data_params)
    >       assert mock_data_params != 2
    E       assert 2 != 2
    
    pytest2.py:10: AssertionError
    ------------------------------------------------------------------------------ Captured stdout call ------------------------------------------------------------------------------
    test_data: 2
    ============================================================================= pytest-warning summary =============================================================================
    WC1 None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0.  Please remove the prefix and use the @pytest.fixture decorator instead.
    ============================================================= 1 failed, 2 passed, 1 pytest-warnings in 0.02 seconds ==============================================================
    

    在test方法中通过循环dataset完成多用例测试

    $ pytest -vs pytest2.py::test_func_normal
    ============================================================================== test session starts ===============================================================================
    platform linux2 -- Python 2.7.12, pytest-3.0.0, py-1.5.2, pluggy-0.3.1 -- /usr/bin/python
    cachedir: .cache
    Using --randomly-seed=1522930543
    rootdir: /home/kevin/learn/python-web/tox/case2, inifile:
    plugins: xdist-1.15.0, randomly-1.0.0, mock-1.2, cov-2.0.0, celery-4.0.1
    collected 6 items
    
    pytest2.py::test_func_normal PASSED
    
    ============================================================================= pytest-warning summary =============================================================================
    WC1 None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0.  Please remove the prefix and use the @pytest.fixture decorator instead.
    ================================================================== 1 passed, 1 pytest-warnings in 0.01 seconds ===================================================================
    

    通过mock,构造虚拟函数的调用

    $ pytest -vs pytest2.py::test_func_mock
    ============================================================================== test session starts ===============================================================================
    platform linux2 -- Python 2.7.12, pytest-3.0.0, py-1.5.2, pluggy-0.3.1 -- /usr/bin/python
    cachedir: .cache
    Using --randomly-seed=1522930553
    rootdir: /home/kevin/learn/python-web/tox/case2, inifile:
    plugins: xdist-1.15.0, randomly-1.0.0, mock-1.2, cov-2.0.0, celery-4.0.1
    collected 6 items
    
    pytest2.py::test_func_mock PASSED
    
    ============================================================================= pytest-warning summary =============================================================================
    WC1 None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0.  Please remove the prefix and use the @pytest.fixture decorator instead.
    ================================================================== 1 passed, 1 pytest-warnings in 0.00 seconds ===================================================================
    

    3. 参考



    转自:https://www.jianshu.com/p/36128049fefc
     

    展开全文
  • pytest-mock:模拟程序包周围的薄包装器,可以更方便地与pytest一起使用
  • python ----pytest_mock学习总结

    千次阅读 2020-08-27 19:29:05
    官方文档中对pytest_mock的介绍,使用方法类似unittest.mock,他们具有相同的api和参数 官方文档:https://pypi.org/project/pytest-mock/ 导图 代码样例: common包内的mock_data.py import requests ...

    最近做接口自动化测试的时候,针对第三方接口,想通过mock形式实现,网上大多资料都是关于unittest.mock的方法。

    本文主要总结利用pytest_mock实现模拟过程

    官方文档中对pytest_mock的介绍,使用方法类似unittest.mock,他们具有相同的api和参数

    官方文档:https://pypi.org/project/pytest-mock/

    unittest.mock的中文官方文档:https://docs.python.org/zh-cn/dev/library/unittest.mock.html

    导图

    代码样例:

    common包内的mock_data.py

    
    import requests
    class PaymentType():
        def payapi(self):
            url = 'http://..........'
            headers = '{"Content-Type
    展开全文
  • Mock可以用来替换系统中某个部分以隔离要测试的代码,Mock对象有时被称为stub、替身,借助mock包和pytest自身的monkeypatch可以实现所有的模拟测试,从python3.3开始mock开始成为python标准库unittest.mock的一部分...
  • 并且pytest-mock进行高层次的封装,用起来更加方便。安装包: pip3 install pytest-mock 2.1.小试牛刀 直接采用类似官方的例子,我们代码中要使用os.getcwd获取当前工作目录。只是我们的代码是在windows系统上,...
  • 前面我们讨论了pytest-mock,给模块mock的使用方法。当时还列举了两个问题,如何给对象的属性进行mock,以及如何同一个地方进行mock,避免每个测试用例单独mock,我们现在来看看这两个问题。 2.方案 2.1.给对象属性...
  • utittest和pytestmock的使用详细介绍

    千次阅读 2021-09-15 16:23:04
    Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。 python3.3 以前,mock是第三方库,需要安装之后才能使用。python3.3之后,mock作为标准库内置...
  • pytest-mock, 在模拟包周围包装包装,以便与 py.test 一起使用 pytest模拟插件安装了一个在模拟包提供的补丁API周围的精简包装器,但在测试结束时不需要担心撤销补丁:import osclass UnixFS: @staticmethod def rm...
  • pytest

    千次阅读 2018-07-27 16:27:28
    pip install pytest 2.    pytest 可以运行doctests和unittests 3.    运行pytest def test_numbers_3_4(): print 't...
  • Monkeypatching,对模块和环境进行Mock 有时,测试需要调用依赖于全局设置的函数,或调用无法轻松测试的代码(如网络访问)。 monkeypatch fixture可帮助你安全地设置/删除属性,字典项或环境变量,或修改sys.path以进行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,218
精华内容 487
关键字:

mockpytest