A *symptom* is an observable behaviour of the system and is therefore what automated [[Software testing MOC|Software testing]] practices are aimed at detecting. A *cause* isn't in itself observable. A test script doesn't know that line 11 of your `calculateReturns` function has a bug in the logic used to calculate a monetary figure. A test can however verify the output of the function isn't what's expected given some inputs. It's then up to the human engineer to connect the symptom to the cause. Different [[Software testing MOC#Testing levels|testing levels]] detect defect symptoms at different distances from their root cause and report at differing levels of precision. For example, error messages returned from [[End to end testing|E2E tests]] will likely not provide sufficient information as to the cause and further investigation will be required (e.g. checking log files). A failing [[Unit testing|unit test]] on the other hand, will likely provide a highly specific error message and lead directly to the function source which caused it. ## More examples | Symptoms | Cause | |----------- |------------- | | 503 SERVICE UNAVAILABLE error returned from API call | Downstream service down | | #TODO add more examples | |