Test::Class is Perl module that allows you to write jUnit or xUnit style tests. Recently I became the maintainer of the module. The first thing I did, actually even before becomming the maintainer, is setting up a CI system using GitHub Actions that will test the code on various versions of Perl.
Then it will proceed and test some of the modules that depend on Test::Class to make sue the changes I make don't break those modules.
Let me also include here the configuration file.
examples/workflows/test_class.yml
name: CI
on:
push:
branches: '*'
pull_request:
branches: '*'
schedule:
- cron: '42 5 * * *'
# Build the module on several versions of Perl using an image that already has a lot of modules installed.
# This will provide a fast feedback if a commit broke anything in the unit-tests.
# Using 5.32 we also create the tar.gz file and save it as an artifact.
#
# Once this job passed we launch several jobs in parallel
# 1) Verify that we can install the created distribution on many versions of Perl using a Linux Docker image with vanilla Perl.
# 2) Verify that we can install the created distribution on native Linux/Windows/OSX.
# 3) Verify that the changes won't break some selected downstream distributions.
# We run the job on every push and every pull-request.
# We also run them periodically to makes sure none of changes in our dependencies break it even during the days when
# the developers of this project rest.
jobs:
build-in-container:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
perl-version:
- '5.32'
- '5.30'
- '5.20'
container:
image: perldocker/perl-tester:${{ matrix.perl-version }} # https://hub.docker.com/r/perldocker/perl-tester
name: Build on Linux with Perl ${{ matrix.perl-version }}
steps:
- uses: actions/checkout@v2
- name: Regular tests
run: |
perl -v
cpanm --notest Contextual::Return
perl Makefile.PL
make
make test
- name: Install Extra dependencies
run: |
for module in Test::Pod::Coverage Test::Perl::Critic Pod::Simple Test::Pod Perl::MinimumVersion Test::MinimumVersion Test::Spelling File::Which Test::Perl::Critic
do
echo Start installing $module
date
set -x
cpanm --notest $module
perl -M$module -e "print qq{$module \$$module::VERSION\n}"
echo Finished installing $module
echo "==================="
done
- name: Release tests
run: |
RELEASE_TESTING=1 prove -l t/pod.t
RELEASE_TESTING=1 prove -l t/documented.t
RELEASE_TESTING=1 prove -l t/pmv.t
RELEASE_TESTING=1 prove -l t/spelling.t
RELEASE_TESTING=1 prove -l t/perlcritic.t
- name: Create release
if: ${{ matrix.perl-version == '5.32' }}
run: |
# Increase the version number by 0.000001 so in the reports we can be sure we are using the code to be released.
perl -i -p -e "s/VERSION\s*=\s*'(\d+\.\d+)'/q{VERSION = '} . (\$1 + 0.01) . q{'}/e" lib/Test/*.pm lib/Test/Class/*.pm
perl Makefile.PL
make
make manifest
make dist
- name: Archive artifacts
if: ${{ matrix.perl-version == '5.32' }}
uses: actions/upload-artifact@v2
with:
name: the-release
path: |
Test-Class-*.tar.gz
test-on-clean-perl:
runs-on: ubuntu-latest
needs: build-in-container
strategy:
fail-fast: false
matrix:
perl-version:
- "5.32"
- "5.30"
- "5.28"
- "5.26"
- "5.24"
- "5.22"
- "5.20"
- "5.18"
- "5.16"
- "5.14"
- "5.12"
- "5.10"
container:
image: perl:${{ matrix.perl-version }}
name: Test on ${{ matrix.perl-version }}
steps:
- name: Download a single artifact
uses: actions/download-artifact@v2
with:
name: the-release
- name: Install Module
run: |
perl -v
cpanm Test-Class-*.tar.gz
test-downstream:
runs-on: ubuntu-latest
needs: build-in-container
strategy:
fail-fast: false
matrix:
perl-version:
- '5.32'
container:
image: perldocker/perl-tester:${{ matrix.perl-version }} # https://hub.docker.com/r/perldocker/perl-tester
name: Test downstream on ${{ matrix.perl-version }}
steps:
- name: Download a single artifact
uses: actions/download-artifact@v2
with:
name: the-release
- name: Install Module
run: |
perl -v
cpanm Test-Class-*.tar.gz
- name: Testing selected downstream modules
run: |
echo "Reverse dependencies ordered by River stage"
for module in CHI Test::Class::Most MooseX::Getopt::Usage Ubic
do
echo Start testing $module
date
set -x
cpanm --notest --installdeps $module
cpanm --verbose $module
echo Finish testing $module
echo "==================="
done
#cpanm --verbose Debug::Client # currently failing
#cpanm --verbose Math::GSL # needs gsl-config
#cpanm --verbose EntityModel # fails
echo "Other reverse dependencies listed by ABC"
for module in App::GitGot App::Scaffolder::Puppet cPanel::APIClient Class::Mockable File::Random Mail::Pyzor Test::Class::Simple Business::FO::Postalcode Business::DK::Postalcode
do
echo Start testing $module
date
set -x
cpanm --notest $module
cpanm --verbose --test-only $module
echo Finished testing $module
echo "==================="
done
#cpanm --verbose Analizo # failed
#cpanm --verbose App::PRT # failed
#cpanm --verbose Term::CLI # needs Term::ReadLine::Gnu
native:
needs: build-in-container
strategy:
fail-fast: false
matrix:
runner: [ubuntu-latest, macos-latest, windows-latest]
perl: [ '5.32' ]
runs-on: ${{matrix.runner}}
name: Native on OS ${{matrix.runner}} Perl ${{matrix.perl}}
steps:
- name: Download a single artifact
uses: actions/download-artifact@v2
with:
name: the-release
- name: Set up perl
uses: shogo82148/actions-setup-perl@v1
with:
perl-version: ${{ matrix.perl }}
distribution: ${{ ( startsWith( matrix.runner, 'windows-' ) && 'strawberry' ) || 'default' }}
- name: Install Module on Windows
if: ${{ startsWith( matrix.runner, 'windows-' ) }}
run: |
perl -v
Set-Content -NoNewline "cpanm --verbose " install.bat
Get-ChildItem -Name Test-Class* >> install.bat
dir
type install.bat
.\install.bat
perl -MTest::Class -e "print qq{$Test::Class::VERSION\n}"
- name: Install Module on Linux and OSX
if: ${{ ! startsWith( matrix.runner, 'windows-' ) }}
run: |
cpanm --verbose Test-Class-*.tar.gz
perl -MTest::Class -e 'print qq{$Test::Class::VERSION\n}'