第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python中單元測試的局部變量以驗(yàn)證測試函數(shù)的功能

python中單元測試的局部變量以驗(yàn)證測試函數(shù)的功能

侃侃爾雅 2021-08-11 23:44:18
我是單元測試和 python 的新手。我開始在 python 中對不同的模塊(用 c 開發(fā))進(jìn)行單元測試。在某些情況下,我發(fā)現(xiàn)該函數(shù)不會返回任何值并且不會修改任何全局變量的值。在這種情況下,我將如何根據(jù)一些局部變量值驗(yàn)證函數(shù)的功能。由于 local 在函數(shù)外部不可用,我無法驗(yàn)證局部變量的值。單元測試這些功能的正確方法應(yīng)該是什么?我已經(jīng)瀏覽了下面的鏈接來詢問這個問題,它說我們不應(yīng)該對局部變量執(zhí)行單元測試。
查看完整描述

1 回答

?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個贊

在 python 中沒有“開箱即用”的解決方案,盡管我堅信在開發(fā)更高級的測試時能夠模擬和檢查局部變量發(fā)生的情況非常重要。我已經(jīng)用一個新類來模擬一個函數(shù)并獲取本地值,我希望它對你有所幫助。


import inspect

from textwrap import dedent

import re



class MockFunction:

    """ Defines a Mock for functions to explore the details on their execution.

    """

    def __init__(self, func):

        self.func = func


    def __call__(mock_instance, *args, **kwargs):

        # Add locals() to function's return

        code = re.sub('[\\s]return\\b', ' return locals(), ', dedent(

            inspect.getsource(mock_instance.func)))

        code = code + f'\nloc, ret = {mock_instance.func.__name__}(*args, **kwargs)'

        loc = {'args': args, 'kwargs': kwargs}

        exec(code, mock_instance.func.__globals__, loc)

        # Put execution locals into mock instance

        for l,v in loc['loc'].items():

            setattr(mock_instance, l, v)

        return loc['ret']

要使用它:


import unittest

from unittest import mock


# This is the function you would like to test. It can be defined somewhere else

def foo(param_a, param_b=10):

    param_a = f'Hey {param_a}'  # Local only

    param_b += 20  # Local only 

    return 'bar'


# Define a test to validate what happens to local variables when you call that function

class SimpleTest(unittest.TestCase):


    @mock.patch(f'{__name__}.foo', autospec=True, side_effect=MockFunction(foo))

    def test_foo_return_and_local_params_values(self, mocked):

        ret = foo('A')

        self.assertEqual('Hey A', mocked.side_effect.param_a)

        self.assertEqual(30, mocked.side_effect.param_b)

        self.assertEqual('bar', ret)

正如我們所見,您可以使用模擬函數(shù)中的 side_effect 檢查局部變量發(fā)生了什么。


查看完整回答
反對 回復(fù) 2021-08-11
  • 1 回答
  • 0 關(guān)注
  • 273 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號