robrwo / Test-Roo-DataDriven

Use data-driven test files with Test-Roo
0 stars 1 forks source link
data-driven-tests perl-module

NAME

Test::Roo::DataDriven - simple data-driven tests with Test::Roo

VERSION

version v0.4.2

SYNOPSIS

package MyTests

use Test::Roo;

use lib 't/lib';

with qw/
  MyClass::Test::Role
  Test::Roo::DataDriven
  /;

1;

package main;

use Test::More;

MyTests->run_data_tests(
  files   => 't/data/myclass',
  recurse => 1,
);

done_testing;

DESCRIPTION

This class extends Test::Roo for data-driven tests that are kept in separate files.

This is useful when a test script has too many test cases, so that it is impractical to include all of the cases in a single test script.

It allows different tests to share the test cases.

It also makes it easier to have testers with very little Perl knowledge to write tests.

METHODS

run_data_tests

This is called as a class method, and is a wrapper around the run_tests method. It takes the following arguments:

parse_data_file

my $data = $class->parse_data_file( $file );

This is the default parser for the "Data Files".

Added in v0.2.0.

Data Files

Unless the default "parser" is changed, the data files are simple Perl scripts that return a hash reference (or array reference of hash references) of constructor values for the Test::Roo class.

For example,

#!/perl

use Test::Deep;

+{
  description => 'Sample test',
  params => {
    choices => bag( qw/ first second / ),
    page    => 1,
  },
};

In the above example, we are using the bag function from Test::Deep, so we have to import the module into our test case to ensure that it compiles correctly.

Note that there is no performance loss in repeating module imports in every test case. However, you may want to use a module like ToolSet to import common packages.

Data files can contain multiple test cases:

#!/perl

use Test::Deep;

[

  {
    description => 'Sample test',
    params => {
      choices => bag( qw/ first second / ),
      page    => 1,
    },
  },

  {
    description => 'Another test',
    params => {
      choices => bag( qw/ second third / ),
      page    => 2,
    },
  },

];

The data files can also include scripts to generate test cases:

#!/perl

sub generate_cases {
  ...
};

[
  generate_cases( page => 1 ),
  generate_cases( page => 2 ),
];

Each data file is loaded into a unique namespace. However, there is nothing preventing the datafiles from modifying variables in other namespaces, or even doing anything else.

If the data file is successfully parsed, then the namespace is unloaded.

KNOWN ISSUES

See also "BUGS" below.

Skipping test cases

Skipping a test case in your test class as per Test::Roo::Cookbook, e.g.

sub BUILD {
  my ($self) = @_;

  ...

  plan skip_all => "Cannot test" if $some_condition;

}

will stop all remaining tests from running.

Instead, skip tests before the setup:

before setup => sub {
  my ($self) = @_;

  ...

  plan skip_all => "Cannot test" if $some_condition;

};

Prerequisite Scanners

Prerequisite scanners used for build tools may not recognise modules used in the "Data Files". To work around this, use the modules as well in the test class or explicitly add them to the distribution's metadata.

SEE ALSO

Test::Roo

SOURCE

The development version is on github at https://github.com/robrwo/Test-Roo-DataDriven and may be cloned from git://github.com/robrwo/Test-Roo-DataDriven.git

BUGS

Please report any bugs or feature requests on the bugtracker website https://github.com/robrwo/Test-Roo-DataDriven/issues

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

AUTHOR

Robert Rothenberg rrwo@cpan.org

The initial development of this module was sponsored by Science Photo Library https://www.sciencephoto.com.

CONTRIBUTORS

COPYRIGHT AND LICENSE

This software is Copyright (c) 2017-2019 by Robert Rothenberg.

This is free software, licensed under:

The Artistic License 2.0 (GPL Compatible)