-
Notifications
You must be signed in to change notification settings - Fork 53
/
README
362 lines (267 loc) · 9.44 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# -*- rd -*-
= README --- An introduction of Cutter, a Unit Testing Framework for C and C++
== Name
Cutter
== Author
=== Program
* Kouhei Sutou <[email protected]>
* Hiroyuki Ikezoe <[email protected]>
* Yuto Hayamizu <[email protected]>
=== Kinotan Icons
* Mayu & Co.
== License
* Source: LGPLv3 or later. (detail:
((<"license/lgpl-3.txt"|URL:http://www.gnu.org/licenses/lgpl.html>)))
* Document and kinotan icons: Triple license: LGPL, GFDL and/or CC.
* LGPL: v3 or later. (detail:
((<"license/lgpl-3.txt"|URL:http://www.gnu.org/licenses/lgpl.html>)))
* GFDL: v1.3 or later. (detail:
((<"license/gfdl-1.3.txt"|URL:http://www.gnu.org/licenses/fdl.html>)))
* CC: ((<BY-SA|URL:http://creativecommons.org/licenses/by-sa/3.0/>))
* Exceptions:
* glib-compatible/glibintl.h, glib-compatible/gregex.*,
glib-compatible/gscripttable.h, glib-compatible/gsequence.*,
glib-compatible/gstring.*, glib-compatible/gunicode.h,
glib-compatible/guniprop.c: LGPL v2.0 or later.
(detail:
((<"glib-compatible/COPYING"|URL:http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html>)))
* glib-compatible/pcre/: PCRE LICENSE.
(detail:
((<"glib-compatible/pcre/COPYING"|URL:http://www.pcre.org/licence.txt>)))
* html/blog.*, html/download.*, html/heading-mark.*
html/install.*, html/readme.*, html/reference.*,
html/tango-logo.png, html/tutorial.*, html/mini-*.svg:
Public domain. They are deliverables by ((<Tango Desktop
Project|URL:http://tango.freedesktop.org/>)). (Some of
them are modified.)
* html/ja.png, html/us.png, html/famfamfam-logo.png:
Public domain. They are distributed by
((<famfamfam.com|URL:http://famfamfam.com/>)).
== What's this?
Cutter is a xUnit family Unit Testing Framework for C and
C++.
This is a list of features of Cutter:
* easy to write tests.
* outputs result with useful format for debugging.
* tests are built as shared libraries.
See ((<FEATURES>)) for more details.
== Dependency libraries
* GLib >= 2.16
== Install
See ((<Install>)).
== Repository
There is the repository at ((<"clear-code/cutter on GitHub"|URL:https://github.com/clear-code/cutter/>)).
% git clone https://github.com/clear-code/cutter.git
== Usage
% cutter [OPTION ...] TEST_DIRECTORY
TEST_DIRECTORY should have test_*.so. test_*.so are searched
recursively.
See ((<cutter|"doc/cutter.rd">)) for more details.
== How to test
Executing flow of test is the following.
(1) Write a test.
(2) Compile it and build test_*.so.
(3) Execute cutter. It loads test_*.so and runs them.
See ((<a tutorial|TUTORIAL>)) and sample/stack/.
== Test result
Here is an example test result:
..........F.................................................
1) Failure: test_test_case_count
<1 == cut_test_case_get_n_tests(test_object, NULL)>
expected: <1>
but was: <0>
test/test-cut-test-case.c:143: test_test_case_count()
Finished in 0.020857 seconds
60 test(s), 253 assertion(s), 1 failure(s), 0 error(s), 0 pending(s), 0 notification(s)
=== Progress
A part that contains "." and "F" of the test result shows
test progress:
..........F.................................................
Each "." and "F" shows a test case (test function). "."
shows a test case that is succeeded and "F" shows a test
case that is failed. There are "E", "P" and "N". They shows
error, pending and notification respectively. Here is a
summary of test case marks:
: .
A succeeded test
: F
A failed test
: E
A test that had an error
: P
A test that is marked as pending
: N
A test that had an notification
The above marks are showed after each test is finished. We
can confirm the test progress from the output in testing.
=== Summary of test result
Cutter outputs a summary of test result after all tests are
finished. The first of a summary is a list of a detail of
test result of non-succeeded test. In the example, cutter
outputs a detail of test result because there is a failure.
1) Failure: test_test_case_count
<1 == cut_test_case_get_n_tests(test_object, NULL)>
expected: <1>
but was: <0>
test/test-cut-test-case.c:143: test_test_case_count()
In the example, test_test_case_count test case is failed. We
expected that cut_test_case_get_n_tests(test_object, NULL)
is 1 but was 0. The failed assertion is in
test_test_case_count() function in test/test-cut-test-case.c
at 143th line.
Elapsed time for testing is showed after a list of a detail
of test result:
Finished in 0.020857 seconds
The last line is an summary of test result:
60 test(s), 253 assertion(s), 1 failure(s), 0 error(s), 0 pending(s), 0 notification(s)
Here are the means of each output:
: n test(s)
n test case(s) (test function(s)) are run.
: n assertion(s)
n assertion(s) are passed.
: n failure(s)
n assertion(s) are failed.
: n error(s)
n error(s) are occurred (cut_error() is used n times)
: n pending(s)
n test case(s) are pending (cut_pending() is used n times)
: n notification(s)
n notification(s) are occurred (cut_notification() is used n times)
In the example, 60 test cases are run, 253 assertions are
passed and an assertion is failed. There are no error,
pending, notification.
=== XML report
Cutter reports test result as XML format if --xml-report
option is specified. A reported XML has the following
structure:
<report>
<!-- "result" tag is generated for a test result.
Normally, a "result" tag is generated for a test.
If you use cut_message(), you will get two or more "result" tags
for a test. -->
<result>
<test-case>
<name>TEST CASE NAME</name>
<description>DESCRIPTION OF TEST CASE (if exists)</description>
<start-time>START TIME OF TEST CASE (ISO 8601 format) [e.g.: 2013-11-12T03:32:56.691676Z]</start-time>
<elapsed>ELAPSED TIME OF TEST CASE (in seconds) [e.g.: 0.030883]</elapsed>
</test-case>
<test>
<name>TEST NAME</name>
<description>DESCRIPTION OF TEST CASE (if exists)</description>
<start-time>START TIME OF TEST (ISO 8601 format) [e.g.: 2013-11-12T03:32:56.691823Z]</start-time>
<elapsed>ELAPSED TIME OF TEST (in seconds) [e.g.: 0.030883]</elapsed>
<option><!-- ATTRIBUTE INFORMATION (if exists) -->
<name>ATTRIBUTE NAME [e.g.: bug]</name>
<value>ATTRIBUTE VALUE [e.g.: 1234]</value>
</option>
<option>
...
</option>
...
</test>
<status>TEST RESULT (one of them: success, notification, omission, pending, failure, error, crash)</status>
<detail>DETAIL OF TEST RESULT (if exists)</detail>
<backtrace><!-- BACKTRACE (if exists) -->
<entry>
<file>FILE NAME</file>
<line>LINE</line>
<info>ADDITIONAL INFORMATION</info>
</entry>
<entry>
...
</entry>
</backtrace>
<start-time>START TIME OF TEST (ISO 8601 format) [e.g.: 2013-11-12T03:32:56.691823Z]</start-time>
<elapsed>ELAPSED TIME OF TEST (in seconds) [e.g.: 0.030883]</elapsed>
</result>
<result>
...
</result>
...
</report>
=== Test coverage
You can see the code coverage with Cutter if your system
have ((<LTP tools|URL:http://ltp.sourceforge.net/>)). To
see the coverage, add the followling line in your
configure.ac and type "make coverage".
AC_CHECK_COVERAGE
== References
=== Assertions
See ((<"cutter/cut-assertions.h"|cutter-cut-assertions.html>)).
=== Attributes
You can add attributes to your test to get more useful
information on failure. For example, you can add Bug ID like
the following
void attributes_invalid_input(void);
void test_invalid_input(void);
void
attributes_invalid_input (void)
{
cut_set_attributes("bug", "123");
}
void
test_invalid_input (void)
{
cut_assert_equal("OK", get_input());
}
In the above example, test_invalid_input test has an
attribute that the test is for Bug #123.
You need to define a function whose name is
"attributes_#{TEST_NAME - 'test_' PREFIX}" to add
attributes to a test. In the above example, attributes set
function, "attributes_invalid_input", is defined to set
"bug" attribute to "test_invalid_input" test.
=== Template
The following is a template of test.
#include <cutter.h>
#include "HEADER_FILE_OF_YOUR_PROGRAM"
void test_condition(void);
void test_strstr(void);
static int condition = 0;
void
cut_setup (void)
{
condition = 1;
}
void
cut_teardown (void)
{
condition = 0;
}
void
test_condition(void)
{
cut_set_message("The condition value should be set to 1 in cut_setup()");
cut_assert_equal_int(1, condition);
...
}
void
test_strstr(void)
{
cut_assert_equal_string("sub-string",
strstr("string sub-string", "sub"));
...
}
== Thanks
* Kazumasa Matsunaga: reported a build bug.
* Daijiro MORI: reported bugs.
* UNNO Hideyuki:
* reported a document bug.
* assisted Solaris install document.
* gunyara-kun: suggested API design.
* Yamakawa Hiroshi: reported works on Cygwin.
* Yoshinori K. Okuji:
* reported locale related bugs.
* suggested a new feature.
* Zed Shaw: reported bugs.
* Romuald Conty: reported a document bug.
* Romain Tartière:
* reported bugs.
* suggested improvements.
* Ilya Barygin:
* reported bugs in test.
* Hiroaki Nakamura:
* reported a bug on CentOS.
* Tobias Gruetzmacher:
* fixed a GTK+ test runner bug.