1. 程式人生 > >比較複雜的一個mock測試

比較複雜的一個mock測試

其中測試物件:
特別注意:
api_res = self.cache_api_wrapper.get_api(self.network_api_svc.network_whole_features, company_name)
與以前的直接通過呼叫api獲取網路圖特徵不同,此處外面還加了多程序get_api函式;
直接呼叫它會報錯!

def get_api(self, function, *params):
        """
        多web程序之間的api(排程、快取)管理
        """
        key = self.__cache_api.func_and_params_2_key(function, params)
        if
self.__redis_helper.exists(key): # 有快取讀取快取 return self.__get_redis_value(key) else: # redis無快取處理 if self.__token_cache_db.try_add(key): # 成功獲取到呼叫api令牌 api_data = self.__cache_api.get_api(function, *params) self.__token_cache_db.delete_by_token_string(key) return
api_data else: # 未獲取到api令牌等阻塞讀取到redis 快取為止 second_count = 0 while True: second_count += 1 if self.__redis_helper.exists(key): # 快取已經成功 self.__token_cache_db.delete_by_token_string(key) return
self.__get_redis_value(key) if second_count >= 100: # 超過等待時間重新api獲取 self.__token_cache_db.delete_by_token_string(key) return self.__cache_api.get_api(function, *params) sleep(1)

測試物件,mock物件:


class NetworkFeaturesSingle(object):
    """
    網路圖特徵資料收集封裝 -- 單一節點
    """
    network_api_svc = NetworkApiSvc()
    cache_api_wrapper = CacheApiWrapper()

    def get_features(self, company_name):
        """
        獲取網路圖特徵
        """

        api_res = self.cache_api_wrapper.get_api(self.network_api_svc.network_whole_features, company_name)

        network_dto = NetworkFeatureDto()

        network_dto.network_share_cancel_cnt = api_res.get('shareOrPosRevokedCnt', 0)
        network_dto.cancel_cnt = api_res.get('frRevokedCnt', 0)
        network_dto.fr_zhi_xing_cnt = api_res.get('frZhixingCnt', 0)
        network_dto.network_share_zhixing_cnt = api_res.get('shareOrPosZhixingCnt', 0)
        network_dto.network_share_judge_doc_cnt = api_res.get('shareOrPosJudgeDocCnt', 0)
        network_dto.net_judgedoc_defendant_cnt = api_res.get('allLinkJudgedocCnt', 0)
        network_dto.judge_doc_cnt = api_res.get('frJudgedocCnt', 0)

        return network_dto

測試指令碼,寫法1:
報錯:AttributeError: _name_

from unittest import TestCase

import mock

from api.network_api_svc import NetworkApiSvc
from biz.biz_utils.cache_api import CacheApi
from biz.integration_api.common.network_features_single import NetworkFeaturesSingle
from common.helper.test_helper import TestHelper
from test.test_clean.test_common.test_utils import TestUtils

class TestNetworkFeaturesSingle(TestCase):
    t_h = TestHelper()
    t_u = TestUtils()

    def tearDown(self):
        CacheApi.REFRESH_CACHE = False

    @mock.patch.object(NetworkApiSvc, 'network_whole_features')
    def test_get_features(self, network_whole_features):
        # given
        network_whole_features.return_value = self.__get_api_value()
        n_f_w = NetworkFeaturesSingle()
        company_name = u'測試公司'
        # when
        network_dto = n_f_w.get_features(company_name)
        # then
        self.assertEqual(1, network_dto.network_share_judge_doc_cnt)
        self.assertEqual(2, network_dto.judge_doc_cnt)
        self.assertEqual(3, network_dto.network_share_cancel_cnt)
        self.assertEqual(4, network_dto.cancel_cnt)
        self.assertEqual(5, network_dto.network_share_zhixing_cnt)
        self.assertEqual(6, network_dto.net_judgedoc_defendant_cnt)
        self.assertEqual(7, network_dto.fr_zhi_xing_cnt)

    def test_get_features_no_mock(self):
        # given
        n_f_w = NetworkFeaturesSingle()
        company_name = u'小米科技有限責任公司'
        # when
        network_dto = n_f_w.get_features(company_name)
        # then
        self.t_u.print_domain(network_dto)
        assert network_dto

    @staticmethod
    def __get_api_value():
        return {
            u'shareOrPosJudgeDocCnt': 1,
            u'frJudgedocCnt': 2,
            u'shareOrPosRevokedCnt': 3,
            u'frRevokedCnt': 4,
            u'shareOrPosZhixingCnt': 5,
            u'allLinkJudgedocCnt': 6,
            u'frZhixingCnt': 7
        }

測試指令碼,寫法2:

