nitunit: update manpage with multiple .res and --autosav
[nit.git] / share / man / nitunit.md
1 # NAME
2
3 nitunit - executes the unit tests from Nit source files.
4
5 # SYNOPSIS
6
7 nitunit [*options*] FILE...
8
9 # DESCRIPTION
10
11 Unit testing in Nit can be achieved in two ways:
12
13 * using `DocUnits` in code comments or in markdown files
14 * using `TestSuites` with test unit files
15
16 `DocUnits` are executable pieces of code found in the documentation of groups, modules,
17 classes and properties.
18 They are used for documentation purpose, they should be kept simple and illustrative.
19 More advanced unit testing can be done using TestSuites.
20
21 `DocUnits` can also be used in any markdown files.
22
23 `TestSuites` are test files coupled to a tested module.
24 They contain a list of test methods called TestCase.
25
26 ## Working with `DocUnits`
27
28 DocUnits are blocks of executable code placed in comments of modules, classes and properties.
29 The execution can be verified using `assert`.
30
31 Example with a class:
32
33 ~~~
34 module foo
35 #    var foo = new Foo
36 #    assert foo.bar == 10
37 class Foo
38     var bar = 10
39 end
40 ~~~
41
42 Everything used in the test must be declared.
43 To test a method you have to instantiate its class:
44
45 ~~~
46 module foo
47 #    var foo = new Foo
48 #    assert foo.bar == 10
49 class Foo
50     #    var foo = new Foo
51     #    assert foo.baz(1, 2) == 3
52     fun baz(a, b: Int) do return a + b
53 end
54 ~~~
55
56 In a single piece of documentation, each docunit is considered a part of a single module, thus regrouped when
57 tested.
58 Therefore, it is possible (and recommended) to split docunits in small parts if it make the explanation easier.
59
60 ~~~~
61 # Some example of grouped docunits
62 #
63 # Declare and initialize a variable `a`.
64 #
65 #     var a = 1
66 #
67 # So the value of `a` can be used
68 #
69 #     assert a == 1
70 #
71 # even in complex operations
72 #
73 #     assert a + 1 == 2
74 fun foo do end
75 ~~~~
76
77 Sometime, some blocks of code has to be included in documentation but not considered by `nitunit`.
78 Those blocks are distinguished by their tagged fences (untagged fences or fences tagged `nit` are considered to be docunits).
79
80 ~~~~
81 # Some ASCII drawing
82 #
83 # ~~~~raw
84 #   @<
85 # <__)
86 # ~~~~
87 fun foo do end
88 ~~~~
89
90 The special fence-tag `nitish` could also be used to indicate pseudo-nit that will be ignored by nitunit but highlighted by nitdoc.
91 Such `nitish` piece of code can be used to enclose examples that cannot compile or that one do not want to be automatically executed.
92
93 ~~~~
94 # Some pseudo-nit
95 #
96 # ~~~~nitish
97 # var a: Int = someting
98 # # ...
99 # if a == 1 then something else something-else
100 # ~~~~
101 #
102 # Some code to not try to execute automatically
103 #
104 # ~~~~nitish
105 # system("rm -rf /")
106 # ~~~~
107 ~~~~
108
109 The `nitunit` command is used to test Nit files:
110
111     $ nitunit foo.nit
112
113 Groups (directories) can be given to test the documentation of the group and of all its Nit files:
114
115     $ nitunit lib/foo
116
117 Finally, standard markdown documents can be checked with:
118
119     $ nitunit foo.md
120
121 When testing, the environment variable `NIT_TESTING` is set to `true`.
122 This flag can be used by libraries and program to prevent (or limit) the execution of dangerous pieces of code.
123
124 ~~~~~
125 # NIT_TESTING is automatically set.
126 #
127 #     assert "NIT_TESTING".environ == "true"
128 ~~~~
129
130 ## Working with `TestSuites`
131
132 TestSuites are Nit files that define a set of TestCases for a particular module.
133
134 The test suite must be called `test_` followed by the name of the module to test.
135 So for the module `foo.nit` the test suite will be called `test_foo.nit`.
136
137 The structure of a test suite is the following:
138
139 ~~~~
140 # test suite for module `foo`
141 module test_foo
142 import foo # can be intrude to test private things
143 class TestFoo
144     # test case for `foo::Foo::baz`
145     fun test_baz do
146         var subject = new Foo
147         assert subject.baz(1, 2) == 3
148     end
149 end
150 ~~~~
151
152 Test suite can be executed using the same `nitunit` command:
153
154     $ nitunit foo.nit
155
156 `nitunit` will execute a test for each method named `test_*` in a class named `Test*`
157 so multiple tests can be executed for a single method:
158
159 ~~~~
160 class TestFoo
161     fun test_baz_1 do
162         var subject = new Foo
163         assert subject.baz(1, 2) == 3
164     end
165     fun test_baz_2 do
166         var subject = new Foo
167         assert subject.baz(1, -2) == -1
168     end
169 end
170 ~~~~
171
172 ## Black Box Testing
173
174 Sometimes, it is easier to validate a `TestCase` by comparing its output with a text file containing the expected result.
175
176 For each TestCase `test_bar` of a TestSuite `test_mod.nit`, a corresponding file with the expected output is looked for:
177
178 * "test_mod.sav/test_bar.res". I.e. test-cases grouped by test-suites.
179
180         This is the default and is useful if there is a lot of test-suites and test-cases in a directory
181
182 * "sav/test_bar.res". I.e. all test-cases grouped in a common sub-directory.
183
184         Useful if there is a lot of test-suites OR test-cases in a directory.
185
186 * "test_bar.res" raw in the directory.
187
188         Useful is there is a few test-suites and test-cases in a directory.
189
190 All 3 are exclusive. If more than one exists, the test-case is failed.
191
192 If a corresponding file then the output of the test-case is compared with the file.
193
194 The `diff(1)` command is used to perform the comparison.
195 The test is failed if non-zero is returned by `diff`.
196
197 ~~~
198 module test_mod is test_suite
199 class TestFoo
200         fun test_bar do
201                 print "Hello!"
202         end
203 end
204 ~~~
205
206 Where `test_mod.sav/test_bar.res` contains
207
208 ~~~raw
209 Hello!
210 ~~~
211
212 If no corresponding `.res` file exists, then the output of the TestCase is ignored.
213
214 To helps the management of the expected results, the option `--autosav` can be used to automatically create and update them.
215
216
217 ## Configuring TestSuites
218
219 `TestSuites` also provide methods to configure the test run:
220
221 `before_test` and `after_test`: methods called before/after each test case.
222 They can be used to factorize repetitive tasks:
223
224 ~~~~
225 class TestFoo
226     var subject: Foo
227     # Mandatory empty init
228     init do end
229     # Method executed before each test
230     fun before_test do
231         subject = new Foo
232     end
233     fun test_baz_1 do
234         assert subject.baz(1, 2) == 3
235     end
236     fun test_baz_2 do
237         assert subject.baz(1, -2) == -1
238     end
239 end
240 ~~~~
241
242 When using custom test attributes, an empty `init` must be declared to allow automatic test running.
243
244 `before_module` and `after_module`: methods called before/after each test suite.
245 They have to be declared at top level:
246
247 ~~~~
248 module test_bdd_connector
249 import bdd_connector
250 # Testing the bdd_connector
251 class TestConnector
252     # test cases using a server
253 end
254 # Method executed before testing the module
255 fun before_module do
256     # start server before all test cases
257 end
258 # Method executed after testing the module
259 fun after_module do
260     # stop server after all test cases
261 end
262 ~~~~
263
264 ## Generating test suites
265
266 Write test suites for big modules can be a repetitive and boring task...
267 To make it easier, `nitunit` can generate test skeletons for Nit modules:
268
269     $ nitunit --gen-suite foo.nit
270
271 This will generate the test suite `test_foo` containing test case stubs for all public
272 methods found in `foo.nit`.
273
274
275 # OPTIONS
276
277 ### `--full`
278 Process also imported modules.
279
280 By default, only the modules indicated on the command line are tested.
281
282 With the `--full` option, all imported modules (even those in standard) are also precessed.
283
284 ### `-o`, `--output`
285 Output name (default is 'nitunit.xml').
286
287 `nitunit` produces a XML file compatible with JUnit.
288
289 ### `--dir`
290 Working directory (default is 'nitunit.out').
291
292 In order to execute the tests, nit files are generated then compiled and executed in the giver working directory.
293
294 In case of success, the directory is removed.
295 In case of failure, it is kept as is so files can be investigated.
296
297 ### `--nitc`
298 nitc compiler to use.
299
300 By default, nitunit tries to locate the `nitc` program with the environment variable `NITC` or heuristics.
301 The option is used to indicate a specific nitc binary.
302
303 ### `--no-act`
304 Does not compile and run tests.
305
306 ### `-p`, `--pattern`
307 Only run test case with name that match pattern.
308
309 Examples: `TestFoo`, `TestFoo*`, `TestFoo::test_foo`, `TestFoo::test_foo*`, `test_foo`, `test_foo*`
310
311 ### `-t`, `--target-file`
312 Specify test suite location.
313
314 ### `--autosav`
315 Automatically create/update .res files for black box testing.
316
317 If a black block test fails because a difference between the expected result and the current result then the expected result file is updated (and the test is passed).
318
319 If a test-case of a test-suite passes but that some output is generated, then an expected result file is created.
320
321 It is expected that the created/updated files are checked since the tests are considered passed.
322 A VCS like `git` is often a good tool to check the creation and modification of those files.
323
324 ## SUITE GENERATION
325
326 ### `--gen-suite`
327 Generate test suite skeleton for a module.
328
329 ### `-f`, `--force`
330 Force test generation even if file exists.
331
332 Any existing test suite will be overwritten.
333
334 ### `--private`
335 Also generate test case for private methods.
336
337 ### `--only-show`
338 Only display the skeleton, do not write any file.
339
340
341 # ENVIRONMENT VARIABLES
342
343 ### `NITC`
344
345 Indicate the specific Nit compiler executable to use. See `--nitc`.
346
347 ### `NIT_TESTING`
348
349 The environment variable `NIT_TESTING` is set to `true` during the execution of program tests.
350 Some libraries of programs can use it to produce specific reproducible results; or just to exit their executions.
351
352 Unit-tests may unset this environment variable to retrieve the original behavior of such piece of software.
353
354 ### `SRAND`
355
356 In order to maximize reproducibility, `SRAND` is set to 0.
357 This make the pseudo-random generator no random at all.
358 See `Sys::srand` for details.
359
360 To retrieve the randomness, unit-tests may unset this environment variable then call `srand`.
361
362 ### `NIT_TESTING_ID`
363
364 Parallel executions can cause some race collisions on named resources (e.g. DB table names).
365 To solve this issue, `NIT_TESTING_ID` is initialized with a distinct integer identifier that can be used to give unique names to resources.
366
367 Note: `rand` is not a recommended way to get a distinct identifier because its randomness is disabled by default. See `SRAND`.
368
369
370 # SEE ALSO
371
372 The Nit language documentation and the source code of its tools and libraries may be downloaded from <http://nitlanguage.org>