]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/contributor/regressions.itexi
ba4a5e70dda091d745cd241c3f7fc03d32848915
[lilypond.git] / Documentation / contributor / regressions.itexi
1 @c -*- coding: utf-8; mode: texinfo; -*-
2 @node Regression tests
3 @chapter Regression tests
4
5 @menu
6 * Introduction to regression tests::
7 * Precompiled regression tests::
8 * Compiling regression tests::
9 * Identifying code regressions::
10 * Memory and coverage tests::
11 * MusicXML tests::
12 @end menu
13
14
15 @node Introduction to regression tests
16 @section Introduction to regression tests
17
18 LilyPond has a complete suite of regression tests that are used
19 to ensure that changes to the code do not break existing behavior.
20 These regression tests comprise small LilyPond snippets that test
21 the functionality of each part of LilyPond.
22
23 Regression tests are added when new functionality is added to
24 LilyPond.  They are also added when bugs are identified.  The
25 snippet that causes the bug becomes a regression test to verify
26 that the bug has been fixed.
27
28 The regression tests are compiled using special @code{make}
29 targets.  There are three primary uses for the regression
30 tests.  First, successful completion of the regression tests means
31 that LilyPond has been properly built.  Second, the output of the
32 regression tests can be manually checked to ensure that
33 the graphical output matches the description of the intended
34 output.  Third, the regression test output from two different
35 versions of LilyPond can be automatically compared to identify
36 any differences.  These differences should then be manually
37 checked to ensure that the differences are intended.
38
39 Regression tests (@qq{regtests}) are available in precompiled form
40 as part of the documentation.  Regtests can also be compiled
41 on any machine that has a properly configured LilyPond build
42 system.
43
44
45 @node Precompiled regression tests
46 @section Precompiled regression tests
47
48 @subheading Regression test output
49
50 As part of the release process, the regression tests are run
51 for every LilyPond release.  Full regression test output is
52 available for every stable version and the most recent development
53 version.
54
55 Regression test output is available in HTML and PDF format.  Links
56 to the regression test output are available at the developer's
57 resources page for the version of interest.
58
59 The latest stable version of the regtests is found at:
60
61 @example
62 @uref{http://lilypond.org/doc/stable/input/regression/collated-files.html}
63 @end example
64
65 The latest development version of the regtests is found at:
66
67 @example
68 @uref{http://lilypond.org/doc/latest/input/regression/collated-files.html}
69 @end example
70
71
72 @subheading Regression test comparison
73
74 Each time a new version is released, the regtests are
75 compiled and the output is automatically compared with the
76 output of the previous release.  The result of these
77 comparisons is archived online:
78
79 @example
80 @uref{http://lilypond.org/test/}
81 @end example
82
83 The test comparison shows all of the changes that occured between
84 the current release and the prior release.  Each test that has
85 a significant difference in output is displayed, with the old
86 version on the left and the new version on the right.  Blurs
87 in the regression tests for the new version show the approximate
88 location of elements in the old version.
89
90 Regression tests whose output is the same for both versions are not
91 shown in the test comparison.
92
93 Checking these pages is a very important task for the LilyPond project.
94 You are invited to report anything that looks broken, or any case
95 where the output quality is not on par with the previous release,
96 as described in @rweb{Bug reports}.
97
98 @warning{
99 The automatic comparison of the regtests checks the
100 LilyPond bounding boxes and the log files.  This means that
101 Ghostscript changes and changes in
102 lyrics or text are not found.  However, errors and warnings that
103 are printed to the log file but
104 do not change the graphical layout are also identified.
105 }
106
107 @node Compiling regression tests
108 @section Compiling regression tests
109
110 Developers may wish to see the output of the complete regression
111 test suite for the current version of the source repository
112 between releases.  Current source code is available; see
113 @ref{Working with source code}.  Then you will need
114 to build the LilyPond binary; see @ref{Compiling LilyPond}.
115
116 Uninstalling the previous LilyPond version is not necessary, nor is
117 running @code{make install}, since the tests will automatically be
118 compiled with the LilyPond binary you have just built in your source
119 directory.
120
121 From this point, the regtests are compiled with:
122
123 @example
124 make test
125 @end example
126
127 If you have a multi-core machine you may want to use the @option{-j}
128 option and @var{CPU_COUT} variable, as
129 described in @ref{Saving time with CPU_COUNT}.
130 For a quad-core processor the complete command would be:
131
132 @example
133 make -j5 CPU_COUNT=5 test
134 @end example
135
136 The regtest output will then be available in
137 @file{input/@/regression/@/out@/-test}.
138 @file{input/@/regression/@/out@/-test/@/collated@/-examples@/.html}
139 contains a listing of all the regression tests that were run,
140 but none of the images are included.  Individual images are
141 also available in this directory.
142
143 The primary use of @samp{make@tie{}test} is to verify that the
144 regression tests all run without error.  The regression test
145 page that is part of the documentation is created only when the
146 documentation is built, as described in @ref{Generating documentation}.
147 Note that building the documentation requires more installed components
148 than building the source code, as described in
149 @ref{Requirements for building documentation}.
150
151
152 @node Identifying code regressions
153 @section Identifying code regressions
154
155 Before modified code is committed to master, a regression test
156 comparision must be completed to ensure that the changes have
157 not caused problems with previously working code.  The comparison
158 is made automatically upon compiling the regression test suite
159 twice.
160
161 Before making changes, a baseline should be established by running:
162
163 @example
164 make test-baseline
165 @end example
166
167 After making the changes, the code should be checked by running:
168
169 @example
170 make check
171 @end example
172
173 After @samp{make@tie{}check} is complete, a regression test comparison
174 will be available at @file{out/@/test@/-results/@/index@/.html}.
175 For each regression test that differs between the baseline and the
176 changed code, a regression test entry will displayed.  Ideally, the
177 only changes would be the changes that you were working on.  If
178 regressions are introduced, they must be fixed before committing the
179 code.
180
181 @warning{
182 The special regression test @file{test@/-output@/-distance@/.ly} will always
183 show up as a regression.  This test changes each time it is run, and
184 serves to verify that the regression tests have, in fact, run.}
185
186 Once @samp{make@tie{}test-baseline} and @samp{make@tie{}check} have been
187 run, the files that differ between @samp{test-baseline} and @samp{check}
188 can be repeatedly examined by doing:
189
190 @example
191 make test-redo
192 @end example
193
194 This updates the regression list at @file{out/@/test@/-results/@/index@/.html}.
195 It does @emph{not} redo @file{test@/-output@/-distance@/.ly}.
196
197 When all regressions have been resolved, the output list will be empty.
198
199 Once all regressions have been resolved, a final check should be completed
200 by running:
201
202 @example
203 make test-clean
204 make check
205 @end example
206
207 This cleans the results of the previous @samp{make@tie{}check}, then does the
208 automatic regression comparison again.  
209
210
211 @node Memory and coverage tests
212 @section Memory and coverage tests
213
214 In addition to the graphical output of the regression tests, it is
215 possible to test memory usage and to determine how much of the source
216 code has been exercised by the tests.
217
218 @subheading Memory usage
219
220 For tracking memory usage as part of this test, you will need
221 GUILE CVS; especially the following patch:
222 @uref{http://www.lilypond.org/vc/old/gub.darcs/patches/guile-1.9-gcstats.patch}.
223
224 @subheading Code coverage
225
226 For checking the coverage of the test suite, do the following
227
228 @example
229 ./scripts/auxiliar/build-coverage.sh
230 @emph{# uncovered files, least covered first}
231 ./scripts/auxiliar/coverage.py  --summary out-cov/*.cc
232 @emph{# consecutive uncovered lines, longest first}
233 ./scripts/auxiliar/coverage.py  --uncovered out-cov/*.cc
234 @end example
235
236
237 @node MusicXML tests
238 @section MusicXML tests
239
240
241 LilyPond comes with a complete set of regtests for the
242 @uref{http://www.musicxml.org/,MusicXML} language.  Originally
243 developed to test @samp{musicxml2ly}, these regression tests
244 can be used to test any MusicXML implementation.
245
246 The MusicXML regression tests are found at
247 @file{input/@/regression/@/musicxml/}.
248
249 The output resulting from running these tests
250 through @samp{muscxml2ly} followed by @samp{lilypond} is
251 available in the LilyPond documentation:
252
253 @example
254 @uref{http://lilypond.org/doc/latest/input/regression/musicxml/collated-files}
255 @end example
256