Testing Javascript Applications
Software-Testing

Testing Javascript Applications

Lucas Da Costa, 2021

Inhaltsverzeichnis des Buches

  • preface
  • acknowledgments
  • about this book
  • about the author
  • about the cover illustration
  • Part 1. Testing JavaScript applications
  • 1 An introduction to automated testing
  • 1.1 What is an automated test?
  • 1.2 Why automated tests matter
  • Predictability
  • Reproducibility
  • Collaboration
  • Speed
  • 2 What to test and when?
  • 2.1 The testing pyramid
  • 2.2 Unit tests
  • 2.3 Integration tests
  • 2.4 End-to-end tests
  • Testing HTTP APIs
  • Testing GUIs
  • Acceptance tests and end-to-end tests are not the same
  • 2.5 Exploratory testing and the value of QA
  • 2.6 Tests, cost, and revenue
  • Part 2. Writing tests
  • 3 Testing techniques
  • 3.1 Organizing test suites
  • Breaking down tests
  • Parallelism
  • Global hooks
  • Atomicity
  • 3.2 Writing good assertions
  • Assertions and error handling
  • Loose assertions
  • Using custom matchers
  • Circular assertions
  • 3.3 Test doubles: Mocks, stubs, and spies
  • Mocking imports
  • 3.4 Choosing what to test
  • Don’t test third-party software
  • To mock, or not to mock: That’s the question
  • When in doubt, choose integration tests
  • 3.5 Code coverage
  • Automated coverage reports
  • Coverage types
  • What coverage is good for and what it isn’t
  • 4 Testing backend applications
  • 4.1 Structuring a testing environment
  • End-to-end testing
  • Integration testing
  • Unit testing
  • 4.2 Testing HTTP endpoints
  • Testing middleware
  • 4.3 Dealing with external dependencies
  • Integrations with databases
  • Integrations with other APIs
  • 5 Advanced backend testing techniques
  • 5.1 Eliminating nondeterminism
  • Parallelism and shared resources
  • Dealing with time
  • 5.2 Reducing costs while preserving quality
  • Reducing overlap between tests
  • Creating transitive guarantees
  • Turning assertions into preconditions
  • 6 Testing frontend applications
  • 6.1 Introducing JSDOM
  • 6.2 Asserting on the DOM
  • Making it easier to find elements
  • Writing better assertions
  • 6.3 Handling events
  • 6.4 Testing and browser APIs
  • Testing a localStorage integration
  • Testing a History API integration
  • 6.5 Dealing with WebSockets and HTTP requests
  • Tests involving HTTP requests
  • Tests involving WebSockets
  • 7 The React testing ecosystem
  • 7.1 Setting up a test environment for React
  • Setting up a React application
  • Setting up a testing environment
  • 7.2 An overview of React testing libraries
  • Rendering components and the DOM
  • React Testing Library
  • Enzyme
  • The React test renderer
  • 8 Testing React applications
  • 8.1 Testing component integration
  • Stubbing components
  • 8.2 Snapshot testing
  • Snapshots beyond components
  • Serializers
  • 8.3 Testing styles
  • 8.4 Component-level acceptance tests and component stories
  • Writing stories
  • Writing documentation
  • 9 Test-driven development
  • 9.1 The philosophy behind test-driven development
  • What test-driven development is
  • Adjusting the size of your iterations
  • Why adopt test-driven development?
  • When not to apply test-driven development
  • 9.2 Writing a JavaScript module using TDD
  • 9.3 Testing top-down versus testing bottom-up
  • What bottom-up and top-down testing mean
  • How top-down and bottom-up approaches impact a test-driven workflow
  • The pros and cons of bottom-up versus top-down approaches
  • 9.4 Balancing maintenance costs, delivery speed, and brittleness
  • Test-driven implementation
  • Test-driven maintenance
  • 9.5 Setting up an environment for TDD to succeed
  • Teamwide adoption
  • Keeping distinct lanes
  • Pairing
  • Supplementary testing
  • 9.6 TDD, BDD, validations, and specificationsBDD (behavior-driven development)
  • 10 UI-based end-to-end testing
  • 10.1 What are UI-based end-to-end tests?
  • 10.2 When to write each type of test
  • UI-based end-to-end tests
  • Pure end-to-end tests
  • Pure UI tests
  • A note on acceptance testing and this chapter’s name
  • 10.3 An overview of end-to-end testing tools
  • Selenium
  • Puppeteer
  • Cypress
  • When to choose Cypress
  • 11 Writing UI-based end-to-end tests
  • 11.1 Your first UI-based end-to-end tests
  • Setting up a test environment
  • Writing your first tests
  • Sending HTTP requests
  • Sequencing actions
  • 11.2 Best practices for end-to-end-tests
  • Page objects
  • Application actions
  • 11.3 Dealing with flakiness
  • Avoiding waiting for fixed amounts of time
  • Stubbing uncontrollable factors
  • Retrying tests
  • 11.4 Running tests on multiple browsers
  • Using a testing framework to run tests within a browser
  • Running UI-based tests in multiple browsers
  • 11.5 Visual regression tests
  • Part 3. Business impact
  • 12 Continuous integration and continuous delivery
  • 12.1 What are continuous integration and continuous delivery?
  • Continuous integration
  • Continuous delivery
  • 12.2 The role of automated tests in a CI/CD pipeline
  • 12.3 Version-control checks
  • 13 A culture of quality
  • 13.1 Using type systems to make invalid states unrepresentable
  • 13.2 Reviewing code to catch problems machines can’t
  • 13.3 Using linters and formatters to produce consistent code
  • 13.4 Monitoring your systems to understand how they actually behave
  • 13.5 Explaining your software with good documentation
  • index