File: Introduction.pm

package info (click to toggle)
perl 5.42.0-2
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 128,392 kB
  • sloc: perl: 534,963; ansic: 240,563; sh: 72,042; pascal: 6,934; xml: 2,428; yacc: 1,360; makefile: 1,197; cpp: 208; lisp: 1
file content (293 lines) | stat: -rw-r--r-- 7,318 bytes parent folder | download | duplicates (2)
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
package Test2::Manual::Testing::Introduction;
use strict;
use warnings;

our $VERSION = '1.302210';

1;

__END__

=head1 NAME

Test2::Manual::Testing::Introduction - Introduction to testing with Test2.

=head1 DESCRIPTION

This tutorial is a beginners introduction to testing. This will take you
through writing a test file, making assertions, and running your test.

=head1 BOILERPLATE

=head2 THE TEST FILE

Test files typically are placed inside the C<t/> directory, and end with the
C<.t> file extension.

C<t/example.t>:

    use Test2::V0;

    # Assertions will go here

    done_testing;

This is all the boilerplate you need.

=over 4

=item use Test2::V0;

This loads a collection of testing tools that will be described later in the
tutorial. This will also turn on C<strict> and C<warnings> for you.

=item done_testing;

This should always be at the end of your test files. This tells L<Test2> that
you are done making assertions. This is important as C<test2> will assume the
test did not complete successfully without this, or some other form of test
"plan".

=back

=head2 DIST CONFIG

You should always list bundles and tools directly. You should not simply list
L<Test2::Suite> and call it done, bundles and tools may be moved out of
L<Test2::Suite> to their own dists at any time.

=head3 Dist::Zilla

    [Prereqs / TestRequires]
    Test2::V0 = 0.000060

=head3 ExtUtils::MakeMaker

    my %WriteMakefileArgs = (
      ...,
      "TEST_REQUIRES" => {
        "Test2::V0" => "0.000060"
      },
      ...
    );

=head3 Module::Install

    test_requires 'Test2::V0' => '0.000060';

=head3 Module::Build

    my $build = Module::Build->new(
        ...,
        test_requires => {
            "Test2::V0" => "0.000060",
        },
        ...
    );

=head1 MAKING ASSERTIONS

The most simple tool for making assertions is C<ok()>. C<ok()> lets you assert
that a condition is true.

    ok($CONDITION, "Description of the condition");

Here is a complete C<t/example.t>:

    use Test2::V0;

    ok(1, "1 is true, so this will pass");

    done_testing;

=head1 RUNNING THE TEST

Test files are simply scripts. Just like any other script you can run the test
directly with perl. Another option is to use a test "harness" which runs the
test for you, and provides extra information and checks the scripts exit value
for you.

=head2 RUN DIRECTLY

    $ perl -Ilib t/example.t

Which should produce output like this:

    # Seeded srand with seed '20161028' from local date.
    ok 1 - 1 is true, so this will pass
    1..1

If the test had failed (C<ok(0, ...)>) it would look like this:

    # Seeded srand with seed '20161028' from local date.
    not ok 1 - 0 is false, so this will fail
    1..1

Test2 will also set the exit value of the script, a successful run will have an
exit value of 0, a failed run will have a non-zero exit value.

=head2 USING YATH

The C<yath> command line tool is provided by L<Test2::Harness> which you may
need to install yourself from cpan. C<yath> is the harness written specifically
for L<Test2>.

    $ yath -Ilib t/example.t

This will produce output similar to this:

    ( PASSED )  job  1    t/example.t

    ================================================================================

    Run ID: 1508027909

    All tests were successful!

You can also request verbose output with the C<-v> flag:

    $ yath -Ilib -v t/example.t

Which produces:

    ( LAUNCH )  job  1    example.t
    (  NOTE  )  job  1    Seeded srand with seed '20171014' from local date.
    [  PASS  ]  job  1  + 1 is true, so this will pass
    [  PLAN  ]  job  1    Expected asserions: 1
    ( PASSED )  job  1    example.t

    ================================================================================

    Run ID: 1508028002

    All tests were successful!

=head2 USING PROVE

The C<prove> command line tool is provided by the L<Test::Harness> module which
comes with most versions of perl. L<Test::Harness> is dual-life, which means
you can also install the latest version from cpan.

    $ prove -Ilib t/example.t

This will produce output like this:

    example.t .. ok
    All tests successful.
    Files=1, Tests=1,  0 wallclock secs ( 0.01 usr  0.00 sys +  0.05 cusr  0.00 csys =  0.06 CPU)
    Result: PASS

You can also request verbose output with the C<-v> flag:

    $ prove -Ilib -v t/example.t

The verbose output looks like this:

    example.t ..
    # Seeded srand with seed '20161028' from local date.
    ok 1 - 1 is true, so this will pass
    1..1
    ok
    All tests successful.
    Files=1, Tests=1,  0 wallclock secs ( 0.02 usr  0.00 sys +  0.06 cusr  0.00 csys =  0.08 CPU)
    Result: PASS

=head1 THE "PLAN"

All tests need a "plan". The job of a plan is to make sure you ran all the
tests you expected. The plan prevents a passing result from a test that exits
before all the tests are run.

There are 2 primary ways to set the plan:

=over 4

=item done_testing()

The most common, and recommended way to set a plan is to add C<done_testing> at
the end of your test file. This will automatically calculate the plan for you
at the end of the test. If the test were to exit early then C<done_testing>
would not run and no plan would be found, forcing a failure.

=item plan($COUNT)

The C<plan()> function allows you to specify an exact number of assertions you
want to run. If you run too many or too few assertions then the plan will not
match and it will be counted as a failure. The primary problem with this way of
planning is that you need to add up the number of assertions, and adjust the
count whenever you update the test file.

C<plan()> must be used before all assertions, or after all assertions, it
cannot be done in the middle of making assertions.

=back

=head1 ADDITIONAL ASSERTION TOOLS

The L<Test2::V0> bundle provides a lot more than C<ok()>,
C<plan()>, and C<done_testing()>. The biggest tools to note are:

=over 4

=item is($a, $b, $description)

C<is()> allows you to compare 2 structures and insure they are identical. You
can use it for simple string comparisons, or even deep data structure
comparisons.

    is("foo", "foo", "Both strings are identical");

    is(["foo", 1], ["foo", 1], "Both arrays contain the same elements");

=item like($a, $b, $description)

C<like()> is similar to C<is()> except that it only checks items listed on the
right, it ignores any extra values found on the left.

    like([1, 2, 3, 4], [1, 2, 3], "Passes, the extra element on the left is ignored");

You can also used regular expressions on the right hand side:

    like("foo bar baz", qr/bar/, "The string matches the regex, this passes");

You can also nest the regexes:

    like([1, 2, 'foo bar baz', 3], [1, 2, qr/bar/], "This passes");

=back

=head1 SEE ALSO

L<Test2::Manual> - Primary index of the manual.

=head1 SOURCE

The source code repository for Test2-Manual can be found at
F<https://github.com/Test-More/test-more/>.

=head1 MAINTAINERS

=over 4

=item Chad Granum E<lt>exodist@cpan.orgE<gt>

=back

=head1 AUTHORS

=over 4

=item Chad Granum E<lt>exodist@cpan.orgE<gt>

=back

=head1 COPYRIGHT

Copyright Chad Granum E<lt>exodist@cpan.orgE<gt>.

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

See F<http://dev.perl.org/licenses/>

=cut