Outline

This is an introductory workshop for IT staff intending to work as testers on an Agile software project. It is designed to relect 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 testers role
  • Developing the mindset for testing
  • Escalating costs when discovering bugs
  • The pyramid view of 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 everyones responsibility
  • The concept of the ‘T’ shaped engineer
  • Facilitating rather than gatekeeping
  • Motivating rather than demoralizing
  • 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 coverge in White Box Testing

Automating Test Cases

  • Do you really care if it fails?
  • Decoupling the UI to facilitiate 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 eveolved 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 peformance 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 servcies 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 resiliance 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 Modeling 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.