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 files 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 = Test::DBIx::Class::Schema->new({ # required dsn => ’dbi:Pg:dbname=mydb’, namespace => ’MyDB::Schema’, moniker => ’SomeTable’, # optional username => ’some_user’, password => ’opensesame’, }); Mostly Lazy DBIx::Class Testing Net-A-Porter
Introduction Test::DBIx::Class::Schema Future Finally An example (config) # tell it what to test $schematest->methods({ columns => [ qw( id name ) ], relations => [ qw( foo ) ], custom => [ 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 don’t get Functional Testing Mostly Lazy DBIx::Class Testing Net-A-Porter
Introduction Test::DBIx::Class::Schema Future Finally Benefits only maintaining a list (or three) lots of sanity checking find out if someone deletes columns from the database upgrading ’TDCS’ improves *.t files for free Mostly Lazy DBIx::Class Testing Net-A-Porter
Introduction Test::DBIx::Class::Schema Future Finally Recommendations Test one table/class per file 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 aren’t 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: github.com/chiselwright Module: metacpan.org/release/Test-DBIx-Class-Schema github.com/chiselwright/test-dbix-class-schema Mostly Lazy DBIx::Class Testing Net-A-Porter

YAPC::EU::2011 - Mostly Lazy DBIx::Class Testing

  • 1.
    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
  • 2.
    Introduction Test::DBIx::Class::Schema Future Finally In A Nutshell DBIx::Class schema sanity checking tests Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 3.
    Introduction Test::DBIx::Class::Schema Future Finally Why? Ongoing Quest To Be As LAZY As Possible Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 4.
    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
  • 5.
    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
  • 6.
    Introduction Test::DBIx::Class::Schema Future Finally Non-Lazy What about . . . ? relationships custom methods Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 7.
    Introduction Test::DBIx::Class::Schema Future Finally Non-Lazy Decide to test something new? How many .t files do you need to edit? More than zero? Too much work!! Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 8.
    Introduction Test::DBIx::Class::Schema Future Finally Getting Lazy Test::DBIx::Class::Schema Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 9.
    Introduction Test::DBIx::Class::Schema Future Finally Test::DBIx::Class::Schema My Attempt At Laziness Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 10.
    Introduction Test::DBIx::Class::Schema Future Finally An example (setup) my $schematest = Test::DBIx::Class::Schema->new({ # required dsn => ’dbi:Pg:dbname=mydb’, namespace => ’MyDB::Schema’, moniker => ’SomeTable’, # optional username => ’some_user’, password => ’opensesame’, }); Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 11.
    Introduction Test::DBIx::Class::Schema Future Finally An example (config) # tell it what to test $schematest->methods({ columns => [ qw( id name ) ], relations => [ qw( foo ) ], custom => [ qw( some_method ) ], resultsets => [ qw( ) ], }); Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 12.
    Introduction Test::DBIx::Class::Schema Future Finally An example (running) $schematest->run_tests(); Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 13.
    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
  • 14.
    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
  • 15.
    Introduction Test::DBIx::Class::Schema Future Finally You don’t get Functional Testing Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 16.
    Introduction Test::DBIx::Class::Schema Future Finally Benefits only maintaining a list (or three) lots of sanity checking find out if someone deletes columns from the database upgrading ’TDCS’ improves *.t files for free Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 17.
    Introduction Test::DBIx::Class::Schema Future Finally Recommendations Test one table/class per file Use Test::Aggregate Factor out ->new call for $schema Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 18.
    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
  • 19.
    Introduction Test::DBIx::Class::Schema Future Finally Did It Work? YES! IMNSHO Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 20.
    Introduction Test::DBIx::Class::Schema Future Finally What Next? Wishlist relationship reciprocity relationships that are coderefs db columns that aren’t in the schema? tie-in with DBIx::Class::Schema::Loader Mostly Lazy DBIx::Class Testing Net-A-Porter
  • 21.
    Introduction Test::DBIx::Class::Schema Future Finally End Credits QUESTIONS? Me: chisel.wright@net-a-porter.com CPANID: CHISEL github: github.com/chiselwright Module: metacpan.org/release/Test-DBIx-Class-Schema github.com/chiselwright/test-dbix-class-schema Mostly Lazy DBIx::Class Testing Net-A-Porter