from unittest import TestCase

import mock

from api.network_api_svc import NetworkApiSvc
from biz.biz_utils.cache_api import CacheApi
from biz.integration_api.common.network_features_single import NetworkFeaturesSingle
from common.helper.test_helper import TestHelper
from test.test_clean.test_common.test_utils import TestUtils


class TestNetworkFeaturesSingle(TestCase):
    t_h = TestHelper()
    t_u = TestUtils()

    def tearDown(self):
        CacheApi.REFRESH_CACHE = False

    @mock.patch.object(NetworkApiSvc, 'network_whole_features')
    def test_get_features(self, network_whole_features):
        # given
        company_name = u'測試公司'
        self.t_h.set_api_return_value(locals(),network_whole_features, company_name, self.__get_api_value())
        n_f_w = NetworkFeaturesSingle()
#註釋:locals()返回在它之前的所有區域性變數,mock的network_whole_features以及company_name
        # when
        network_dto = n_f_w.get_features(company_name)
        # then
        self.assertEqual(1, network_dto.network_share_judge_doc_cnt)
        self.assertEqual(2, network_dto.judge_doc_cnt)
        self.assertEqual(3, network_dto.network_share_cancel_cnt)
        self.assertEqual(4, network_dto.cancel_cnt)
        self.assertEqual(5, network_dto.network_share_zhixing_cnt)
        self.assertEqual(6, network_dto.net_judgedoc_defendant_cnt)
        self.assertEqual(7, network_dto.fr_zhi_xing_cnt)

**local()用法:**
**locals() 函式會以字典型別返回當前位置的全部區域性變數。**
對於函式, 方法, lambda 函式, 類, 以及實現了 __call__ 方法的類例項, 它都返回 True
>>>def runoob(arg):    # 兩個區域性變數:arg、z
...     z = 1
...     print (locals())
... 
>>> runoob(4)
{'z': 1, 'arg': 4}      # 返回一個名字/值對的字典
>>>

 當前locals()返回的是:
 {'network_whole_features': <MagicMock name='network_whole_features' id='140258690673808'>, 'company_name': u'\u6d4b\u8bd5\u516c\u53f8', 'self': <test_networkFeaturesSingle.TestNetworkFeaturesSingle testMethod=test_get_features>}
 //////////////////////////////////////////////
    def test_get_features_no_mock(self):
        # given
        n_f_w = NetworkFeaturesSingle()
        company_name = u'小米科技有限責任公司'
        # when
        network_dto = n_f_w.get_features(company_name)
        # then
        self.t_u.print_domain(network_dto)
        assert network_dto

    @staticmethod
    def __get_api_value():
        return {
            u'shareOrPosJudgeDocCnt': 1,
            u'frJudgedocCnt': 2,
            u'shareOrPosRevokedCnt': 3,
            u'frRevokedCnt': 4,
            u'shareOrPosZhixingCnt': 5,
            u'allLinkJudgedocCnt': 6,
            u'frZhixingCnt': 7
        }
增加的類函式:
    def set_api_return_value(self, local_vars, api, company_name, return_value):
        """
        用於 mock 測試的 api 呼叫 -- 支援  Redis快取
        :param local_vars: 通過 locals() 取得
        :param api: 要呼叫的api
        :param company_name: 公司名
        :param return_value: 需要作為存根的資料
        """
        api.return_value = return_value
        redis_helper = RedisHelper()
        api_name = self.__get_variable_name(local_vars, api)
        redis_helper.delete(api_name + u'__' + company_name)
        api.__name__ = api_name

    @staticmethod
    def __get_variable_name(local_vars, x):
        """
        獲取變數的字串名
        :param local_vars:  通過 locals() 取得
        :param x: 需要獲取字串名的變數
        """
        for k, v in local_vars.items():
            if v is x:
                return k

相關推薦

比較複雜一個mock測試

其中測試物件: 特別注意: api_res = self.cache_api_wrapper.get_api(self.network_api_svc.network_whole_features, company_name) 與以前的直接通過呼叫ap

Mock測試工具比較

Java Mock測試工具比較 最近,在做一個Java Web的專案,專案中需要整合一套Mock測試工具。隨即對市面上的mock測試工具進行了調研,下面是調研結果。其中,mock測試工具分為單元測試級別的mock工具和介面測試級別的mock工具。 1.單元測試級別的mock工具

一個比較複雜的sql

