Ptest

From Yocto Project
Revision as of 08:30, 16 January 2013 by BjornStenberg (talk | contribs)
Jump to navigationJump to search

Introduction

Ptest (package test) is a concept for building, installing and running the test suites that are included in many packages, and producing a consistent output format.

Adding ptest to your build

Ptest is enabled in your build by adding "ptest" to the DISTRO_FEATURES variable. This will cause ptest-enabled packages to build and install the test suite in /usr/lib/<package>/ptest.

Running ptest

The "ptest-runner" package installs a "ptest-runner" shell script which loops through all installed ptest test suites and runs them in sequence.

Adding ptest support to a package

What constitutes a ptest?

A ptest must at minimum contain two things: run-ptest and the actual test.

run-ptest is a minimal shell script that starts the test suite. Note: It must not contain the test suite, only start it!

The test can be anything, from a simple shell script running a binary and checking its output to an elaborate system of test binaries and data files.

One major point of ptest is to consolidate the output format of all tests into a single common format. The format selected is the automake "simple test" format:

  result: testname

Where "result" is one of PASS, FAIL or SKIP and "testname" can be any identifying string. (The the same format used by Automake: http://www.gnu.org/software/automake/manual/automake.html#Simple-Tests)

General recipe preparations

First, add "ptest" to the "inherit" line in the package recipe.

If a test adds build-time or run-time dependencies to the package which are not there normally (such as requiring "make" to run the test suite), add those with a -ptest suffix, like this:

  RDEPENDS_${PN}-ptest += "make"

Building the test suite

Few packages support cross-compiling their test suites, so this is something we typically have to add.

Many automake-based packages compile and run the test suite in a single command: "make check". This doesn't work when cross-compiling (since we need to build on host and run on target), so we need to split that into two targets: One for building the test and one for running it. Our build of automake comes with a patch which does this, so packages using the plain "make check" arrangement from automake get this automatically.

Now add a do_compile_append function to build the test suite:

  do_compile_append() {
     if [ "${PN}" = "${BPN}" -a ${PTEST_ENABLED} = "1" ]; then
        oe_runmake buildtest-TESTS
     fi
  }

Installing the test suite

The ptest.bbclass contains a ptest_do_install function which copies the required "run-ptest" file and runs "make install-ptest" if there is such a target in the top-level Makefile. This provides a standardized install method to use in the package do_install_append function:

  do_compile_append() {
     ptest_do_install
  }