Skip to content

7.5 Integration Testing & Validation

7.5.1 End-to-End Integration Test Scenarios

Test Scenario Matrix

Scenario ID Test Case Components Tested Expected Outcome Priority
E2E-001 Customer calls, VA handles, resolves Entry Point → VA → Resolution Call handled, no escalation High
E2E-002 Customer calls, VA collects data, escalates Entry Point → VA → Agent Queue Context passed to agent High
E2E-003 Customer calls, webhook fails, escalates Entry Point → VA → Webhook → Fallback Graceful degradation High
E2E-004 Customer calls, no-match 3x, escalates Entry Point → VA → Fallback → Agent Escalation with reason Medium
E2E-005 Predictive routing selects best agent Entry Point → VA → ML API → Specific Agent Routed to predicted agent High
E2E-006 Multi-language support (Spanish) Entry Point → VA (es-ES) → Resolution Correct language handling Medium
E2E-007 PII redaction in logs Entry Point → VA → Logging PII masked in Cloud Logging High
E2E-008 High concurrent load (100 calls) Entry Point → VA → Multiple All calls handled High

Detailed Test Case: E2E-001

Test Case: Customer Calls, VA Handles, Resolves

Pre-conditions: - Dialogflow CX agent deployed and healthy - Webex CC flow published - Entry point configured - Test phone number mapped

Test Steps:

Step Action Expected Result Actual Result Pass/Fail
1 Dial contact center number IVR greeting played □
2 VA greeting: "How can I help you?" VA engaged □
3 User: "I want to pay my bill" Intent: billing.payment matched (conf > 0.70) □
4 VA: "How much would you like to pay?" Parameter prompt □
5 User: "One hundred fifty dollars" Entity: $150.00 extracted □
6 VA: "How would you like to pay?" Parameter prompt □
7 User: "Credit card" Entity: credit_card extracted □
8 Webhook called Payment processed (< 3s) □
9 VA: "Your payment of $150 has been processed. Confirmation: TXN-12345" Confirmation with ID □
10 VA: "Is there anything else?" Continuation offered □
11 User: "No, thank you" Intent: goodbye matched □
12 VA: "Thank you for calling. Goodbye!" Call ends □

Post-conditions: - Interaction logged in BigQuery - PII redacted in logs - Payment recorded in billing system - Customer satisfaction survey sent (optional)

Validation Points:

def validate_e2e_001(interaction_id):
    """Validate E2E-001 test case"""
    from google.cloud import bigquery

    client = bigquery.Client()

    # Check interaction logged
    query = f"""
        SELECT *
        FROM `project.dataset.interactions`
        WHERE interaction_id = '{interaction_id}'
    """
    result = client.query(query).result()
    interaction = list(result)[0]

    # Assertions
    assert interaction['handled_flag'] == 1, "Interaction not handled"
    assert interaction['escalated_flag'] == 0, "Incorrectly escalated"
    assert interaction['intent'] == 'billing.payment', "Wrong intent"
    assert interaction['payment_amount'] == 150.00, "Wrong amount"
    assert interaction['payment_status'] == 'completed', "Payment failed"

    # Check PII redaction
    log_query = f"""
        SELECT textPayload
        FROM `project.dataset.dialogflow_logs`
        WHERE labels.session_id = '{interaction_id}'
          AND textPayload LIKE '%credit card%'
    """
    logs = client.query(log_query).result()

    for log in logs:
        # Should not contain actual card numbers
        assert '4111' not in log.textPayload, "PII not redacted"

    print(f"E2E-001 validation passed for {interaction_id}")


7.5.2 Performance and Load Testing

Load Testing Strategy

Test Phases:

Phase Duration Concurrent Users Ramp-Up Goal
Smoke Test 5 min 10 Immediate Verify basic functionality
Load Test 30 min 50 5 min Normal operating conditions
Stress Test 60 min 100 10 min Peak load conditions
Spike Test 30 min 200 (spike) Instant Handle sudden surges
Soak Test 4 hours 50 10 min Sustained load stability

Load Testing Implementation

Using Locust (Python):

from locust import HttpUser, task, between
import json
import random

class DialogflowLoadTest(HttpUser):
    wait_time = between(5, 15)  # Time between requests

    def on_start(self):
        """Called once per user at start"""
        self.session_id = f"load-test-{random.randint(1000, 9999)}"
        self.project_id = "your-project-id"
        self.location = "us-central1"
        self.agent_id = "your-agent-id"

    @task(5)  # Weight: 5
    def billing_inquiry(self):
        """Test billing inquiry conversation"""
        self.detect_intent("I want to pay my bill")
        self.detect_intent("One hundred fifty dollars")
        self.detect_intent("Credit card")

    @task(3)  # Weight: 3
    def technical_support(self):
        """Test technical support conversation"""
        self.detect_intent("I have no internet connection")
        self.detect_intent("Yes, I tried restarting")
        self.detect_intent("Still not working")

    @task(2)  # Weight: 2
    def general_inquiry(self):
        """Test general inquiry"""
        self.detect_intent("What are your business hours?")

    def detect_intent(self, text):
        """Call Dialogflow API"""
        url = (
            f"https://{self.location}-dialogflow.googleapis.com/v3/"
            f"projects/{self.project_id}/locations/{self.location}/"
            f"agents/{self.agent_id}/sessions/{self.session_id}:detectIntent"
        )

        headers = {
            "Authorization": f"Bearer {self.get_access_token()}",
            "Content-Type": "application/json"
        }

        payload = {
            "queryInput": {
                "text": {"text": text},
                "languageCode": "en-US"
            }
        }

        with self.client.post(
            url,
            json=payload,
            headers=headers,
            catch_response=True,
            name="detectIntent"
        ) as response:
            if response.status_code == 200:
                result = response.json()
                # Validate response
                if 'queryResult' in result:
                    response.success()
                else:
                    response.failure("Invalid response structure")
            else:
                response.failure(f"HTTP {response.status_code}")

    def get_access_token(self):
        """Get OAuth token (cached)"""
        # Implementation to get and cache access token
        pass

