Software Engineering Takeaways logo

Software Engineering Takeaways

Free

Teaching software engineering: testing pillars and best practices

FreeFree tier
Type
Open Source

About Software Engineering Takeaways

A blog post summarizing key takeaways from a software engineering course taught by John Regehr, focusing on testing practices. The post covers three pillars of testing: test cases, oracles, and coverage. It references 'Writing Solid Code' and 'Code Complete' and discusses techniques such as differential testing, metamorphic testing, and the use of assertions and checkReps. The content emphasizes the importance of testing as a superpower and provides practical advice for generating effective test suites.

Key Features

Focus on three pillars of testing: test cases, oracles, coverage
Discussion of differential testing and metamorphic testing
Emphasis on oracles such as assertions, checkReps, and spec validation
Coverage measurement as a tool for test suite quality
Practical advice from Writing Solid Code and Code Complete

Pros & Cons

Pros
  • Concise and practical summary of essential testing concepts
  • References authoritative books in software engineering
  • Provides concrete examples and techniques like differential testing
  • Emphasizes the importance of a testing mindset and frictionless testing
Cons
  • Limited to testing topics; does not cover other software engineering areas
  • Only a single blog post, not a comprehensive resource
  • Assumes familiarity with basic programming concepts

Best For

Learning software testing techniques for engineersTeaching a software engineering course module on testingImproving test suite design and coverage awareness

FAQ

What are the three pillars of testing according to the post?
The three pillars are test cases, oracles, and coverage.
What books are referenced in the post?
Writing Solid Code by Steve Maguire and Code Complete by Steve McConnell are referenced.
What is differential testing?
Differential testing checks one implementation of a specification against another, and can be applied even when the reference implementation covers only part of the functionality.