Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az egységtesztelés a modern szoftverfejlesztési eljárások fontos része. Az egységtesztek ellenőrzik az üzleti logika viselkedését, és védelmet nyújtanak a jövőbeni észrevétlen kompatibilitástörő változások bevezetésével szemben. A Durable Functions könnyen válhat összetettebbé, ezért az egységtesztek bevezetése segít elkerülni a megszakító változásokat. A következő szakaszok a három függvénytípus – vezénylési ügyfél, vezénylő és entitásfüggvény – egységtesztelését ismertetik.
Megjegyzés:
Ez az útmutató csak a Python v2 programozási modellben írt Durable Functions-alkalmazásokra vonatkozik.
Előfeltételek
A cikkben szereplő példák a következő fogalmak és keretrendszerek ismeretét igénylik:
- Egységtesztelés
- Tartós funkciók
- Python-egységteszt
- unittest.mock
A tesztkörnyezet beállítása
A Durable Functions teszteléséhez elengedhetetlen a megfelelő tesztkörnyezet beállítása. Ebbe beletartozik egy tesztkönyvtár létrehozása és a Python moduljának unittest telepítése a Python-környezetbe. További információkért tekintse meg az Azure Functions Python-egységtesztelési áttekintését.
Egységtesztelési triggerfüggvények
A triggerfüggvények, amelyeket gyakran ügyfélfüggvényeknek neveznek, vezényléseket és külső eseményeket kezdeményeznek. Ezeknek a függvényeknek a teszteléséhez:
- Szimulálja a
DurableOrchestrationClientvezénylés végrehajtását és az állapotkezelést. - Kövesse az alábbi
DurableOrchestrationClientmetódusokat, mint például azstart_new,get_status, vagyraise_event, kitalált függvényekkel, amelyek a várt értékeket adják vissza. - Hívja meg közvetlenül az ügyfélfüggvényt egy szimulált ügyféllel és más szükséges bemenetekkel, például a
req(HTTP-kérésobjektummal) HTTP trigger ügyfélfüggvényekhez. - Az állításokat és
unittest.mockeszközöket használja az orchestráció indításának várható viselkedésének, paramétereinek és HTTP-válaszainak ellenőrzésére.
import asyncio
import unittest
import azure.functions as func
from unittest.mock import AsyncMock, Mock, patch
from function_app import start_orchestrator
class TestFunction(unittest.TestCase):
@patch('azure.durable_functions.DurableOrchestrationClient')
def test_HttpStart(self, client):
# Get the original method definition as seen in the function_app.py file
func_call = http_start.build().get_user_function().client_function
req = func.HttpRequest(method='GET',
body=b'{}',
url='/api/my_second_function',
route_params={"functionName": "my_orchestrator"})
client.start_new = AsyncMock(return_value="instance_id")
client.create_check_status_response = Mock(return_value="check_status_response")
# Execute the function code
result = asyncio.run(func_call(req, client))
client.start_new.assert_called_once_with("my_orchestrator")
client.create_check_status_response.assert_called_once_with(req, "instance_id")
self.assertEqual(result, "check_status_response")
Egységtesztelési összehangoló függvények
Az Orchestrator függvények több tevékenységfüggvény végrehajtását kezelik. Vezénylő tesztelése:
- Mockolja le a
DurableOrchestrationContextaz függvény futtatásának vezérléséhez. - Cserélje le a vezényléshez szükséges metódusokat, mint például
DurableOrchestrationContextvagycall_activity, helyettesítő függvényekkel. Ezek a függvények általában TaskBase típusú objektumokat ad vissza egyresulttulajdonsággal. - Hívja meg az orchestrátort rekurzívan, és adja át az előző yield utasítás által létrehozott feladat eredményét a következőnek.
- Ellenőrizze a vezénylőtől és a
unittest.mockkapott eredményeket.
import unittest
from unittest.mock import Mock, patch, call
from datetime import timedelta
from azure.durable_functions.testing import orchestrator_generator_wrapper
from function_app import my_orchestrator
class TestFunction(unittest.TestCase):
@patch('azure.durable_functions.DurableOrchestrationContext')
def test_chaining_orchestrator(self, context):
# Get the original method definition as seen in the function_app.py file
func_call = my_orchestrator.build().get_user_function().orchestrator_function
# The mock_activity method is defined above with behavior specific to your app.
# It returns a TaskBase object with the result expected from the activity call.
context.call_activity = Mock(side_effect=mock_activity)
# Create a generator using the method and mocked context
user_orchestrator = func_call(context)
# Use orchestrator_generator_wrapper to get the values from the generator.
# Processes the orchestrator in a way that is equivalent to the Durable replay logic
values = [val for val in orchestrator_generator_wrapper(user_orchestrator)]
expected_activity_calls = [call('say_hello', 'Tokyo'),
call('say_hello', 'Seattle'),
call('say_hello', 'London')]
self.assertEqual(context.call_activity.call_count, 3)
self.assertEqual(context.call_activity.call_args_list, expected_activity_calls)
self.assertEqual(values[3], ["Hello Tokyo!", "Hello Seattle!", "Hello London!"])
Egységtesztelés entitásfüggvényekkel
Az entitásfüggvények állapotalapú objektumokat kezelnek műveletekkel. Entitásfüggvény tesztelése:
- Szimulálja az
DurableEntityContextentitás belső állapotát és műveleti bemeneteit. - Cserélje le a
DurableEntityContextmetódusokat, mint például aget_state,set_stateésoperation_name, olyan mockokra, amelyek szabályozott értékeket adnak vissza. - Az entitásfüggvényt közvetlenül a mockolt kontextussal hívd meg.
- Az állapotváltozások és a visszaadott értékek, valamint
unittest.mocka segédprogramok ellenőrzéséhez használjon állításokat.
import unittest
from unittest.mock import Mock, patch
from function_app import Counter
class TestEntityFunction(unittest.TestCase):
@patch('azure.durable_functions.DurableEntityContext')
def test_entity_add_operation(self, context_mock):
# Get the original method definition as seen in function_app.py
func_call = Counter.build().get_user_function().entity_function
# Setup mock context behavior
state = 0
result = None
def set_state(new_state):
nonlocal state
state = new_state
def set_result(new_result):
nonlocal result
result = new_result
context_mock.get_state = Mock(return_value=state)
context_mock.set_state = Mock(side_effect=set_state)
context_mock.operation_name = "add"
context_mock.get_input = Mock(return_value=5)
context_mock.set_result = Mock(side_effect=lambda x: set_result)
# Call the entity function with the mocked context
func_call(context_mock)
# Verify the state was updated correctly
context_mock.set_state.assert_called_once_with(5)
self.assertEqual(state, 5)
self.assertEqual(result, None)
Egységtesztelési aktivitásfunkciók
A tevékenységfüggvények teszteléséhez nincs szükség Durable-specifikus módosításokra. Az Azure Functions Python-egységtesztelési áttekintésében található útmutató elegendő ezeknek a függvényeknek a teszteléséhez.