Michael C. Feathers says in his book “Working effectively with Legacy Code”
Legacy code is simply code without tests
Code without tests is bad code. It doesn’t matter how well written it is; it doesn’t matter how pretty or object-oriented or well-encapsulated it is. With tests, we can change the behavior of our code quickly and verifiably. Without them, we really don’t know if our code is getting better or worse.
Perfect definition. Nothing to add.