Re: Anyone want Test::Class::Moose?

Ovid <[email protected]>
Newsgroups gmane.comp.lang.perl.quality-assurance
Message-ID <[email protected]>
It's seriously alpha and has a nasty bug whereby an exception will halt the entire test suite.

I can fix that later, but I wanted to get something out for you folks.

https://github.com/Ovid/test-class-moose

 
Note that I elected to not use attributes because they're hard for *you* to customize, but it's trivial for you to override the get_test_classes() and get_test_methods() behavior for your own testing purposes.

More work needs to be done, but I think you'll be pleased at how short the code is to do this.

Cheers,
Ovid
--
Twitter - http://twitter.com/OvidPerl/
Buy my book - http://bit.ly/beginning_perl
Buy my other book - http://www.oreilly.com/catalog/perlhks/
Live and work overseas - http://www.overseas-exile.com/


>________________________________
> From: Jonathan Swartz <[email protected]>
>To: Ovid <[email protected]> 
>Cc: Perl QA <[email protected]> 
>Sent: Wednesday, 12 December 2012, 19:18
>Subject: Re: Anyone want Test::Class::Moose?
> 
>+1 from me! I like Test::Class and would welcome a Moose-ish variety.
>
>On Dec 12, 2012, at 9:51 AM, Ovid <[email protected]> wrote:
>
>> Hi all,
>> 
>> People keep asking me how to properly integrate Moose with Test::Class. I know about Test::Able and some alternatives, but I *generally* like Test::Class's interface (or maybe I'm just in a comfort zone). So I wrote my own Test::Class::Moose (it does not use Test::Class) and it uses subtests all the way down.
>> 
>> Every test class is one test. Every test method is a subtest in the test class. Every test in a test method is, well, one test in a test method. Here's a simple test class which, in turn, inherits from another test class (you get all of the functions from Test::Most along with Moose helper functions, if desired):
>> 
>>     package TestsFor::Basic::Subclass;                                                                                                                  
>>     use Test::Class::Moose parent => 'TestsFor::Basic';
>> 
>>     sub test_startup {
>>         my $test = shift;
>>         $test->next::method;
>>         # more startup here, but tests are not allowed
>>     }
>> 
>>     sub test_me {
>>         my $test  = shift;
>>         my $class = $test->this_class;
>>         ok 1, "I overrode my parent! ($class)";
>>     }
>> 
>>     before 'test_this_baby' => sub {
>>         my $test  = shift;
>>         my $class = $test->this_class;
>>         pass "This should run before my parent method ($class)";
>>     };
>> 
>>     sub this_should_not_run {
>>         fail "We should never see this test";
>>     }
>> 
>>     sub test_this_should_be_run {
>>         for ( 1 .. 5 ) {
>>             pass "This is test number $_ in this method";
>>         }
>>     }
>> 
>>     1;
>> 
>> Note that attributes are not required on the test methods. Methods which start with "test_" are considered test methods (you can override this behavior, of course). That includes the test control methods of test_startup(), test_setup(), and so on.
>> 
>> You should be able to consume roles or use the rest of Moose any way you think you should.
>> 
>> Here's how we load and run tests:
>> 
>>     use Test::Class::Moose::Load qw(t/lib);
>> 
>>     Test::Class::Moose->new({
>>         # timing on a class and method level
>>         show_timing => 0,
>>         # how many classes, methods and tests
>>         statistics  => 1,
>>     })->runtests; 
>> 
>> My main concern is that the nested subtests will annoy people:
>> 
>>     # 
>>     # Executing tests for TestsFor::Basic::Subclass
>>     #
>>         # TestsFor::Basic::Subclass->test_me()
>>             ok 1 - I overrode my parent! (TestsFor::Basic::Subclass)
>>             1..1
>>         ok 1 - test_me
>>         # TestsFor::Basic::Subclass->test_this_baby()
>>             ok 1 - This should run before my parent method (TestsFor::Basic::Subclass)
>>             ok 2 - whee! (TestsFor::Basic::Subclass)
>>             1..2
>>         ok 2 - test_this_baby
>>         # TestsFor::Basic::Subclass->test_this_should_be_run()
>>             ok 1 - This is test number 1 in this method
>>             ok 2 - This is test number 2 in this method
>>             ok 3 - This is test number 3 in this method
>>             ok 4 - This is test number 4 in this method
>>             ok 5 - This is test number 5 in this method
>>             1..5
>>         ok 3 - test_this_should_be_run
>>         1..3
>>     ok 1 - TestsFor::Basic::Subclass
>>     # 
>>     # Executing tests for TestsFor::Basic
>>     # 
>>         # TestsFor::Basic->test_me()
>>             ok 1 - test_me() ran (TestsFor::Basic)
>>             ok 2 - this is another test (TestsFor::Basic)
>>             1..2
>>         ok 1 - test_me
>>         # TestsFor::Basic->test_this_baby()
>>             ok 1 - whee! (TestsFor::Basic)
>>             1..1
>>         ok 2 - test_this_baby
>>         1..2
>>     ok 2 - TestsFor::Basic
>>     1..2
>>     # Test classes:    2
>>     # Test methods:    5
>>     # Total tests run: 11
>>     ok
>>     All tests successful.
>>     Files=1, Tests=2,  2 wallclock secs
>>     Result: PASS
>> 
>> So, does this look useful for folks? Is there anything you would change? (It's trivial to assert plans for classes and the entire test suite rather than rely on done_testing(), but I haven't done that yet).
>> 
>> Cheers,
>> Ovid
>> --
>> Twitter - http://twitter.com/OvidPerl/
>> Buy my book - http://bit.ly/beginning_perl
>> Buy my other book - http://www.oreilly.com/catalog/perlhks/
>> Live and work overseas - http://www.overseas-exile.com/
>
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.