NAME
TestLink::API - Provides an interface to TestLink's XMLRPC api via HTTP
VERSION
version 0.011
SYNOPSIS
use TestLink::API;
my $tl = TestLink::API->new('http://tl.test/testlink/lib/api/xmlrpc/v1/xmlrpc.php', 'gobbledygook123');
#Look up test definitions
my $projects = $tl->getProjects();
my $suites = $tl->getTLDTestSuitesForProject($projects->[0]->{'id'});
my $childsuites = $tl->getTestSuitesForTestSuite($suites->[0]->{'id'});
my $tests = $tl->getTestCasesForTestSuite($childsuites->[0]->{'id'});
#Look up test plans/builds
my $plans = $tl->getTestPlansForProject($projects->[0]->{'id'});
my $tests2 = $tl->getTestCasesForTestPlan($plans->[0]->{'id'});
my $builds = $tl->getBuildsForTestPlan($plans->[0]->{'id'});
#Set results
my $testResults = doSomethingReturningBoolean();
my $results = $tl->reportTCResult($tests2->[0]->{'id'},$plans->[0]->{'id'},$builds->[0]->{'id'}, $testResults ? 'p' : 'f');
$tl->uploadExecutionAttachment($results->{'id'},'test.txt','text/plain',encode_base64('MOO MOO MOOOOOO'),'bovine emissions','whee')
DESCRIPTION
TestLink::API
provides methods to access an existing TestLink account. You can then do things like look up tests, set statuses and create builds from lists of tests. The getter methods cache the test tree up to whatever depth is required by your getter calls. This is to speed up automated creation/reading/setting of the test db based on existing automated tests. Cache expires at the end of script execution. (TODO use memcached controlled by constructor, with create methods invalidating cache?) Getter/setter methods that take args assume that the relevant project/testsuite/test/plan/build provided exists (TODO: use cache to check exists, provide more verbose error reason...), and returns false if not. Create methods assume desired entry provided is not already in the DB (TODO (again): use cache to check exists, provide more verbose error reason...), and returns false if not. It is by no means exhaustively implementing every TestLink API function. Designed with TestLink 1.9.9, but will likely work on (some) other versions.
CONSTRUCTOR
new (api_url, key)
Creates new TestLink::API
object.
Returns TestLink::API
object if login is successful.
my $tl = TestLink::API->new('http://tl.test/testlink/lib/api/xmlrpc/v1/xmlrpc.php', 'gobbledygook123');
PROPERTIES
apiurl and apikey can be accessed/set:
$url = $tl->apiurl; $tl = $tl->apiurl('http//some.new.url/foo.php');
CREATE METHODS
createTestPlan (name, project, [notes, active, public])
Creates new Test plan with given name in the given project.
- STRING
NAME
- Desired test plan name. - STRING
PROJECT
- The name of some project existing in TestLink. - STRING
NOTES
(optional) - Additional description of test plan. Default value is 'res ipsa loquiter' - BOOLEAN
ACTIVE
(optional) - Whether or not the test plan is active. Default value is true. - BOOLEAN
PUBLIC
(optional) - Whether or not the test plan is public. Default is true.
Returns (integer) test plan ID if creation is successful.
my $tpid = $tl->createTestPlan('shock&awe', 'enduringfreedom');
createBuild (test_plan_id, name, [notes])
Creates new 'Build' (test run in common parlance) from given test plan having given name and notes.
- INTEGER
TEST PLAN ID
- ID of test plan to base test run on. - STRING
NAME
- Desired name for test run. - STRING
NOTES
(optional) - Additional description of run. Default value is 'res ipsa loquiter'.
Returns true if case addition is successful, false otherwise.
$tl->createBuild(1234, "Bossin' up", 'Crushing our enemies, seeing them driven before us and hearing the lamentations of their support engineers.');
createTestSuite (project_id, name, [details, parent_testsuite_id, order])
Creates new TestSuite (folder of tests) in the database of test specifications under given project id having given name and details. Optionally, can have a parent test suite (this is an analog to a hierarchical file tree after all) and what order to have this suite be amongst it's peers.
- INTEGER
PROJECT ID
- ID of project this test suite should be under. - STRING
NAME
- Desired name of test suite. - STRING
DETAILS
(optional) - Description of test suite. Default value is 'res ipsa loquiter'. - INTEGER
PARENT TESTSUITE ID
(optional) - Parent test suite ID. Defaults to top level of project. - INTEGER
ORDER
(optional) - Desired order amongst peer testsuites. Defaults to last in list.
Returns (integer) build ID on success, false otherwise.
$tl->createTestSuite(1, 'broken tests', 'Tests that should be reviewed', 2345, -1);
createTestProject (name, case_prefix, [notes, options, active, public])
Creates new Project (Database of testsuites/tests) with given name and case prefix. Optionally, can have notes, options, set the project as active/inactive and public/private.
- STRING
NAME
- Desired name of project. - STRING
CASE PREFIX
- Desired prefix of project's external test case IDs. - STRING
NOTES
(optional) - Description of project. Default value is 'res ipsa loquiter'. - HASHREF{BOOLEAN}
OPTIONS
(optional) - Hash with keys: requirementsEnabled,testPriorityEnabled,automationEnabled,inventoryEnabled. - BOOLEAN
ACTIVE
(optional) - Whether to mark the project active or not. Default True. - BOOLEAN
PUBLIC
(optional) - Whether the project is public or not. Default true.
Returns (integer) project ID on success, false otherwise.
$tl->createTestProject('Widgetronic 4000', 'Tests for the whiz-bang new product', {'inventoryEnabled=>true}, true, true);
createTestCase (name, test_suite_id, test_project_id, author, summary, steps, preconditions, execution, order)
Creates new test case with given test suite id and project id. Author, Summary and Steps are mandatory for reasons that should be obvious to any experienced QA professional. Execution type and Test order is optional.
- STRING
NAME
- Desired name of test case. - INTEGER
TEST SUITE ID
- ID of parent test suite. - INTEGER
TEST PROJECT ID
- ID of parent project - STRING
AUTHOR
- Author of test case. - STRING
SUMMARY
- Summary of test case. - STRING
STEPS
- Test steps. - STRING
PRECONDITIONS
- Prereqs for running the test, if any. - STRING
EXECUTION
(optional) - Execution type. Defaults to 'manual'. - INTEGER
ORDER
(optional) - Order of test amongst peers.
Returns (HASHREF) with Test Case ID and Test Case External ID on success, false otherwise.
$tl->createTestCase('Verify Whatsit Throbs at correct frequency', 123, 456, 'Gnaeus Pompieus Maximus', 'Make sure throbber on Whatsit doesn't work out of harmony with other throbbers', '1. Connect measurement harness. 2. ??? 3. PROFIT!', 'automated', 2);
SETTER METHODS
reportTCResult (case_id, test_plan_id, build_id, status, [platform, notes, bug id])
Report results of a test case with a given ID, plan and build ID. Set case results to status given. Platform is mandatory if available, otherwise optional. Notes and Bug Ids for whatever tracker you use are optional.
- INTEGER
CASE ID
- Desired test case. - INTEGER
TEST PLAN ID
- ID of relevant test plan. - INTEGER
BUILD ID
- ID of relevant build. - STRING
STATUS
- Desired Test Status Code. Codes not documented anywhere but in your cfg/const.inc.php of the TestLink Install. - STRING
PLATFORM
(semi-optional) - Relevant platform tested on. Accepts both platform name and ID, if it looks_like_number, uses platform_id - STRING
NOTES
(optional) - Relevant information gleaned during testing process. - STRING
BUG ID
(optional) - Relevant bug ID for regression tests, or if you auto-open bugs based on failures.
Returns project ID on success, false otherwise.
$tl->reportTCResult('T-1000', 7779311, 8675309, 'Tool Failure', 'Skynet Infiltration Model 1000', 'Catastrophic systems failure due to falling into vat of molten metal' 'TERMINATOR-2');
addTestCaseToTestPlan (test_plan_id, test_case_id, project_id, test_version, [sut_platform])
Creates new Test plan with given name in the given project.
- INTEGER
TEST PLAN ID
- Desired test plan. - STRING
TEST CASE ID
- The 'external' name of some existing test in TestLink, e.g. TP-12. - INTEGER
PROJECT ID
- The ID of some project in testlink - INTEGER
TEST VERSION
- The desired version of the test to add. - STRING
SUT PLATFORM
(semi-optional) - The name of the desired platform to run on for this test (if any). - INTEGER
EXECUTION ORDER
(optional) - The order in which to execute this test amongst it's peers. - INTEGER
URGENCY
(optional) - The priority of the case in the plan.
Returns true if case addition is successful.
$tl->addTestCaseToTestPlan(666, 'cp-90210', 121, '3.11', 'OS2/WARP', 3, 1);
uploadExecutionAttachment (execution_id,filename,mimetype,content,[title,description])
Uploads the provided file and associates it with the given execution.
- INTEGER
EXECUTION ID
- ID of a successful execution, such as the id key from the hash that is returned by reportTCResult. - STRING
FILENAME
- The name you want this file to appear as. - INTEGER
MIMETYPE
- The mimetype of the file uploaded, so we can tell the browser what to do with it when downloaded - INTEGER
CONTENT
- The base64 encoded content of the file you want to upload. - STRING
TITLE
(optional) - A title for this attachment. - INTEGER
DESCRIPTION
(optional) - A short description of who/what/why this was attached.
Returns true if attachment addition is successful.
$tl->uploadExecutionAttachment(1234, 'moo.txt', 'text/cow', APR::Base64::encode('MOO MOO MOOOOOO'), 'MOO', 'Test observed deranged bleatings of domestic ungulates, please investigate.');
uploadTestCaseAttachment (case_id,filename,mimetype,content,[title,description])
Uploads the provided file and associates it with the given execution.
- INTEGER
CASE ID
- ID of desired test case - STRING
FILENAME
- The name you want this file to appear as. - INTEGER
MIMETYPE
- The mimetype of the file uploaded, so we can tell the browser what to do with it when downloaded - INTEGER
CONTENT
- The base64 encoded content of the file you want to upload. - STRING
TITLE
(optional) - A title for this attachment. - INTEGER
DESCRIPTION
(optional) - A short description of who/what/why this was attached.
Returns true if attachment addition is successful.
$tl->uploadTestCaseAttachment(1234, 'doStuff.t', 'text/perl', APR::Base64::encode($slurped_file_content), 'doStuff.t', 'Test File.');
GETTER METHODS
getProjects ()
Get all available projects
Returns array of project definition hashes, false otherwise.
$projects = $tl->getProjects;
getProjectByName ($project)
Gets some project definition hash by it's name
Returns desired project def hash, false otherwise.
$projects = $tl->getProjectByName('FunProject');
getProjectByID ($project)
Gets some project definition hash by it's ID
Returns desired project def hash, false otherwise.
$projects = $tl->getProjectByID(222);
getTLDTestSuitesForProject (project_id,get_tests)
Gets the testsuites in the top level of a project
- STRING
PROJECT ID
- desired project's ID =item BOOLEANGET TESTS
- Get tests for suites returned, set them as 'tests' key in hash
Returns desired testsuites' definition hashes, 0 on error and -1 when there is no such project.
$projects = $tl->getTLDTestSuitesForProject(123);
getTestSuitesForTestSuite (testsuite_id,get_tests)
Gets the testsuites that are children of the provided testsuite.
- STRING
TESTSUITE ID
- desired parent testsuite ID =item STRINGGET TESTS
- whether to get child tests as well
Returns desired testsuites' definition hashes, false otherwise.
$suites = $tl->getTestSuitesForTestSuite(123);
$suitesWithCases = $tl->getTestSuitesForTestSuite(123,1);
getTestSuitesByName (project_id,testsuite_name,do_regex)
Gets the testsuite(s) that match given name inside of given project name. WARNING: this will slurp the entire testsuite tree. This can take a while on large projects, but the results are cached so that subsequent calls are not as onerous.
- STRING
PROJECT ID
- ID of project holding this testsuite - STRING
TESTSUITE NAME
- desired parent testsuite name - BOOLEAN
DO REGEX
(optional) - whether or not PROJECT NAME is a regex (default false, uses 'eq' to compare).
Returns desired testsuites' definition hashes, false otherwise.
$suites = $tl->getTestSuitesByName(321, 'hugSuite');
$suitesr = $tl->getTestSuitesByName(123, qr/^hug/, 1);
getTestSuiteByID (testsuite_id)
Gets the testsuite with the given ID.
Returns desired testsuite definition hash, false otherwise.
$tests = $tl->getTestSuiteByID(123);
getTestCasesForTestSuite (testsuite_id,recurse,details)
Gets the testsuites that match given name inside of given project name.
- STRING
TESTSUITE_ID
- TestSuite ID. - BOOLEAN
RECURSE
- Search testsuite tree recursively for tests below the provided testsuite - BOOLEAN
RETURNMODE
(optional) - whether or not to return more detailed test info (steps,summary,expected results). Defaults to false.
Returns desired case definition hashes, false otherwise.
$tests = $tl->getTestCasesForTestSuite(123,1,1);
getTestCaseByExternalId (case_id,version)
Gets the test case with the given external ID (e.g. projprefix-123) at provided version.
- STRING
CASE ID
- desired external case ID - STRING
VERSION
- desired test case version. Defaults to most recent version.
Returns desired case definition hash, false otherwise.
$case = $tl->getTestCaseByExternalId('eee-123');
getTestCaseById (case_id,version)
Gets the test case with the given internal ID at provided version.
- STRING
CASE ID
- desired internal case ID - STRING
VERSION
- desired test case version. Defaults to most recent version.
Returns desired case definition hash, false otherwise.
$case = $tl->getTestCaseById(28474,5);
getTestCaseByName (case_name,suite_name,project_name,tc_path_nameversion)
Gets the test case with the given internal ID at provided version.
- STRING
CASE NAME
- desired internal case ID - STRING
SUITE NAME
- parent suite's name - STRING
PROJECT NAME
- parent project's name - STRING
TC_PATH_NAME
(optional)- Full path to TC. Please see documentation for more info: http://jetmore.org/john/misc/phpdoc-testlink193-api/TestlinkAPI/TestlinkXMLRPCServer.html#getTestCaseIDByName - STRING
VERSION
(optional)- desired test case version. Defaults to most recent version.
Returns desired case definition hash, false otherwise.
$case = $tl->getTestCaseByName('nugCase','gravySuite','chickenProject');
getTestCaseAttachments (case_ext_id)
Gets the attachments for some case.
Returns desired attachment definition hash, false otherwise. Content key is the file base64 encoded.
$att = $tl->getTestCaseAttachments('CP-222');
getTestPlansForProject (project_id)
Gets the test plans within given project id
Returns desired test plan definition hashes, false otherwise.
$plans = $tl->getTestPlansForProject(23);
getTestPlanByName (plan_name,project_name)
Gets the test plan within given project name
Returns desired test plan definition hash, false otherwise.
$suites = $tl->getTestPlanByName('nugs','gravy');
getBuildsForTestPlan (plan_id)
Gets the builds for given test plan
Returns desired builds' definition hashes, false otherwise.
$builds = $tl->getBuildsForTestPlan(1234);
getTestCasesForTestPlan (plan_id)
Gets the cases in provided test plan
Returns desired tests' definition hashes sorted by parent test plan ID, false otherwise.
Example output:
{ 1234 => [{case1},{case2},...], 33212 => [cases...]}
Example usage:
$builds = $tl->getTestCasesForTestPlan(1234);
getLatestBuildForTestPlan (plan_id)
Gets the latest build for the provided test plan
Returns desired build definition hash, false otherwise.
$build = $tl->getLatestBuildForTestPlan(1234);
getBuildByName (build_name,project_id)
Gets the desired build in project id by name
Returns desired build definition hash, false otherwise.
$build = $tl->getBuildByName('foo',1234);
REPORTING METHODS
getTotalsForTestPlan (plan_id)
Gets the results summary for a test plan, even though what you really want is results by build/platform
Returns Hash describing test results.
$res = $tl->getTotalsForTestPlan(2322);
EXPORT/IMPORT METHODS
dump([project,get_attachments,flatten])
Return all info for all (or only the specified) projects. It will have the entire testsuite hierarchy and it's tests/attachments in an array of HASHREFs. The idea would be that you then could encode as JSON/XML as a backup, or to facilitate migration to other systems.
The project hashes will be what you would expect from getProjectByName calls. Those will have a key 'testsuites' with a list of it's child testsuites. These testsuites will themselves have 'testsuites' and 'test' keys describing their children. Both the test and testsuite hashes will have an 'attachment' parameter with the base64 encoded attachment as a string if the get_attachments option is passed.
WARNING: I have observed some locking related issues with cases/suites etc. Sometimes calls to get tests/suites during dumps fails, sometimes subsequent calls to getTestSuites/getTestCasesForTestSuite fail. If you are experiencing issues, try to put some wait() in there until it starts behaving right. Alternatively, just XML dump the whole project and use XML::Simple or your tool of choice to get the project tree.
ALSO: Attachment getting is not enabled due to the underlying XMLRPC calls appearing not to work. This option will be ignored until a workaround can be found.
- INTEGER
PROJECT NAME
(optional) - desired project =item BOOLEANGET ATTACHMENTS
(optional) - whether or not to get attachments. Default false. UNIMPLEMENTED. =item BOOLEANFLATTEN
(optional) - Whether to return a flattened structure (you will need to correlate parent to child yourself, but this is faster due to not walking the tree). Preferred output for those not comfortable with doing tail recursion.
Returns ARRAYREF describing everything.
$ultradump = $tl->dump();
$dumpWithAtts = $tl->dump('TestProject',1);
$flatDump = $tl->dump('testProj',0,1);
SEE ALSO
SPECIAL THANKS
cPanel, Inc. graciously funded the initial work on this project.
AUTHOR
George S. Baugh <teodesian@cpan.org>
CONTRIBUTOR
Neil Bowers <neil@bowers.com>
SOURCE
The development version is on github at http://github.com/teodesian/TestLink-Perl and may be cloned from git://github.com/teodesian/TestLink-Perl.git
COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by George S. Baugh.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.