Back to Employee Satisfaction & Pulse Surveys

Test and QA Plan

How the build is validated before go-live: three sequential test phases, edge cases, and production verification.

4 pagesPDF · Quality
FS-DOC-06Quality

Test and QA Plan

Employee Satisfaction and Pulse Surveys

[YourCompany.com] · HR Department · Prepared by FullSpec · [Today's Date]

This document defines the structured test and quality assurance programme for the Employee Satisfaction and Pulse Survey automation. It covers three sequential phases: unit testing of individual agent logic, integration and edge-case testing across agent handoffs and failure scenarios, and a final end-to-end production run with process owner sign-off. The FullSpec team executes Phases 1 and 2 in sandbox environments; the process owner joins the FullSpec team for Phase 3. No phase begins until all test cases in the preceding phase achieve a full pass.

01Testing approach

Testing is structured across three phases that must be completed in strict sequence. Phase 1 validates each agent in isolation against known inputs. Phase 2 confirms that agents hand off correctly to one another and that the system handles edge cases gracefully. Phase 3 runs a full production cycle end to end and records the process owner's formal approval. No phase begins until every test case in the previous phase reaches a passing state and is documented by the FullSpec team.

1
Phase 1: Unit Testing
Individual agent logic in isolation
Scope
Each agent tested independently: Survey Distribution Agent and Response Analysis Agent. No cross-agent calls during this phase.
Environment
Sandbox only. All tool connections (BambooHR, Typeform, Gmail, Google Sheets, Notion, Slack) use sandbox or test credentials.
Credential rule
Sandbox API keys must be used throughout. No production credentials are loaded into the automation platform during Phase 1.
Pass condition
All test cases T01 through T12 must return the expected output with zero unhandled errors before Phase 2 may begin.
Who runs it
FullSpec team only.
2
Phase 2: Integration and Edge-Case Testing
Agent handoffs, tool integrations, and failure modes
Scope
End-to-end agent handoffs, tool-to-tool data flows, and all identified edge cases including duplicate detection, missing data handling, and tool unavailability.
Environment
Sandbox for all automated steps. A staging Notion workspace and a test Slack channel are used. No production data is written.
Credential rule
Sandbox credentials remain active. Production credentials must not be substituted at any point during Phase 2.
Pass condition
All integration test cases T13 through T20 and edge-case tests E01 through E07 must pass before Phase 3 may begin.
Who runs it
FullSpec team only.
3
Phase 3: End-to-End Production Test
Full production run with process owner review and approval
Scope
One complete survey cycle run against live production systems: BambooHR production API, live Gmail sending, Typeform production form, Google Sheets production sheet, Notion production workspace, and Slack production channel.
Environment
Production. A dedicated internal test address is used for all email sends. The test survey record and any Notion draft created are voided after completion.
Credential rule
Production credentials are loaded for this phase only. Sandbox credentials are revoked from the platform before Phase 3 begins.
Pass condition
Test cases T21 through T25 must all pass and the process owner must complete T25 (review and approval) with a recorded confirmation logged by FullSpec before go-live is authorised.
Who runs it
FullSpec team, with the process owner (HR Manager) joining for T25.
Test and QA PlanPage 1 of 4
FS-DOC-06Quality

02Phase 1 — unit test cases

Sandbox credentials only. All Phase 1 tests must be executed with sandbox or test API keys for BambooHR, Typeform, Gmail, Google Sheets, Notion, and Slack. Do not load production credentials into the automation platform at any point during this phase. Any test case that touches a live system is invalid and must be re-run under sandbox conditions.

Survey Distribution Agent — Estimated build time: 12 hours — Complexity: Moderate

ID
Scenario
Input
Expected output
Pass criteria
T01
Happy path: fetch active employee list
BambooHR sandbox returns 10 active employees; 2 contractors and 1 leaver present in dataset
Google Sheets log contains exactly 10 rows, contractors and leaver excluded
Row count equals 10; employment_status filter applied correctly; no contractor or inactive record present
T02
Happy path: send personalised invitations
10-employee list from T01; Typeform sandbox survey URL set
10 Gmail sandbox messages sent; each contains employee first name and correct Typeform link; Google Sheets 'invited' column marked TRUE for all 10
Gmail sandbox outbox contains 10 messages; personalisation token resolved for each; Sheets log updated within 30 seconds of send
T03
Response check: all employees responded
Typeform sandbox reports 10 responses matching all 10 invited employee IDs
Decision node evaluates to 'all responded'; no reminder emails sent; flow proceeds to aggregation step
Zero reminder emails in Gmail sandbox outbox; flow log shows 'all_responded: true'
T04
Response check: partial response, reminder fires
Typeform sandbox reports 6 responses; 4 employees have not responded
4 reminder emails sent via Gmail sandbox; each addressed to the correct non-responder; Google Sheets reminder column marked TRUE for those 4; Slack test channel receives response rate alert (60%)
Exactly 4 reminder emails in sandbox outbox; no reminder sent to the 6 who responded; Slack message shows '60% response rate'
T05
Duplicate reminder guard
Reminder trigger fires a second time for the same survey cycle before window closes
System detects reminder_sent flag is TRUE for all non-responders; no second reminder emails sent
Zero additional emails in sandbox outbox on second trigger; log entry reads 'reminder_already_sent: skipped'
T06
BambooHR API returns empty list
BambooHR sandbox returns zero active employees (e.g. misconfigured filter)
Automation halts; error logged with message 'employee_list_empty'; Slack test channel notified; no emails sent
No Gmail messages in sandbox outbox; error record written to Google Sheets error log; Slack alert received within 60 seconds
T07
Gmail send failure on invitation step
Gmail sandbox rate limit simulated; first 3 sends succeed, send 4 returns 429 error
Automation retries send 4 up to 3 times with exponential back-off; on persistent failure writes failed addresses to Google Sheets error log and continues with remaining sends
Sends 1-3 and 5-10 complete; send 4 appears in Sheets error log with status 'send_failed_after_retry'; no silent drop
T08
Typeform response check returns API error
Typeform sandbox returns 503 on response status query
Automation retries up to 3 times; on persistent failure logs error and sends Slack alert; reminder step is skipped until next scheduled check interval
Slack test channel receives 'Typeform unreachable' alert; no reminder emails sent on failed check; retry count recorded in log

Response Analysis Agent — Estimated build time: 16 hours — Complexity: Complex

ID
Scenario
Input
Expected output
Pass criteria
T09
Happy path: aggregate responses into Google Sheets
Typeform sandbox export containing 10 complete responses with eNPS and 5 category scores each
Google Sheets sandbox tab populated with all 10 rows; eNPS calculated correctly; category averages computed for all 5 dimensions
Row count in Sheets equals 10; eNPS formula result matches manual spot-check calculation; no blank cells in score columns
T10
Happy path: Notion report page created
Aggregated scores from T09; prior cycle scores available for trend comparison
Notion sandbox page created with: headline eNPS score, category score table, trend delta vs prior cycle, AI-generated narrative summary, flagged departments below threshold
Notion page exists in sandbox workspace; all five sections present; threshold flag correctly applied to any category average below 6.0 out of 10
T11
Threshold flagging: department below score threshold
One department returns average score of 4.8 (below 6.0 threshold); all others above threshold
Notion page flags that department in red; narrative summary references it explicitly; Slack test channel receives a low-score alert
Flagged department appears in dedicated 'Attention Required' section of Notion page; Slack alert message contains department name and score
T12
Partial Typeform responses excluded correctly
Typeform sandbox export includes 8 complete responses and 2 partially completed (abandoned mid-survey)
Only 8 complete responses written to Google Sheets; partial responses excluded; log records 'partial_responses_excluded: 2'
Sheets row count equals 8; no partial response data present in score columns; exclusion count logged accurately
Test and QA PlanPage 2 of 4
FS-DOC-06Quality

03Phase 2 — integration and edge case tests

Phase 2 validates that the two agents hand off data correctly between each other and that all tool-to-tool connections behave as expected across the full automated flow. All tests remain in the sandbox environment. Integration test IDs continue the T sequence from Phase 1.

ID
Scenario
Input
Expected output
Pass criteria
T13
Survey Distribution Agent to Google Sheets handoff
10 invitations sent and logged by Survey Distribution Agent; Response Analysis Agent trigger fires at window close
Response Analysis Agent reads from the exact Google Sheets tab written by the Distribution Agent; no schema mismatch errors; all 10 rows visible to the analysis step
Analysis Agent reads 10 rows without transformation errors; column headers match expected schema; no missing employee IDs
T14
Typeform to Google Sheets aggregation via Response Analysis Agent
Typeform sandbox webhook fires on survey close with 10 response records
All 10 response records written to the Sheets 'responses' tab within 2 minutes of webhook receipt; eNPS and category scores calculated automatically
Webhook delivery confirmed in Typeform sandbox log; Sheets row count equals 10 within 2-minute SLA; formulas return numeric values for all score columns
T15
Google Sheets to Notion report creation
Scored Sheets tab from T14 used as input; prior cycle data present in Sheets for trend comparison
Notion sandbox page created with all required sections; trend deltas computed from prior cycle; page URL written back to Google Sheets in the 'report_url' column
Notion page accessible via generated URL; all five sections populated; report_url column in Sheets is non-empty
T16
Notion report to Slack and Gmail delivery
Notion sandbox page URL from T15; Slack test channel configured; test Gmail recipient address set
Slack test channel receives message containing Notion page URL and one-line score summary; Gmail sandbox message sent to test recipient with report link and brief summary
Slack message present in test channel within 60 seconds of Notion page creation; Gmail sandbox outbox contains one message to the test address with correct URL
T17
New-hire 30-day trigger via BambooHR
BambooHR sandbox record for a new employee with a hire date exactly 30 days prior to today
Survey Distribution Agent fires independently of the scheduled cycle trigger; new hire receives a standalone survey invitation; invitation logged separately in Google Sheets
Survey invitation in sandbox outbox addressed to the new-hire test email; Google Sheets log contains a row tagged 'trigger_type: new_hire_30_day'
T18
Manual survey close in Typeform triggers Response Analysis Agent
HR manually closes the sandbox Typeform survey before the scheduled window end date
Response Analysis Agent fires within 5 minutes of manual close; aggregation and Notion page creation proceed as per scheduled close
Agent execution log shows trigger source 'typeform_manual_close'; Notion sandbox page created with correct timestamp
T19
End-to-end flow timing: invitation to report
10-employee sandbox run with 8 responding before reminder and 2 responding after reminder
Full flow completes: invitation send, response check, reminder to 2 non-responders, aggregation after close, Notion page creation, Slack and Gmail delivery
All steps complete without manual intervention; total automated processing time from trigger to Slack delivery is under 10 minutes excluding the survey window itself
T20
Google Sheets log accuracy across full cycle
Full sandbox cycle from T19
Google Sheets log contains: 10 invited rows, 8 responded before reminder, 2 reminder flags, 2 responded after reminder, 1 report URL, 0 error rows
Each column in the Sheets log matches the expected state; no duplicate rows; error log tab is empty

Edge-case tests are numbered separately with an E prefix. These scenarios cover failure conditions, data anomalies, and human timeout situations that the automation must handle gracefully.

ID
Scenario
Input
Expected output
Pass criteria
E01
Duplicate employee record in BambooHR export
BambooHR sandbox returns the same employee ID twice in the active list
Deduplication logic removes the duplicate; exactly one invitation sent to that employee; Sheets log shows one row for that employee ID with a 'deduplicated: true' flag
Single invitation in sandbox outbox for the duplicated employee; Sheets log contains one row per employee ID; deduplication flag present
E02
Employee record missing email address in BambooHR
BambooHR sandbox returns one employee record with a null email field
That employee is skipped for invitation; their record is written to the Sheets error log with status 'missing_email'; Slack test channel notified
No invitation sent to a null address; error log row present with employee ID and 'missing_email' status; Slack alert received
E03
Typeform returns zero responses at window close
Survey window closes with zero Typeform responses submitted
Response Analysis Agent fires but detects empty response set; Notion page is not created; Slack alert sent with message 'zero responses received, report not generated'; Google Sheets log records 'responses: 0'
No Notion page created; Slack alert present in test channel; Sheets log reflects zero response count
E04
Google Sheets write failure during invitation logging
Google Sheets API returns 503 during invitation log write after 3 of 10 invitations are sent
Automation retries the Sheets write up to 3 times; on persistent failure continues sending remaining invitations and queues a retry for the Sheets log; Slack alert sent noting partial log failure
Remaining invitations sent; Sheets write retried and completed on subsequent attempt; Slack alert confirms partial log failure and recovery
E05
Notion API unavailable during report creation
Notion sandbox returns 503 during page creation step
Automation retries Notion write up to 3 times with exponential back-off; on persistent failure writes the report data as a structured JSON payload to Google Sheets fallback tab and sends Slack alert
Notion page creation fails gracefully; fallback tab in Sheets contains report payload; Slack alert received with message 'Notion unavailable, report stored in Sheets fallback'
E06
Slack notification fails at report delivery step
Slack sandbox webhook returns 400 during the report delivery notification
Automation logs the Slack failure; Gmail delivery to leadership address continues and succeeds; error logged in Sheets; no silent failure
Gmail delivery completes; Sheets error log records Slack failure with status code; process does not halt on Slack error alone
E07
HR does not review Notion report within 48 hours of creation
Notion page created and HR review step reached; no HR action recorded within 48 hours
Automation sends a follow-up Slack message to the HR Slack channel and a Gmail reminder to the HR Manager address reminding them that the report is pending review before leadership distribution
Slack reminder and Gmail reminder both appear in sandbox outputs at the 48-hour mark; no automatic distribution to leadership until HR review is confirmed
Test and QA PlanPage 3 of 4
FS-DOC-06Quality

04Phase 3 — end-to-end production test

Important before running Phase 3: Use an internal test email address (e.g. a shared HR inbox or a FullSpec test alias) for all invitation and reminder sends during this run. Do not send to real employees. The Notion report draft created during Phase 3 must be deleted or clearly marked as a test record immediately after the process owner completes their review. Any Google Sheets rows written during Phase 3 must be removed from the production sheet before the first live survey cycle runs. Confirm these steps with the FullSpec team before proceeding.

Phase 3 runs a single complete survey cycle against live production systems using a small internal test group. Every step is traced from trigger to Slack and Gmail delivery. The FullSpec team monitors execution in real time and records each result. The process owner joins at T25 to review the Notion report and record their formal approval, which is logged in the FullSpec confirmation record and authorises go-live.

ID
Scenario
What is verified
Expected result
Pass criteria
T21
Production trigger and BambooHR employee fetch
Scheduled trigger fires against production BambooHR API; active employee filter applied to production dataset
Production employee list retrieved with correct active-only filter; row count matches known headcount in BambooHR admin; list written to production Google Sheets log
Production Sheets log row count matches BambooHR admin active headcount; no contractor or inactive record present; trigger timestamp recorded
T22
Production invitation send and Typeform link delivery
Personalised invitations sent via production Gmail to the internal test address only; Typeform production survey link included
Test address receives invitation email with correct first name token resolved and working Typeform link; Google Sheets 'invited' column marked TRUE; no emails sent to any real employee address
One email in production Gmail sent folder addressed to test address; Typeform link opens the correct live survey; Sheets log updated; zero emails to non-test addresses
T23
Production response aggregation and scoring
Test responder submits the Typeform production survey; survey window manually closed by FullSpec team after submission
Response written to production Google Sheets responses tab; eNPS and category scores calculated; prior cycle trend delta computed; no data corruption or formula errors
Sheets row count equals 1 (test submission); all score columns populated with numeric values; eNPS calculation matches manual spot-check; trend delta column non-null
T24
Production Notion report creation and error log verification
Scored production Sheets data from T23; production Notion workspace targeted
Notion report page created in production workspace with all required sections; page URL written back to Sheets; automation error log is empty confirming zero unhandled exceptions across the full run
Notion page accessible via production URL; all five sections present; Sheets error log tab contains zero rows; execution log shows no unhandled exceptions
T25
Process owner review and go-live approval
HR Manager (process owner) reviews the Notion production report page created in T24; confirms accuracy of scores, narrative, and threshold flags; records approval with FullSpec team
Process owner confirms the report is accurate and the automation behaved as expected across the full cycle; go-live authorisation is recorded in the FullSpec confirmation log; Notion test page and Sheets test rows voided after approval
Process owner approval recorded in FullSpec confirmation log with name, date, and explicit go-live authorisation. Notion test page deleted. Sheets test rows cleared. FullSpec team notified to proceed to live deployment.
Once T25 is recorded as passed and the FullSpec confirmation log is updated, the automation is cleared for live deployment. The first production survey cycle will run against the full active employee list as configured in BambooHR. Any issues observed after go-live should be reported to support@gofullspec.com.
Test and QA PlanPage 4 of 4

More documents for this process

Every document generated for Employee Satisfaction & Pulse Surveys.

Launch Plan
Operations · Owner
View
ROI and Business Case
Finance · Owner
View
Process Runbook / SOP
Operations · Owner
View
Developer Handover Pack
Technical · Developer
View
Integration and API Spec
Technical · Developer
View