Outline
This is an introductory workshop for IT staff intending to work as testers on an Agile software project. It is designed to reflect the realities of modern software development — including working in small cross-functional teams, deploying to the cloud and supporting a diverse range of users. Both functional and non-functional testing is covered in depth, as are emerging methods like property and mutation testing.
What you will learn
By the end of the delivery, delegates will have received a comprehensive introduction to modern testing and recognise which avenues to pursue for further development. In addition to prospective testers, the workshop can be used to give developers and business analysts a deeper appreciation of the complexities of modern QA.
- Understand the role of QA in an Agile team
- Appreciate the multiple dimensions of testing
- Learn the fundamentals of modern testing methods
- Be able to use a variety of testing frameworks
- Build a solid foundation for becoming a tester
Outline:
Introduction to QA
- The evolution of the tester's role
- Developing the mindset for testing
- Escalating costs when discovering bugs
- The pyramid view for different kinds of test
- Functional vs. non-functional testing
- Black vs. white vs. grey test modalities
- Why automation is essential but limited
- Do testers also need to be coders?
- Can coders ever be good testers?
The Agile Perspective on Testers
- It's not about breaking things
- Making a positive impact on quality
- Testing is everyone's responsibility
- The concept of the 'T' shaped engineer
- Facilitating rather than gatekeeping
- Motivating rather than demoralising
- Advantages of 'pair testing' with coders
- Using Acceptance Test Driven Development
- The need to address 'escape defects'
- Different forms of technical debt
- Focusing on the bugs that matter
- Embedding testing into workflows
Core Concepts of Functional Testing
- Picking test cases via Equivalence Partitioning
- Using Boundary Value Analysis to find edge cases
- Discovering core test cases using Decision Tables
- Deriving test cases from State Transition Diagrams
- Extracting tests from scenarios in Use Case Reports
- Statement and decision coverage in White Box Testing
Automating Test Cases
- Do you really care if it fails?
- Decoupling the UI to facilitate testing
- Readability is everything in testing code
- Coding principles that don't translate
- Using Gherkin as a universal language
- Partitioning tests to remove coupling
- Isolating tests for parallel execution
- Creating an efficient CI/CD pipeline
Testing for Usability
- It is not possible to automate empathy
- Why we need to perform Exploratory Testing
- How to target an Exploratory Testing Session
- Taxi cab testing vs. testing single features
- Organising exploratory test sessions
- Writing a Test Charter for the event
- Picking a team and assigning key roles
- Ways to ensure effective reporting
Accessibility and I11N Testing
- Most software has poor accessibility
- Issues faced by visually impaired users
- Motivations to ensure apps are accessible
- Extra issues due to Internationalization
- Defining test cases to prove accessibility
- Screen Readers on browsers and mobile devices
- Using Pa11y to highlight accessibility blackspots
- Using specialist testers to verify accessibility
Property Based Testing
- Why PBT evolved within the FP community
- Characteristics of pure functions within FP
- Generalizing test cases into properties
- Creating generators and shrinking rules
- Performing PBT on the JVM with ScalaCheck
- Performing PBT in the CLR with FsCheck
- Performing PBT in Python with Hypothesis
Mutation Testing
- How altering your code validates your tests
- Why mutation tells you more than code coverage
- Comparing Property Based and Mutation Testing
- Types of changes that create mutant programs
- Measuring how well your tests find mutants
- Performing mutations in Python with Cosmic Ray
- Mutation tools available for the JVM and CLR
Performance and Stress Testing
- Common myths surrounding performance testing
- Does your test environment replicate production?
- Defining what performance means within your system
- Crafting appropriate and realistic benchmarks
- Using JMeter for performance / stress testing
- Using Gattling for continuous load testing
- Abstracting Gattling and JMeter via Taurus
- Running distributed load tests via Locust
Tools for Testing Distributed Systems
- Simplifying your setup using Docker
- Automating the browser via Selenium
- Exploring RESTful APIs using Postman
- Using Neuman to integrate Postman into CI
- Mocking RESTful services with WireMock
- Isolating REST Controllers in Spring Boot
- Isolating Components in Angular and React
- Using REST-assured to simplify complex tests
- Test libraries specific to reactive streams
- Integrating the above libraries with Cucumber
- Testing serverless applications in AWS Lambda
Contract Testing and Distributed Systems
- Contracts between providers and suppliers
- Defining contracts as sets of interactions
- Avoiding contracts turning into functional tests
- Using the Pact tool to perform contract testing
- Automating Pact tests using the Broker utility
Resiliency Testing
- The need to ensure continuous quality of service
- High availability and the 'five nines' guarantee
- Using Goblin for resiliency testing in cloud apps
- Chaos engineering at Netflix and the Simian Army
- Ensuring resilience objectives are clearly defined
- Distinguishing between SLAs, SLOs and SLIs
Security Testing
- Adopting the mindset of an attacker
- Common attacks defined by the OWASP top ten
- Examining your network with Nmap, Wireshark, etc.
- Performing Threat Modelling to determine weaknesses
- Introducing mitigations and verifying their efficacy
Prerequisites:
Delegates should have some experience of working in a software team, familiarity with the basic principles of Agile Development and the ability to write basic procedural programs using conditionals and iteration.