Test scopes - Unit test - an isolated test around a single unit via it's public interface (often a class, or a series of related classes) - Component test - a test that verifies multiple units of source code are working - Isolated test - a test that doesn't do any I/O, i.e. the Ports have been filled with in-memory Adapters - Integration test - a test that interacts with deployed instances of the code and related services, possiby with some mocked items - End to End test - a test that entirely interacts with deployed instances Uses of tests - Development test - a test that was created to aid the process of development (not necessarily TDD) - Acceptance test - a test that needs to pass in order to determine a new feature is complete - Regression test - a test that ensures existing features are working - Smoke test - run after releasem, verifies a major feature is working, typically an end to end test Descriptive styles - Behavioural test (BDD terminology) - a test that is described in terms of a terms of desired behavior of the unit - not to be confused with Mockist tests - typically human (product owner/qa) readable - should not become obsolete when an implementation is altered (although may require refactoring) - Non-behavioural test - a test where is it not clear to a reader what the test is doing in terms of the systems feature set - often meaning of code is expressed using code constructs - often refactoring of codebase will cloud the meaning Development processes - Spike & stabilise - where code is developed and tests written after the fact - TDD - a development process where tests are written before writing code0 - BDD - a development process where *behavioural* tests are written before writing code, ideally with input from PO/QA - ATDD (acceptance test driven development) - a bit like BDD - Gherkin - a syntax for writing human readable tests (Given, When, Then). Properties of tests - Fast tests - tests that don't use disk/network calls, or do so sparingly - Slow tests - tests that talk to disk/network/browser and so run slowly - Coupled tests - tests that are bound to a particular implementation of a feature - often break or become obsolete when a feature is refactored - Expendable test (AKA throwaway) - a test which is not part of the acceptance/regression pack, typically a development test - can be deleted if it becomes hard to maintain or slow - Poorly describerd test - in which it isn't clear what the test is doing or why Verification approaches - Interaction based test (AKA Mockist test) - in which a test functions by verifying execution of methods of the components involved - some places call them behavioural tests, but shouldn't - often tightly coupled to implementation - State based test (AKA Stateist, classicist) - in which a test functions by verifying values that are set as the result of a test Test code constructs - Test double - a component used in a unit test which acts in stead of a real component e.g. - Stub. A custom implementation which returns canned responses - Mock. An object with programmable responses and can have its responses recorded - Fake. lightweight implementation of the component. e.g. a repo that uses a hashtable under the hood - Cake - something you deserve for reading this far.