Difference between revisions of "Unit Module"

From BaseX Documentation
Jump to navigation Jump to search
m (table width adjustment)
Line 229: Line 229:
 
=Errors=
 
=Errors=
  
{| width='100%' class="wikitable" width="100%"
+
{| class="wikitable" width="100%"
! width="5%"|Code
+
! width="110"|Code
! width="95%"|Description
+
|Description
 
|-
 
|-
 
|{{Code|UNIT0001}}
 
|{{Code|UNIT0001}}

Revision as of 09:49, 14 June 2013

This XQuery Module contains annotations and functions for performing Unit tests with XQuery.

Introduction

The more complex a software application grows, the more error-prone it gets. This is why testing frameworks have been developed, which provide a standardized, automatized way for testing software. The XUnit frameworks (such as SUnit or JUnit) allow testing of atomic unit of a program, such as single functions and algorithms.

This module borrows heavily from the existing frameworks: it introduces various new annotations for testing XQuery functions. Unit functions are provided to assert the validity of arbitrary conditions expressed in XQuery and to raise errors whenever a condition is not satisfied. Some additional functions exist to run all unit tests of the current module or a set of specified library modules.

Please note that this module is still in beta stage, and its functionality is still subject to change. Your feedback is welcome.

Conventions

Both functions and errors in this module are assigned to the http://basex.org/modules/unit namespace, which is statically bound to the unit prefix.

Annotations

%unit:test

Syntax %unit:test
%unit:test("expected", <ERROR>)
Summary With this annotation, a function can be marked as unit test. It will be evaluated whenever a test report is created for the module in which this function is located.
If an optional error code is specified and if the function expression does not raise that error, the test will fail.

%unit:before

Syntax %unit:before
Summary A function decorated with this annotation will be evaluated before each unit test.

%unit:after

Syntax %unit:after
Summary A function decorated with this annotation will be evaluated after each unit test.

%unit:before-module

Syntax %unit:before-module
Summary If a function is decorated with this annotation, it will be evaluated before all unit tests in the current module.

%unit:after-module

Syntax %unit:after-module
Summary If a function is decorated with this annotation, it will be evaluated after all unit tests in the current module.

%unit:ignore

Syntax %unit:ignore
%unit:ignore("message")
Summary If a function is decorated with this annotation, it will temporarily be ignored by the test suite runner.

Functions

unit:assert

Signatures unit:assert($test as item()*) as empty-sequence()
unit:assert($test as item()*, $message as xs:string) as empty-sequence()
Summary Asserts that the effective boolean value of the specified $test is true and returns an empty sequence. Otherwise, raises an error.
If the optional error $message can be specified as second argument.
Errors UNIT0001: the assertion failed, or an error was raised.

unit:fail

Signatures unit:fail($message as xs:string) as empty-sequence()
Summary Raises a unit error with the specified message.
Errors UNIT0001: default error raised by this function.

unit:test

Signatures unit:test() as element(testsuite)*
Summary Runs all functions in the current module that are annotated with unit annotations.
A test report is generated and returned, which resembles the format returned by other xUnit testing frameworks, such as the Maven Surefire Plugin.
Errors UNIT0002: a test function must have no arguments.
UNIT0003: a test function must not be updating.
UNIT0004: an annotation was declared twice.
UNIT0005: an annotation has invalid arguments.

unit:test-libraries

Signatures unit:test-libraries($uris as xs:string*) as element(testsuites)
Summary Runs all functions in the specified modules that are annotated with unit annotations.
A test report is generated and returned, which resembles the format returned by other xUnit testing frameworks, such as the Maven Surefire Plugin.
Errors UNIT0002: a test function must have no arguments.
UNIT0003: a test function must not be updating.
UNIT0004: an annotation was declared twice.
UNIT0005: an annotation has invalid arguments.

Example

The following XQuery main module creates a test report. It contains all available unit annotations:

Query:

(:~ Initializing function, which is called once before all tests. :)
declare
  %unit:before-module
  function local:before-all-tests() { ()
};

(:~ Initializing function, which is called once after all tests. :)
declare
  %unit:after-module
  function local:after-all-tests() { ()
};

(:~ Initializing function, which is called before each test. :)
declare
  %unit:before
  function local:before() { ()
};

(:~ Initializing function, which is called after each test. :)
declare
  %unit:after
  function local:after() { ()
};

(:~ Function demonstrating a successful test. :)
declare
  %unit:test
  function local:success-function() {
  unit:assert(1 + 2 = 3)
};

(:~ Function demonstrating a failure. :)
declare
  %unit:test
  function local:failure-function() {
  unit:assert(4 + 5 = 6)
};

(:~ Function demonstrating an expected error. :)
declare
  %unit:test("expected", "FORG0001")
  function local:expected-success() {
  ()
};

(:~ Function demonstrating an expected error. :)
declare
  %unit:test("expected", "FORG0001")
  function local:expected-error() {
  1 + <a/>
};

(:~ Function demonstrating an error. :)
declare
  %unit:test
  function local:error-function() {
  1 + <a/>
};

(:~ Skipping a test. :)
declare
  %unit:test %unit:ignore("Skipped!")
  function local:skipped-function() {
  ()
};

(: run all tests :)
unit:test()

Result:

<testsuite name="/path/to/tests.xq" time="PT0S" tests="6" failures="2" errors="1" skipped="1">
  <testcase name="success-function" time="PT0S"/>
  <testcase name="failure-function" time="PT0S">
    <failure message="Assertion failed." type="UNIT0001"/>
  </testcase>
  <testcase name="expected-success" time="PT0S">
    <failure message="Error expected." type="FORG0001"/>
  </testcase>
  <testcase name="expected-error" time="PT0S"/>
  <testcase name="error-function" time="PT0S">
    <error message="Invalid xs:double cast: ." type="FORG0001"/>
  </testcase>
  <testcase name="skipped-function" time="PT0S">
    <skipped message="Skipped!"/>
  </testcase>
</testsuite>

Errors

Code Description
UNIT0001 An assertion failed, or an error was raised.
UNIT0002 A test function must have no arguments.
UNIT0003 A test function must not be updating.
UNIT0004 An annotation was declared twice.
UNIT0005 An annotation has invalid arguments.

Changelog

This module was introduced with Version 7.7.