53
MR::Go::Admin::Test

«Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Embed Size (px)

Citation preview

Page 1: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

MR::Go::Admin::Test

Page 2: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Go::Admin

Go

Page 3: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Go::Admin

Go

Go

Go

Go Go Go

Go

Go

GoGo

Page 4: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

xUnit

Page 5: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

xUnit

SUnit

Page 6: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

xUnit

SUnitJUnit

Page 7: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

xUnit

SUnitJUnitunittest

Page 8: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

xUnit

SUnitJUnitunittestrunit

Page 9: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

xUnit

SUnitJUnitunittestrunitrspec

Page 10: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

xUnit

SUnitJUnitunittestrunitrspecTest::Class

Page 11: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

xUnit Test PatternsАвтор: Месарош Джерард

Page 12: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

package MR::Go::Admin::User::Test;

sub setup : Test(setup){ my ($self) = @_; $self->{user} = create_user();}

sub test_delete : Test(2){ my ($self) = @_; $self->{user}->delete(); # ...}

Test::Class

Page 13: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Именование классов

MR::Go::Admin::User → MR::Go::Admin::User::Test

Page 14: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Именование классов

MR::Go::Admin::User → MR::Go::Admin::User::Test

*::Test запрещены не в тестах

Page 15: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Именование классов

MR::Go::Admin::User → MR::Go::Admin::User::Test

*::Test запрещены не в тестах

MR::Go::Admin::User::Test::_FakeUser

Page 16: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Именование методов

delete → deletedelete → delete__already_deleted_delete → delete

delete → test_deletedelete → test_delete__already_deleted_delete → test__delete__already_deleted

Двойноеподчеркивание

Page 17: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

https://goo.gl/tBIRwZ

sub _set_status { my ($self, $status) = @_; $self->_status($status); $self->_history->add($status); $self->_log('...');}

sub set_status_processing { return shift->_set_status('processing');}

sub set_status_processed { return shift->_set_status('processing');}

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

Page 18: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Структуратеста

Page 19: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Структуратеста

ArrangeActAssert

Page 20: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Структуратеста

ArrangeActAssert

SetupExerciseVerifyTeardown

Page 21: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

База

Page 22: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

БазаПоддельная база

Page 23: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

БазаПоддельная базаSQLite

Page 24: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

БазаПоддельная базаSQLiteНастоящая база

Page 25: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

БазаПоддельная базаSQLiteНастоящая база

Test::DBIx::Class

Page 26: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Fixtures

Page 27: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Fixtures

Копияреальной базы

Page 28: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Fixtures

Копияреальной базыСлепокреальной базы

Page 29: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Fixtures

Копияреальной базыСлепокреальной базыИскусственноподготовленныйслепок

Page 30: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Fixtures

Копияреальной базыСлепокреальной базыИскусственноподготовленныйслепокПустая база

Page 31: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Fixtures

Копияреальной базыСлепокреальной базыИскусственноподготовленныйслепокПустая базаФабрики

Page 32: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

package MR::Go::Admin::UserFactory;use base qw(DBIx::Class::Factory); __PACKAGE__->resultset(MR::Go::Admin:: Schema->resultset('User'));__PACKAGE__->fields({ name => __PACKAGE__->seq(sub {'User #' . shift}), city => __PACKAGE__->related_factory('MR::Go::Admin::CityFactory'), status => 'new',});

DBIx::Class::Factory

Page 33: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

package MR::Go::Admin::UserFactory;use base qw(DBIx::Class::Factory); __PACKAGE__->resultset(MR::Go::Admin:: Schema->resultset('User'));__PACKAGE__->fields({ name => __PACKAGE__->seq(sub {'User #' . shift}), city => __PACKAGE__->related_factory('MR::Go::Admin::CityFactory'), status => 'new',});

https://goo.gl/tBIRwZ

DBIx::Class::Factory

Page 34: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Фабрика в деле

sub set_status : Test(1){ my ($self) = @_;

my $task = MR::Admin::Go::Test::Factory::Task->create();

$task->set_status('TEST_NEW_STATUS'); is($task->status, 'TEST_NEW_STATUS', 'status'); return;}

Page 35: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Транзакции

Page 36: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Транзакцииsetup = BEGIN

Page 37: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Транзакцииsetup = BEGINteardown = ROLLBACK

Page 38: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Транзакцииsetup = BEGINteardown = ROLLBACK$self->break_db();

Page 39: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Testdoubles

Page 40: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Testdoubles

Mock

Page 41: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Testdoubles

MockSpy

Page 42: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Testdoubles

MockSpyStub

Page 43: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Testdoubles

MockSpyStubDummy

Page 44: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Моки с магией

my $mock = Test::MockModule->new('MR::Go::Admin::SMS');my $sent = 0;$mock->mock(_send => sub { $sent = 1 });

Page 45: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Моки с магией

local *MR::Go::Admin::SMS::_send = sub { $sent++ };

my $mock = Test::MockModule->new('MR::Go::Admin::SMS');my $sent = 0;$mock->mock(_send => sub { $sent = 1 });

Page 46: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Моки без магии

package MR::Go::Admin::User::Test::_FakeUser;

MR::Go::Admin::User::Test::_FakeUser->new();

bless $user, 'MR::Go::Admin::User::Test::_FakeUser';

Page 47: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Моки без магии

has _logger => (default => sub { '...' });User->new({_logger => $fake_logger});

User->new({_message_size_limit => 42});

package MR::Go::Admin::User::Test::_FakeUser;

MR::Go::Admin::User::Test::_FakeUser->new();

bless $user, 'MR::Go::Admin::User::Test::_FakeUser';

Page 48: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Assertsis($node->children->count, 0, 'leaf node');

Page 49: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Assertsis($node->children->count, 0, 'leaf node');

is($rating, 42);

cmp_ok($status, 'eq', 'processed');

ok($user->deleted);

Page 50: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

is($node->children->count, 0, 'leaf node');

is($rating, 42);

cmp_ok($status, 'eq', 'processed');

ok($user->deleted);

Asserts

use Test::Deep;

Page 51: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

cmp_deeply( $users, bag($user1, $user2));

cmp_deeply( $user, methods( rating => 42, blocked => bool(0), ));

Test::Deep

Page 52: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

СпасибоВадим Пуштаев[email protected]

https://goo.gl/SNrhWp

ДизайнМаксим Гелета

Page 53: «Автотесты» Вадим Пуштаев, программист отдела внутренней разработки Поиска Mail.Ru

Бонус: ExportCatcher

{ package MR:Go::Admin::Test::_ExportCatcher;

use MR::Go::Admin::Schema; use Test::DBIx::Class;}