COURSE

Modern Testing Workshop

The fundamentals of modern testing for software engineers. Goes beyond code-focused testing to include security, usability, exploratory and more.

  • 2 Days
  • Intermediate
  • In-person / Online
  • £ On Request

Overview

Testing is the bedrock upon which we build software. Without tests, code will not work. Without tests, code cannot be updated with any level of confidence. Simple as.

This workshop is designed to reflect the realities of modern software development, working in small cross-functional teams, deploying to the cloud and supporting a diverse range of needs, both functional and non-functional. These needs are explored in depth as are emerging methods like property and mutation testing.

Objectives

This course will enable software engineers to confidently develop systems knowing that they meet the needs of customers whether that’s features, performance or security.

  • 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 coder and tester

Outline

Introduction to Testing

  • 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 coverge 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 i18N 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
  • Generalising 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

Requirements

This is a hands-on 2-day course, attendees must be comfortable writing code in a high-level language such as Java, TypeScript, Kotlin, C#, etc. They should also have a good understanding of engineering best practices.

COURSE

Modern Testing Workshop

The fundamentals of modern testing for software engineers. Goes beyond code-focused testing to include security, usability, exploratory and more.

  • 2 Days
  • Intermediate
  • In-person / Online
  • £ On Request

Deloitte logo
Atlassian logo
Bose logo
Workday logo
BMW logo
Amex logo
McAfee logo
PWC logo