A regression is a bug that makes a feature stop functioning as intended after a certain event such as a new change, a system upgrade etc. A performance regression is a situation where the software still functions correctly, but performs slowly or uses more memory than before.
Regression testing is a type of testing that ensures that no regressions has been introduced. i.e. previously developed and tested software still performs the same way after it is changed or even interfaced with other software.
Regression testing is mainly done to determine whether a change in one part of the software affects other parts of the software (regression). Sometimes a software change-impact analysis is performed to determine which areas could be affected by the proposed changes.
Common methods of regression testing include re-running previously completed tests and checking whether program behaviour has changed and whether previously fixed faults have re-emerged. Typically, regression testing is carried out by automation tools.
Regression testing also has its cons. It may introduce unnecessary overhead for projects with software development life cycles are very short. Some regression tools might have issues working with databases and third party libraries used by the unit being tested.