A software regression is a type of
software bug
A software bug is a design defect ( bug) in computer software. A computer program with many or serious bugs may be described as ''buggy''.
The effects of a software bug range from minor (such as a misspelled word in the user interface) to sev ...
where a feature that has worked before stops working. This may happen after changes are applied to the software's
source code
In computing, source code, or simply code or source, is a plain text computer program written in a programming language. A programmer writes the human readable source code to control the behavior of a computer.
Since a computer, at base, only ...
, including the addition of new
features and bug fixes.
They may also be introduced by changes to the environment in which the software is running, such as system upgrades,
system patching or a change to
daylight saving time
Daylight saving time (DST), also referred to as daylight savings time, daylight time (Daylight saving time in the United States, United States and Daylight saving time in Canada, Canada), or summer time (British Summer Time, United Kingdom, ...
.
A software performance regression is a situation where the software still functions correctly, but performs more slowly or uses more memory or resources than before. Various types of software regressions have been identified in practice, including the following:
* ''Local'' – a change introduces a new bug in the changed module or component.
* ''Remote'' – a change in one part of the software breaks functionality in another module or component.
* ''Unmasked'' – a change unmasks an already existing bug that had no effect before the change.
Regressions are often caused by
encompassed bug fixes included in
software patch
Software consists of computer programs that instruct the execution of a computer. Software also includes design documents and specifications.
The history of software is closely tied to the development of digital computers in the mid-20th cen ...
es. One approach to avoiding this kind of problem is
regression testing
Regression testing (rarely, ''non-regression testing'') is re-running functional and non-functional tests to ensure that previously developed and tested software still performs as expected after a change. If not, that would be called a '' regr ...
. A properly designed
test plan
A test plan is a document detailing the objectives, resources, and processes for a specific test session for a software or hardware product. The plan typically contains a detailed understanding of the eventual workflow.
Test plans
A test plan docu ...
aims at preventing this possibility before releasing any software.
Automated testing and well-written
test case
In software engineering, a test case is a specification of the inputs, execution conditions, testing procedure, and expected results that define a single test to be executed to achieve a particular software testing objective, such as to exercise ...
s can reduce the likelihood of a regression.
Prevention and detection
Techniques have been proposed that try to prevent regressions from being introduced into software at various stages of development, as outlined below.
Prior to release
In order to avoid regressions being seen by the
end-user
In product development, an end user (sometimes end-user) is a person who ultimately uses or is intended to ultimately use a product. The end user stands in contrast to users who support or maintain the product, such as sysops, system administrato ...
after release, developers regularly run
regression tests after changes are introduced to the software. These tests can include
unit tests to catch local regressions as well as
integration tests to catch remote regressions. Regression testing techniques often leverage existing test cases to minimize the effort involved in creating them. However, due to the volume of these existing tests, it is often necessary to select a representative subset, using techniques such as
test-case prioritization.
For detecting performance regressions,
software performance tests are run on a regular basis, to monitor the response time and resource usage metrics of the software after subsequent changes. Unlike functional regression tests, the results of performance tests are subject to
variance
In probability theory and statistics, variance is the expected value of the squared deviation from the mean of a random variable. The standard deviation (SD) is obtained as the square root of the variance. Variance is a measure of dispersion ...
- that is, results can differ between tests due to variance in performance measurements; as a result, a decision must be made on whether a change in performance numbers constitutes a regression, based on experience and end-user demands. Approaches such as
statistical significance testing and
change point detection are sometimes used to aid in this decision.
Prior to commit
Since
debugging
In engineering, debugging is the process of finding the Root cause analysis, root cause, workarounds, and possible fixes for bug (engineering), bugs.
For software, debugging tactics can involve interactive debugging, control flow analysis, Logf ...
and localizing the root cause of a software regression can be expensive, there also exist some methods that try to prevent regressions from being committed into the
code repository in the first place. For example,
Git
Git () is a distributed version control system that tracks versions of files. It is often used to control source code by programmers who are developing software collaboratively.
Design goals of Git include speed, data integrity, and suppor ...
Hooks enable developers to run test scripts before code changes are committed or pushed to the code repository. In addition,
change impact analysis has been applied to software to predict the impact of a code change on various components of the program, and to supplement test case selection and prioritization.
Software linters are also often added to commit hooks to ensure consistent coding style, thereby minimizing stylistic issues that can make the software prone to regressions.
Localization
Many of the techniques used to find the root cause of non-regression software bugs can also be used to debug software regressions, including
breakpoint debugging, print debugging, and
program slicing. The techniques described below are often used specifically to debug software regressions.
Functional regressions
A common technique used to localize functional regressions is
bisection
In geometry, bisection is the division of something into two equal or congruent parts (having the same shape and size). Usually it involves a bisecting line, also called a ''bisector''. The most often considered types of bisectors are the ''s ...
, which takes both a buggy commit and a previously working commit as input, and tries to find the root cause by doing a binary search on the commits in between.
Version control
Version control (also known as revision control, source control, and source code management) is the software engineering practice of controlling, organizing, and tracking different versions in history of computer files; primarily source code t ...
systems such as Git and
Mercurial
Mercurial is a distributed revision control tool for software developers. It is supported on Microsoft Windows, Linux, and other Unix-like systems, such as FreeBSD and macOS.
Mercurial's major design goals include high performance and scalabi ...
provide built-in ways to perform bisection on a given pair of commits.
Other options include directly associating the result of a regression test with code changes; setting divergence breakpoints; or using incremental
data-flow analysis
Data-flow analysis is a technique for gathering information about the possible set of values calculated at various points in a computer program. It forms the foundation for a wide variety of compiler optimizations and program verification techn ...
, which identifies test cases - including failing ones - that are relevant to a set of code changes, among others.
Performance regressions
Profiling measures the performance and resource usage of various components of a program, and is used to generate data useful in debugging performance issues. In the context of software performance regressions, developers often compare the
call trees (also known as "timelines") generated by profilers for both the buggy version and the previously working version, and mechanisms exist to simplify this comparison.
Web development tools
Web development tools (often abbreviated to dev tools) allow web developers to test, modify and debug their websites. They are different from website builders and integrated development environments (IDEs) in that they do not assist in the direct ...
typically provide developers the ability to record these performance profiles.
Logging also helps with performance regression localization, and similar to call trees, developers can compare systematically-placed performance logs of multiple versions of the same software. A tradeoff exists when adding these performance logs, as adding many logs can help developers pinpoint which portions of the software are regressing at smaller granularities, while adding only a few logs will also reduce overhead when executing the program.
Additional approaches include writing performance-aware unit tests to help with localization, and ranking subsystems based on performance counter deviations.
Bisection can also be repurposed for performance regressions by considering commits that perform below (or above) a certain baseline value as buggy, and taking either the left or the right side of the commits based on the results of this comparison.
See also
*
Software rot
*
Software aging
In software engineering, software aging is the tendency for software to Software failure, fail or cause a system failure after running continuously for a certain time, or because of ongoing changes in systems surrounding the software. Software a ...
References
{{DEFAULTSORT:Software Regression
Software bugs