259 lines
7.1 KiB
YAML
259 lines
7.1 KiB
YAML
config:
|
|
target: "http://localhost:3000"
|
|
phases:
|
|
# Warm-up phase
|
|
- duration: 60
|
|
arrivalRate: 5
|
|
name: "Warm up"
|
|
|
|
# Ramp up phase
|
|
- duration: 120
|
|
arrivalRate: 5
|
|
rampTo: 50
|
|
name: "Ramp up load"
|
|
|
|
# Sustained load phase
|
|
- duration: 300
|
|
arrivalRate: 50
|
|
name: "Sustained load"
|
|
|
|
# Spike test
|
|
- duration: 60
|
|
arrivalRate: 100
|
|
name: "Spike test"
|
|
|
|
# Performance thresholds
|
|
ensure:
|
|
maxErrorRate: 1 # Max 1% error rate
|
|
p95: 2000 # 95th percentile response time < 2s
|
|
p99: 3000 # 99th percentile response time < 3s
|
|
|
|
# HTTP defaults
|
|
http:
|
|
timeout: 10
|
|
|
|
# Define variables
|
|
variables:
|
|
testEmail: "perf-test-{{ $randomString() }}@example.com"
|
|
testPassword: "TestPassword123!"
|
|
|
|
# Processor for custom logic
|
|
processor: "./test-helpers/artillery-processor.js"
|
|
|
|
scenarios:
|
|
# Authentication flow
|
|
- name: "User Registration and Login"
|
|
weight: 10
|
|
flow:
|
|
- post:
|
|
url: "/api/v1/auth/register"
|
|
json:
|
|
email: "{{ testEmail }}"
|
|
password: "{{ testPassword }}"
|
|
name: "Test User"
|
|
phone: "+1234567890"
|
|
deviceInfo:
|
|
deviceId: "test-device-{{ $randomString() }}"
|
|
deviceName: "Artillery Test Device"
|
|
platform: "web"
|
|
capture:
|
|
- json: "$.data.tokens.accessToken"
|
|
as: "accessToken"
|
|
- json: "$.data.user.id"
|
|
as: "userId"
|
|
- json: "$.data.family.id"
|
|
as: "familyId"
|
|
expect:
|
|
- statusCode: 201
|
|
|
|
- post:
|
|
url: "/api/v1/auth/login"
|
|
json:
|
|
email: "{{ testEmail }}"
|
|
password: "{{ testPassword }}"
|
|
deviceInfo:
|
|
deviceId: "test-device-{{ $randomString() }}"
|
|
deviceName: "Artillery Test Device"
|
|
platform: "web"
|
|
expect:
|
|
- statusCode: 200
|
|
|
|
# Activity tracking flow (most common operation)
|
|
- name: "Track Baby Activities"
|
|
weight: 50
|
|
flow:
|
|
# Login first
|
|
- post:
|
|
url: "/api/v1/auth/login"
|
|
json:
|
|
email: "perf-test@example.com" # Use pre-seeded account
|
|
password: "TestPassword123!"
|
|
deviceInfo:
|
|
deviceId: "test-device-{{ $randomString() }}"
|
|
deviceName: "Artillery Test Device"
|
|
platform: "web"
|
|
capture:
|
|
- json: "$.data.tokens.accessToken"
|
|
as: "accessToken"
|
|
- json: "$.data.user.id"
|
|
as: "userId"
|
|
|
|
# Create child if needed
|
|
- post:
|
|
url: "/api/v1/children"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
json:
|
|
name: "Test Baby {{ $randomNumber(1, 1000) }}"
|
|
dateOfBirth: "2024-01-01"
|
|
gender: "other"
|
|
capture:
|
|
- json: "$.data.id"
|
|
as: "childId"
|
|
|
|
# Log feeding activity
|
|
- post:
|
|
url: "/api/v1/activities?childId={{ childId }}"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
json:
|
|
type: "feeding"
|
|
startedAt: "{{ $now }}"
|
|
endedAt: "{{ $now }}"
|
|
details:
|
|
feedingType: "bottle"
|
|
amountMl: 120
|
|
notes: "Performance test feeding"
|
|
expect:
|
|
- statusCode: 201
|
|
- contentType: json
|
|
|
|
# Log sleep activity
|
|
- post:
|
|
url: "/api/v1/activities?childId={{ childId }}"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
json:
|
|
type: "sleep"
|
|
startedAt: "{{ $now }}"
|
|
details:
|
|
quality: "good"
|
|
location: "crib"
|
|
expect:
|
|
- statusCode: 201
|
|
|
|
# Get daily summary
|
|
- get:
|
|
url: "/api/v1/activities/summary?childId={{ childId }}&date={{ $now }}"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
expect:
|
|
- statusCode: 200
|
|
|
|
# Analytics and insights (read-heavy)
|
|
- name: "View Analytics Dashboard"
|
|
weight: 20
|
|
flow:
|
|
- post:
|
|
url: "/api/v1/auth/login"
|
|
json:
|
|
email: "perf-test@example.com"
|
|
password: "TestPassword123!"
|
|
deviceInfo:
|
|
deviceId: "test-device-{{ $randomString() }}"
|
|
deviceName: "Artillery Test Device"
|
|
platform: "web"
|
|
capture:
|
|
- json: "$.data.tokens.accessToken"
|
|
as: "accessToken"
|
|
|
|
- get:
|
|
url: "/api/v1/analytics/insights/sleep-patterns?childId={{ childId }}&days=7"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
expect:
|
|
- statusCode: 200
|
|
|
|
- get:
|
|
url: "/api/v1/analytics/insights/feeding-patterns?childId={{ childId }}&days=7"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
expect:
|
|
- statusCode: 200
|
|
|
|
- get:
|
|
url: "/api/v1/analytics/reports/weekly?childId={{ childId }}"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
expect:
|
|
- statusCode: 200
|
|
|
|
# AI assistant interaction
|
|
- name: "AI Chat Interaction"
|
|
weight: 15
|
|
flow:
|
|
- post:
|
|
url: "/api/v1/auth/login"
|
|
json:
|
|
email: "perf-test@example.com"
|
|
password: "TestPassword123!"
|
|
deviceInfo:
|
|
deviceId: "test-device-{{ $randomString() }}"
|
|
deviceName: "Artillery Test Device"
|
|
platform: "web"
|
|
capture:
|
|
- json: "$.data.tokens.accessToken"
|
|
as: "accessToken"
|
|
|
|
- post:
|
|
url: "/api/v1/ai/chat"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
json:
|
|
message: "How much should my 3-month-old eat?"
|
|
capture:
|
|
- json: "$.data.conversationId"
|
|
as: "conversationId"
|
|
expect:
|
|
- statusCode: 201
|
|
|
|
- get:
|
|
url: "/api/v1/ai/conversations"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
expect:
|
|
- statusCode: 200
|
|
|
|
# Family management
|
|
- name: "Family Collaboration"
|
|
weight: 5
|
|
flow:
|
|
- post:
|
|
url: "/api/v1/auth/login"
|
|
json:
|
|
email: "perf-test@example.com"
|
|
password: "TestPassword123!"
|
|
deviceInfo:
|
|
deviceId: "test-device-{{ $randomString() }}"
|
|
deviceName: "Artillery Test Device"
|
|
platform: "web"
|
|
capture:
|
|
- json: "$.data.tokens.accessToken"
|
|
as: "accessToken"
|
|
- json: "$.data.family.id"
|
|
as: "familyId"
|
|
|
|
- get:
|
|
url: "/api/v1/families/{{ familyId }}"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
expect:
|
|
- statusCode: 200
|
|
|
|
- get:
|
|
url: "/api/v1/families/{{ familyId }}/members"
|
|
headers:
|
|
Authorization: "Bearer {{ accessToken }}"
|
|
expect:
|
|
- statusCode: 200
|