Changes

Jump to navigation Jump to search
1,327 bytes added ,  11:54, 27 July 2020
m
Text replacement - "==%" to "=="
=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 automated way for of testing software. The [httphttps://en.wikipedia.org/wiki/XUnit XUnit] frameworks (such as SUnit or JUnit) allow testing of atomic unit units of a program, such as single functions and algorithms.
This module borrows heavily from the existing frameworks: it provides various 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.
=Conventions=
All annotations, functions and errors in this module are assigned to the {{Code|<code><nowiki>http://basex.org/modules/unit}} </nowiki></code> namespace, which is statically bound to the {{Code|unit}} prefix.<br/>
=Annotations=
==%unit:test==
{| width='100%'
|-
| width='120' | '''Syntax'''
|{{Code|%unit:test}}<br/>{{Code|%unit:test("expected", <ERROR>CODE)}}
|-
| '''Summary'''
|With this annotation, a function can be marked as unit test. It will be evaluated whenever if a test report is created for the module in which this function is located.<br/>If an optional <code>error </code > can be supplied as additional string argument. It is specified and if followed by <code>CODE</code>, which must be a valid [[XQuery 3.0#Expanded QNames|EQName]] string. If the function expression does not raise that error, the test will fail.|-| '''Examples'''|* The following test does will be successful, as it does nothing (and, hence, nothing wrong):<syntaxhighlight lang="xquery">declare %unit:test function local:void() { () };</syntaxhighlight>* The following test will be successful, as the function body will raise <code>err:XPTY0004</code>:<syntaxhighlight lang="xquery">declare %unit:test('expected', "err:XPTY0004") function local:add() { 123 + 'strings and integers cannot be added'};</syntaxhighlight>
|}
==%unit:before==
{| width='100%'
|-
| width='120' | '''Syntax'''
|{{Code|%unit:before}}<br/>{{Code|%unit:before(<FUNCTION>)}}
|-
| '''Summary'''
|A function decorated with this annotation will be evaluated '''before each''' unit test.<br/><code>FUNCTION</code> can be supplied as additional argument. It must be a valid [[XQuery 3.0#Expanded QNames|EQName]] string. If specified, the function will only be evaluated before a function with the given name is specified as argument, it tested. This extension is e. g. helpful if the results of updates need to be tested.|-| '''Examples'''|* The first function will only be evaluated before that the actual test:<syntaxhighlight lang="xquery">declare %updating %unit:before("local:check") function local:before-check() { db:create('test-db')};declare %updating %unit:test function.local:check() { unit:assert(db:exists('test-db'))};</syntaxhighlight>
|}
==%unit:after==
{| width='100%'
|-
| width='120' | '''Syntax'''
|{{Code|%unit:after}}<br/>{{Code|%unit:after(<FUNCTION>)}}
|-
| '''Summary'''
|A function decorated with this annotation will be evaluated '''after each''' unit test.<br/><code>FUNCTION</code> can be supplied as additional argument. It must be a valid [[XQuery 3.0#Expanded QNames|EQName]] string. If a function name is specified as argument, it the function will only be evaluated before that after a functionwith the given name is tested.
|}
==%unit:before-module==
{| width='100%'
|-
|}
==%unit:after-module==
{| width='100%'
|-
|}
==%unit:ignore==
{| width='100%'
|-
| width='120' | '''Syntax'''
|{{Code|%unit:ignore}}<br/>{{Code|%unit:ignore(<MESSAGE>)}}
|-
| '''Summary'''
|-
| '''Errors'''
|{{Error|UNIT0001fail|#Errors}} the assertion failed, or an error was raised.
|}
|-
| '''Summary'''
|Asserts that the specified arguments are equal according to the rules of the [https://www.w3.org/TR/xpath-functions-31/#func-deep-equal {{Code|fn:deep-equalsequal}} function]. Otherwise, raises an error.<br/>The default failure message can be overridden with the {{Code|$info}} argument.
|-
| '''Errors'''
|{{Error|UNIT0001fail|#Errors}} the assertion failed, or an error was raised.
|}
|-
| '''Errors'''
|{{Error|UNIT0001fail|#Errors}} default error raised by this function.
|}
==Query==
<pre classsyntaxhighlight lang='brush:"xquery'">
module namespace test = 'http://basex.org/modules/xqunit-tests';
()
};
</presyntaxhighlight>
By running {{Code|TEST tests.xqm}}, the following report will be generated (timings may differ):
==Result==
<pre classsyntaxhighlight lang='brush:"xml'">
<testsuites time="PT0.256S">
<testsuite name="file:///C:/Users/user/Desktop/test.xqm" time="PT0.212S" tests="8" failures="4" errors="1" skipped="1">
</testsuite>
</testsuites>
</presyntaxhighlight>
=Errors=
|Description
|-
|{{Code|UNIT0001fail}}
|An assertion failed, or an error was raised.
|-
|{{Code|UNIT0002no-args}}
|A test function must have no arguments.
|-
|{{Code|UNIT0003private}}|A test function is must not public.|-|{{Code|UNIT0004}}|An annotation was declared twice.|-|{{Code|UNIT0005}}|An annotation has invalid argumentsbe private.
|}
=Changelog=
 
;Version 9.0
 
* Updated: error codes updated; errors now use the module namespace
;Version 8.0.2
 
* Updated: (expected) errors are compared by QNames instead of local names (including namespaces).
;Version 8.0
 
* Deleted: {{Code|UNIT0006}} (ignore results returned by functions).
* Added: [[#unit:fail|unit:fail]], 0-argument signature.
This module was introduced with Version 7.7.
 
[[Category:XQuery]]
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu