—Course Overview
1m 30s
Understanding Provable Code Correctness
- 40m 44s
—Putting Tests into the Frame
4m 12s
—What Follows in This Course
6m 41s
—Proving Correctness of Code
7m 48s
—Testing Correctness at Run Time
6m 20s
—Inventing Automated Tests
6m 49s
—Inventing the Test Runner
7m 14s
—Summary
1m 37s
The Importance of Knowing What to Test
- 40m 36s
—The Problem of Choosing What to Test
3m 39s
—Changing the Class to Support State Testing
6m 0s
—Implementing a State Test
4m 39s
—On Multiple Assertions in One Unit Test
6m 4s
—Completing State Tests
2m 25s
—Implementing an Interaction Test Through Derivation
5m 53s
—Implementing an Interaction Test Through Interface
5m 7s
—Understanding Regression
4m 40s
—Summary
2m 3s
The Pros and Cons of White-Box Testing
- 40m 15s
—Applying Branch Coverage Strategy
6m 33s
—Assessing Usefulness of Automatic Mocks
5m 40s
—Assessing Usefulness of Manual Mocks
3m 59s
—Assessing Maintainability of Automatic vs. Manual Mocks
5m 36s
—Leaning on the Compiler and Automatic Mocks
6m 12s
—Example: Abstracting Time
9m 31s
—Summary
2m 41s
Modeling Class Dependencies in Tests
- 40m 17s
—Stubbing vs. Mocking Dependencies
4m 37s
—Letting Dependencies Grow Through Refactoring
5m 38s
—Evaluating Interaction Tests
3m 54s
—Understanding Lifetime of a Dependency
7m 41s
—Avoiding Unnecessary Unit Tests
7m 6s
—Testing Temporal Coupling Between Method Calls
8m 30s
—Summary
2m 47s
Gaining Resilience by Testing Against Abstract Data Types
- 40m 31s
—Introducing Abstract Data Types
5m 54s
—Writing Unit Tests Against the Abstract Data Type
6m 27s
—Replacing Entire Concrete Class
4m 4s
—Varying Implementation of an Abstract Data Type
4m 28s
—Extending the Abstract Data Type
4m 38s
—Investigating Negative Test Cases
6m 18s
—Inventing Preconditions
6m 20s
—Summary
2m 18s
Testing Against Interfaces to Simplify Maintenance
- 40m 6s
—Understanding Possible Options When Deriving a Class
6m 45s
—Introducing Base and Derived Test Classes
5m 42s
—When Implementation Affects Abstraction
4m 21s
—Separating Functional from Non-functional Requirements
4m 27s
—Completing the Definition of Abstract Data Type
3m 10s
—Inventing the Abstract-Test-Driven Development
7m 51s
—Interface Tests in Light of the Liskov Substitution Principle
5m 51s
—Summary
1m 56s
Implementing Abstract Interfaces TDD Style
- 40m 24s
—Implementing Inheritance
2m 11s
—Using Abstract Unit Tests in TDD
3m 54s
—TDD-style Interface Implementation
6m 27s
—Applying TDD to Discover Missing Tests
5m 25s
—A Word About Naming Classes and Interfaces
2m 49s
—Refactoring a Class Covered by Abstract Tests
4m 10s
—Writing Tests Against Abstract List
9m 50s
—Discussing the Benefits of Base Tests Class
3m 2s
—Summary
2m 33s
Testing Compliance to Design Principles
- 40m 35s
—Inventing Design Pattern Tests
5m 31s
—Implementing the Design Pattern Tests
3m 26s
—Testing All Aspects of a Design Pattern
5m 7s
—Defining Value-typed Semantic
3m 34s
—Designing the Equality Tests
3m 34s
—Defining Equality Testing Rules
4m 43s
—Implementing Equality Testing Library
6m 27s
—Using the Equality Testing Library
5m 13s
—Summary
2m 56s
Design by Contract from Testing Perspective: Binding Theory to Practice
- 50m 40s
—Discovering Impossible Tests
3m 17s
—Understanding Error Conditions
4m 1s
—Division of Exceptions
4m 5s
—Defining Preconditions and Postconditions
4m 56s
—Avoiding Condition Checks with Contracts
4m 15s
—Inheriting Contracts
4m 27s
—Applying Contracts to a Production Class
6m 0s
—Asserting the Preconditions
3m 28s
—Implementing Contracts in Production Code
4m 46s
—Removing Superfluous Unit Tests
6m 28s
—Summary
2m 41s
—Course Summary
2m 11s