Perl - Test::More


Здесь главное не начать подгонять код под тесты, чтобы “все работало”. Тогда будет счастье. Ну и не писать бесполезных тестов. justnoxx • 4 года назад

Синтаксис

План

Чтобы вывести кол-во успешных/неуспешных тестов, нужно указать no_plan в use


use Test::More  qw| no_plan |;

В таком случает, модуль сам посчитает

Либо в конце скрипта


use Test::More;
...
done_testing();

Или самому сказать сколько планировалось обработать тестов


use Test::More  'tests' => 2;

Основные функции модуля

ok

    ok($got eq $expected, $test_name)

ok проверяет булево значение


use Test::More      qw| no_plan |;

ok('Привет' eq 'Привет', 'Проверка строки');
ok( 1 + 1 == 3, '1 + 1 = 3');

$ perl script.pl 
ok 1 - Проверка строки
not ok 2 - 1 + 1 = 3
#   Failed test '1 + 1 = 3'
#   at script.pl line 7.
1..2
# Looks like you failed 1 test of 2.

is, isnt

    is  ($got eq $expected, $test_name)
    isnt($got eq $expected, $test_name)

Сравнение на eq и ne


use Test::More      qw| no_plan |;

is('Привет', 'Привет', 'Проверка eq');
isnt('Привет', 'Пока', 'Проверка ne');

$ perl script.pl 
ok 1 - Проверка eq
ok 2 - Проверка ne
1..2

По сравнению с ok, is и isnt предосталяют подробный отчет


use Test::More      qw| no_plan |;
is('test', 'more', 'fail test!!!');

$ perl script.pl 
not ok 1 - fail test!!!
#   Failed test 'fail test!!!'
#   at script.pl line 6.
#          got: 'test'
#     expected: 'more'
1..1
# Looks like you failed 1 test of 1.

like, unlike

    like  ($got, qr/expected/, $test_name)
    unlike($got, qr/expected/, $test_name)

Сравнение по регулярке


use Test::More      qw| no_plan |;

like('hello, world!', qr/hell/, 'hell is matched');

$ perl script.pl 
ok 1 - hell is matched
1..1

use Test::More      qw| no_plan |;

unlike('hello, world!', qr/you/, 'you is not matched');

$ perl script.pl 
ok 1 - you is not matched
1..1

cmp_ok

    cmp_ok($got, $operator, $expected, $test_name)

Сравнение с переданным оператором


use Test::More      qw| no_plan |;

cmp_ok('1', '<', 2, "Test cmp_ok");

$ perl script.pl 
ok 1 - Test cmp_ok
1..1

pass, fail

    pass($test_name)
    fail($test_name)

Тест пройден(pass) или не пройден(fail)

Видимо используются для принудительного указания


use Test::More      qw| no_plan |;

pass('test 1 ok');
pass('test 2 ok');
fail('test 3 ok');
fail('test 4 ok');

$ perl script.pl 
ok 1 - test 1 ok
ok 2 - test 2 ok
not ok 3 - test 3 ok
#   Failed test 'test 3 ok'
#   at script.pl line 8.
not ok 4 - test 4 ok
#   Failed test 'test 4 ok'
#   at script.pl line 9.
1..4
# Looks like you failed 2 tests of 4.

саб тесты


subtest "Название теста" => sub {
    # Тест
};

Тест ООП

TODO

can_ok

    can_ok($module, @methods);
    can_ok($object, @methods);

isa_ok

Модули

use_ok

require_ok

Сложные структуры

is_deeply

    is_deeply($got, $expected, $test_name);

Проверяет структуру


use Test::More      qw| no_plan |;

my $got = {
    test  => [{t => 1,  q  => 'w'}],
    test2 => [{t2 => 1, q1 => 'w'}],
};

my $expected = {
    test => { test2 => 2 }
};

is_deeply($got, $expected, "test structure");

$ perl script.pl 
not ok 1 - test structure
#   Failed test 'test structure'
#   at script.pl line 15.
#     Structures begin differing at:
#          $got->{test} = ARRAY(0x18769c0)
#     $expected->{test} = HASH(0x1858f30)
1..1
# Looks like you failed 1 test of 1.

Диагностика

diag

note

Разное

TODO: BLOCK

SKIP: BLOCK

todo_skip

Debugging tests


perl -d -Ilib t/mytest.t