## Run load test:
## locust -f dialogflow_load_test.py --host=https://dialogflow.googleapis.com

Performance Targets:

Metric Target Acceptable Critical
Response Time (p50) < 1s < 2s < 3s
Response Time (p95) < 2s < 3s < 5s
Response Time (p99) < 3s < 5s < 10s
Success Rate > 99.5% > 99% > 95%
Concurrent Sessions 100+ 50+ 25+
Throughput 50 req/s 30 req/s 15 req/s

7.5.3 Security Validation

Security Test Cases

Test ID Test Case Method Expected Result Status
SEC-001 PII redaction in logs Log inspection All PII masked □
SEC-002 TLS encryption Network capture TLS 1.2+ used □
SEC-003 Authentication validation Invalid token test 401 Unauthorized □
SEC-004 Injection attack prevention SQL/XSS payloads Input sanitized □
SEC-005 Rate limiting Excessive requests 429 Too Many Requests □
SEC-006 Data retention policy Time-based deletion Data purged after TTL □
SEC-007 Webhook authentication Unsigned requests Rejected □
SEC-008 GDPR data access User data request Complete data export □

Security Validation Scripts

Test PII Redaction:

from google.cloud import logging_v2
import re

def test_pii_redaction():
    """Verify PII is redacted in Cloud Logging"""
    client = logging_v2.Client()
    logger = client.logger('dialogflow')

    # Fetch recent logs
    filter_str = '''
        resource.type="dialogflow.googleapis.com/Agent"
        AND timestamp >= "2023-06-15T00:00:00Z"
    '''

    entries = client.list_entries(filter_=filter_str, max_results=100)

    pii_patterns = {
        'phone': r'\d{3}-\d{3}-\d{4}',
        'email': r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}',
        'ssn': r'\d{3}-\d{2}-\d{4}',
        'credit_card': r'\d{4}-\d{4}-\d{4}-\d{4}'
    }

    violations = []

    for entry in entries:
        text = str(entry.payload)

        for pii_type, pattern in pii_patterns.items():
            matches = re.findall(pattern, text)
            if matches:
                violations.append({
                    'timestamp': entry.timestamp,
                    'pii_type': pii_type,
                    'matches': matches
                })

    if violations:
        print(f"❌ PII REDACTION FAILED: {len(violations)} violations found")
        for v in violations:
            print(f"  - {v['pii_type']}: {v['matches']} at {v['timestamp']}")
        return False
    else:
        print("✅ PII REDACTION PASSED: No PII found in logs")
        return True

test_pii_redaction()

Test TLS Encryption:

import ssl
import socket

def test_tls_encryption(hostname, port=443):
    """Verify TLS 1.2+ is used"""
    context = ssl.create_default_context()

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            protocol = ssock.version()
            cipher = ssock.cipher()

            print(f"Protocol: {protocol}")
            print(f"Cipher: {cipher}")

            if protocol in ['TLSv1.2', 'TLSv1.3']:
                print("✅ TLS ENCRYPTION PASSED")
                return True
            else:
                print(f"❌ TLS ENCRYPTION FAILED: Using {protocol}")
                return False

test_tls_encryption('dialogflow.googleapis.com')

7.5.4 Monitoring and Observability

Key Metrics Dashboard

Dialogflow CX Metrics:

Metric Description Alert Threshold
Intent Match Rate % of user inputs matched to intents < 80%
Average Confidence Score Avg confidence of matched intents < 0.75
Conversation Duration Avg time per conversation > 5 minutes
Escalation Rate % of conversations escalated to agent > 40%
Webhook Success Rate % of successful webhook calls < 99%
Webhook Latency (p95) 95th percentile webhook response time > 3 seconds

Webex CC Metrics:

Metric Description Alert Threshold
Virtual Agent Containment % handled without agent < 50%
Average Speed of Answer Time to agent answer > 30 seconds
Service Level (80/20) 80% answered in 20 seconds < 80%
First Call Resolution % resolved on first contact < 70%
Agent Utilization % time agents are occupied < 70% or > 95%

Predictive Routing Metrics:

