You are on page 1of 21

Introduction

Test::DBIx::Class::Schema

Future

Finally

Mostly Lazy DBIx::Class Testing


Chisel Wright
Net-A-Porter

2011

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

In A Nutshell

DBIx::Class schema sanity checking tests

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Why?

Ongoing Quest To Be As LAZY As Possible

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Non-Lazy

# are specific columns defined? my $thingy = $model->resultset(BigBagOfFail); my @columns = qw/id name department/); can_ok($thingy, @columns);

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Non-Lazy

foreach my $column (@columns) { try { $thingy->$column(); ok("called $column()"); } catch($e) { diag $e; fail("$column() failed"); } }

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Non-Lazy

What about . . . ? relationships custom methods

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Non-Lazy

Decide to test something new? How many .t les do you need to edit? More than zero? Too much work!!

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Getting Lazy

Test::DBIx::Class::Schema

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Test::DBIx::Class::Schema

My Attempt At Laziness

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

An example (setup)

my $schematest # required dsn => namespace => moniker => # optional username => password => });

= Test::DBIx::Class::Schema->new({ dbi:Pg:dbname=mydb, MyDB::Schema, SomeTable, some_user, opensesame,

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

An example (cong)

# tell it what to test $schematest->methods({ columns => [ qw( id name ) ], relations custom => [ qw( foo ) ], => [ qw( some_method ) ],

resultsets => [ qw( ) ], });

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

An example (running)

$schematest->run_tests();

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

You get. . .

can ok( @columns ) can ok( @relations ) can ok( @customs ) # row subs can ok( @resultsets ) # rs subs

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

You also get. . .

$thing->$column called ok $thing->$relation called ok test that $column exists in the database ensure related-source exists test self.* and foreign.* columns for relationships test proxied relationships PASS/FAIL for relationship validity

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

You dont get

Functional Testing

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Benets

only maintaining a list (or three) lots of sanity checking nd out if someone deletes columns from the database upgrading TDCS improves *.t les for free

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Recommendations

Test one table/class per le Use Test::Aggregate Factor out ->new call for $schema

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

In The Real World

on the CPAN since 2008 used in production code since 2009 recent burst of improvements
never used to test empty tables - OOPS! used to be quite basic

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

Did It Work?

YES!
IMNSHO

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

What Next?

Wishlist relationship reciprocity relationships that are coderefs db columns that arent in the schema? tie-in with DBIx::Class::Schema::Loader

Mostly Lazy DBIx::Class Testing

Net-A-Porter

Introduction

Test::DBIx::Class::Schema

Future

Finally

End Credits

QUESTIONS?
Me: chisel.wright@net-a-porter.com CPANID: CHISEL github: Module: metacpan.org/release/Test-DBIx-Class-Schema github.com/chiselwright/test-dbix-class-schema github.com/chiselwright

Mostly Lazy DBIx::Class Testing

Net-A-Porter