Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is Perl unit-testing only for modules, not programs?

Tags:

testing

perl

The docs I find around the ’net and the book I have, Perl Testing, either say or suggest that unit-testing for Perl is usually done when creating modules.

Is this true? Is there no way to unit-test actual programs using Test::More and cousins?

like image 722
Lazloman Avatar asked Feb 03 '12 19:02

Lazloman


People also ask

What is the difference between unit testing and module testing?

Unit tests are a set of tests which are written by a developer at the time of software development process. Module tests are a set of tests which are written by a tester after coding has completed by a developer for the particular module.

What unit testing is used for?

The main objective of unit testing is to isolate written code to test and determine if it works as intended. Unit testing is an important step in the development process, because if done correctly, it can help detect early flaws in code which may be more difficult to find in later testing stages.

Does every method need a unit test?

(Not) Testing Get/Set Methods Every behavior should be covered by a unit test, but every method doesn't need its own unit test. Many developers don't test get and set methods, because a method that does nothing but get or set an attribute value is so simple that it is considered immune to failure.

What is needed for unit testing of a module?

Designing the test is the first thing to do before conducting a module test. For preparing the test case, you must consider two essential factors- module specification and source code under test. It is imperative to analyze the code logic for the module under test. You can do that by using multiple white box methods.


1 Answers

Of course you can test scripts using Test::More. It's just harder, because most scripts would need to be run as a separate process from which you capture the output, and then test it against expected output.

This is why modulinos (see chapter 17 in: brian d foy, Mastering Perl, second edition, O'Reilly, 2014) were developed. A modulino is a script that can also be used as a module. This makes it easier to test, as you can load the modulino into your test script and then test its functions like you would a regular module.

The key feature of a modulino is this:

#! /usr/bin/perl
package App::MyName; # put it in a package

run() unless caller; # Run program unless loaded as a module

sub run {
  ... # your program here
}

The function doesn't have to be called run; you could use main if you're a C programmer. You'd also normally have additional subroutines that run calls as needed.

Then your test scripts can use require "path/to/script" to load your modulino and exercise its functions. Since many scripts involve writing output, and it's often easier to print as you go instead of doing print sub_that_returns_big_string(), you may find Test::Output useful.

like image 64
cjm Avatar answered Nov 03 '22 00:11

cjm