Metric Description Alert Threshold
Prediction Latency Time to get ML prediction > 500ms
Prediction Confidence Avg ML confidence score < 0.75
AI-Routed FCR FCR for AI-routed calls < Traditional FCR
Model Accuracy Predicted vs actual FCR < 75%

Monitoring Setup

Cloud Monitoring Dashboard:

displayName: "Contact Center AI Monitoring"
mosaicLayout:
  columns: 12
  tiles:
    - width: 6
      height: 4
      widget:
        title: "Dialogflow Intent Match Rate"
        xyChart:
          dataSets:
            - timeSeriesQuery:
                timeSeriesFilter:
                  filter: 'metric.type="dialogflow.googleapis.com/intent_match_rate"'
          yAxis:
            label: "Match Rate %"
            scale: LINEAR

    - width: 6
      height: 4
      widget:
        title: "Webhook Latency (p95)"
        xyChart:
          dataSets:
            - timeSeriesQuery:
                timeSeriesFilter:
                  filter: 'metric.type="dialogflow.googleapis.com/webhook_latency"'
                  aggregation:
                    perSeriesAligner: ALIGN_PERCENTILE_95
          yAxis:
            label: "Latency (ms)"

    - width: 6
      height: 4
      widget:
        title: "Predictive Routing Accuracy"
        xyChart:
          dataSets:
            - timeSeriesQuery:
                timeSeriesFilter:
                  filter: 'metric.type="custom.googleapis.com/predictive_routing/accuracy"'
          yAxis:
            label: "Accuracy %"

Alerting Policies:

from google.cloud import monitoring_v3

def create_alert_policy():
    """Create alert for high webhook latency"""
    client = monitoring_v3.AlertPolicyServiceClient()
    project_name = f"projects/your-project-id"

    alert_policy = monitoring_v3.AlertPolicy(
        display_name="High Webhook Latency",
        conditions=[
            monitoring_v3.AlertPolicy.Condition(
                display_name="Webhook latency > 3 seconds",
                condition_threshold=monitoring_v3.AlertPolicy.Condition.MetricThreshold(
                    filter='metric.type="dialogflow.googleapis.com/webhook_latency"',
                    comparison=monitoring_v3.ComparisonType.COMPARISON_GT,
                    threshold_value=3000,
                    duration={"seconds": 300},  # For 5 minutes
                    aggregations=[
                        monitoring_v3.Aggregation(
                            alignment_period={"seconds": 60},
                            per_series_aligner=monitoring_v3.Aggregation.Aligner.ALIGN_PERCENTILE_95
                        )
                    ]
                )
            )
        ],
        notification_channels=[
            'projects/your-project-id/notificationChannels/email_channel',
            'projects/your-project-id/notificationChannels/pagerduty_channel'
        ],
        alert_strategy=monitoring_v3.AlertPolicy.AlertStrategy(
            auto_close={"seconds": 3600}  # Auto-close after 1 hour
        )
    )

    policy = client.create_alert_policy(
        name=project_name,
        alert_policy=alert_policy
    )

    print(f"Alert policy created: {policy.name}")

7.5.5 Compliance Testing

GDPR Compliance Validation

Requirement Test Validation Method Status
Right to Access User requests their data API returns all stored data □
Right to Erasure User requests data deletion Data deleted within 30 days □
Data Minimization Only necessary data collected Review data collection practices □
Consent Management Explicit consent required Verify consent capture □
Data Portability User exports their data Export in machine-readable format □
Breach Notification Simulated breach Notification within 72 hours □

PCI-DSS Compliance (if handling payments)

Requirement Control Validation Status
Build and Maintain Secure Network Firewall rules, network segmentation Penetration test □
Protect Cardholder Data Encryption (TLS 1.2+), tokenization Data flow audit □
Maintain Vulnerability Management Patching, antivirus Vulnerability scan □
Implement Strong Access Control MFA, least privilege Access review □
Regularly Monitor and Test Networks Logging, SIEM integration Log review □
Maintain Information Security Policy Documented policies Policy review □

Compliance Automation:

def run_gdpr_compliance_test():
    """Automated GDPR compliance testing"""

    test_results = {}

    # Test 1: Right to Access
    test_results['right_to_access'] = test_right_to_access('test_user_123')

    # Test 2: Right to Erasure
    test_results['right_to_erasure'] = test_right_to_erasure('test_user_456')

    # Test 3: Data Retention
    test_results['data_retention'] = test_data_retention()

    # Test 4: PII Redaction
    test_results['pii_redaction'] = test_pii_redaction()

    # Generate compliance report
    generate_compliance_report(test_results)

    return all(test_results.values())

def test_right_to_access(user_id):
    """Test user data access request"""
    from google.cloud import bigquery

    client = bigquery.Client()

    # Query all user data
    query = f"""
        SELECT *
        FROM `project.dataset.interactions`
        WHERE customer_id = '{user_id}'
    """

    result = client.query(query).result()
    data = [dict(row) for row in result]

    # Verify data returned
    if len(data) > 0:
        print(f"✅ Right to Access: Found {len(data)} records for {user_id}")
        return True
    else:
        print(f"❌ Right to Access: No data found for {user_id}")
        return False