declare @statTime datetime, @endTime datetime set @statTime = dateadd(hh,datediff(hh,0,getdate())-1,0) set @endTime = dateadd(hh,datedif

Mock測試SpringMvc Controller 層的例子.

result write framework pes fast cnblogs json http java spring version : 4.1.6.RELEASE Junit version : 2.4.5 package com.shiji.soc.es.con

做了一個網站 測試一下營銷效果外匯VPS

詳細 美國 blank 最快 機房 vps bsp 營銷 法國 外匯VPS 專註於提供掛EA的VPS 機房位於美國芝加哥與法國歐洲機房。 提供給EA交易者最快的響應速度。 MT4VPS 外匯VPS EAVPS 回頭詳細描述一下效果做了一個網站 測試一下營銷效果

Mockito-部分mock測試使用

tdd list except verify oid equal case important moc 什麽是類的部分mock(partial mock)?A:部分mock是說一個類的方法有些是實際調用,有些是使用mockito的stubbing(樁實現)。 為什麽

使用Python編寫一個滲透測試探測器

python本篇將會涉及:資源探測一個有用的字典資源第一個暴力探測器資源探測資源探測在滲透測試中還是屬於資源的映射和信息的收集階段。 主要有以下三個類型:字典攻擊暴力破解模糊測試字典攻擊,在破解密碼或密鑰的時候,通過自定義的字典文件,有針對性地嘗試字典文件內所有的字典組合。暴力破解,也叫做窮舉法,按照特定的組

SpringMVC mock測試詳解

builder efault url perf 配置 public ctc tle pub @RunWith(SpringRunner.class) @SpringBootTest(classes = WebmanagerApplication.class) //配置事務

測試工具之Jmeter(創建一個簡單測試用例)

管理器 view time http ati 測試用例 停止 調度器 until 前面介紹了如何使用badboy錄制jmeter腳本,以及如何導入腳本並進行測試 這裏介紹下手動創建測試用例,主要步驟如下: 1、創建線程組 第一次打開Jmeter只有一個測試計劃,右鍵

基於Python Django開發的一個mock

csr att project dump 方便 配置 man ali uid 最近研究了一下python的django框架, 發現這個框架不比Java spring boot差, mock同樣一個接口, 代碼量少很多, 維護起來也很方便, 廢話不多說,直接上代碼 1. 安裝

【10.21總結】一個滲透測試練習例項——發現未知的漏洞(Race condition)

Write-up地址:Exploiting an unknown vulnerability 作者:Abhishek Bundela   這篇文章跟我之前看到的文章不太一樣,作者是按照一個練習的方式簡單描述了他對一個應用進行滲透測試的過程,其中提到的許多測試雖然沒有成功,但是對於像我這樣的菜鳥來說還是有很

mock測試方法及實踐改進

此文已由作者翟曜授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。    mock測試常見的定義為:在測試過程中,對於某些不易構造或不易獲取的物件,通過建立虛擬物件的方式來模擬測試的測試方法。    提到mock測試工具,java領域內可能首先想

一個Appium測試啟動亞馬遜應用程式

最後,時間到了,我們將編寫第一個Appium Test來啟動Amazon App。這將包括以下步驟: 啟動Appium節點伺服器 建立第一個測試指令碼 執行第一次測試   啟動Appium節點伺服器 1)我希望您的Appium 視窗

一個南下測試工程師深三年之行

  天津之行       這裡簡單介紹一下,本人於2012年就讀於與老家鄂州隔江相望的一個城市黃岡現名黃州一所職業學院“黃岡職業技術學院”,在封閉式學校就讀2年期間,學習猶如滑稽之談,眼裡沒有學習,只想按照父母的意願讀完一個學

關於pagehelper-spring-boot-starter排序的一個測試

關於pagehelper-spring-boot-starter排序的一個小測試   1. 依賴和配置資訊 <dependency>     <groupId>com.github.pagehelper</groupId> &n

java字串常量池——字串==比較一個誤區

轉自:https://blog.csdn.net/wxz980927155/article/details/81712342     起因 再一次js的json物件的比較中,發現相同

用c實現一個壓力測試工具

#include <stdlib.h> #include <stdio.h> #include <assert.h> #include <unistd.h> #include <sys/types.h> #include <sys/e

Jmeter建立一個web測試計劃

下載Jmeter 下載地址:http://jmeter.apache.org/download_jmeter.cgi 下載後解壓到你想“安裝”的路徑下,比如: D:\Program Files (x86)\Jemter\apache-jmeter-2.11

比較複雜的sql面試題

一、分組統計每個班的分數前三名(等同於LeetCode:185. Department Top Three Salaries) 表結構: create table student( id varchar(20),-- 編號 class varchar(20),-- 年級 sc

Mock測試Zookeeper異常(ClassCastException: class sun.security.provider.ConfigFile)

15:19:39.711 14531 [main-SendThread(10.x.x.x:2181)] WARN o.a.zookeeper.ClientCnxn - Session 0x0 for