We needed a new approach Developers responsible for all test automation QA responsible for manual, exploratory & qualitative testing Automated functional tests written in terms of the domain model, not the user interface
The Hexagonal architecture AKA Ports & Adaptors HTTP service f Adaptor layer maps between technical domain & application domain model, but performs no business logic.
Service cluster Service cluster Front-end cluster Front-end cluster Service cluster ...and wider Test driver (g∘f) -1 Test Front-end cluster Web browser f g
Scenario Turn the Screenplay metaphor up to eleven! Actor Role Tasks Domain Model Behind the scenes Visible in test code System under test Production System Interface Plays Acts upon Acts upon Creates Creates Performs Defined in terms of Defines
Example @Test fun `An editor can request an amendment`() { val scenario = theProduction.newScenario() val alice = scenario.newAuthor() val ed = scenario.newEditorialStaffMember() val submissionDetails = exampleSubmission.withSingleAuthor(alice) val initialSubmission = alice.hasSubmitted(submissionDetails) val amendment = ed.canRequestAmendmentOf(initialSubmission) alice.canReview(amendment, expectedContents = submissionDetails.withStatus(IN_PROGRESS)) alice.canUpdate(amendment, SetTitle("a new title"), SubmitToPeerReview) ed.canSeeInThePeerReviewSystem(amendment, status = RECEIVED) }
2. Combinatorial explosion of mappings Add Author Remove Author Set Affiliation Set Title & Abstract Submit to Review Domain Model Service API Browser (with JS) Browser (no JS)
2. Apply the Lingua Franca Pattern! Add Author Remove Author Set Affiliation Set Title & Abstract Submit to Review Domain Model Service API Browser (with JS) Browser (no JS) User Actions
3. Multiple possible mappings Can map from action to user action in multiple ways ● Different ways to navigate through the user interface ● Different ways to upload files ● Keyboard vs mouse input ● JavaScript vs no JavaScript Approaches: ● Choose randomly on each run ○ A form of property test ● Ensure equivalence with unit tests and exercise only one in the functional tests
The Funnel o' Feedback "Developer UX" Type checking Unit tests Connector tests Service tests System tests Manual tests Refactor to prefer fast feedback and exhaustive coverage
To test the system we need to... know what the system is doing know when it has stopped doing it know when the system has failed explain what has gone wrong restore the system to a good state
To test the system we need to... support know what the system is doing know when it has stopped doing it know when the system has failed explain what has gone wrong restore the system to a good state