Chapter7: 利用Python的Testlink模块上传测试结果,取代Jenkins中的Testlink插件
本系列文章见总链接:
总章:TestStand+Jenkins+Testlink 自动化测试平台搭建
需要在Python环境中安装Testlink-API-Python-client。TestLink-API-Python-client is a Python XML-RPC client for Testlink
下载链接:https://pypi.org/project/TestLink-API-Python-client/
源代码:https://github.com/lczub/TestLink-API-Python-client
示例代码:https://github.com/lczub/TestLink-API-Python-client/blob/master/doc/usage.rst
安装Testlink模块: pip install TestLink-API-Python-client
在Jenkins Job中的配置
Execute Windows Batch Command in Jenkins Job
代码:
@echo on cd "%WORKSPACE%\%BUILD_NUMBER%" for /F "delims=" %%i in ('findstr /r /c:"<property name=" Report_JUnit.xml') do set UUTResult="%%i" echo %UUTResult% | findstr /c:"Passed" 1>nul set "testresultlevel=%errorlevel%" if %errorlevel% == 0 (set exec_status=p) else (set exec_status=f) set "test_case_name=%ScriptName:~0,-4%" set "custom_fields_name=%test_case_name%.1Main" set "custom_fields=AutoTest" for /f tokens^=8^ delims^=^" %%i in ('findstr /i "time=.*>" Report_JUnit.xml') do set "exec_duration=%%i" set "exec_notes=%BUILD_URL%;;Project: %Project%;UnitType: %UnitType%;RunningMode: %RunningMode%;SystemInUse: %SystemInUse%;PublicORBritishSystem: %PublicORBritishSystem%;ScriptPath: %ScriptPath%;ScriptName: %ScriptName%;test_plan_name: %test_plan_name%;test_suite_name: %test_suite_name%;build_name: %build_name%;" set "exec_junit_xml_path=%WORKSPACE%\Report_JUnit.xml" @echo off echo url = %TestlinkURL% echo key = %TestlinkKEY% echo test_project_name = %Project% echo test_plan_name = %test_plan_name% echo test_suite_name = %test_suite_name% echo test_case_name = %test_case_name% echo build_name = %build_name% echo custom_fields_name = %custom_fields_name% echo exec_status = %exec_status% echo exec_duration(seconds) = %exec_duration% echo exec_notes = %exec_notes% echo exec_junit_xml_path = %exec_junit_xml_path% @echo on C:\Python27\python.exe c:\jenkins\UpdateTestExecutionINTestlink.py %TestlinkURL% %TestlinkKEY% "%Project%" "%test_plan_name%" "%test_suite_name%" "%test_case_name%" "%build_name%" "%custom_fields%" "%custom_fields_name%" %exec_status% %exec_duration% "%exec_notes%" "%exec_junit_xml_path%" exit %testresultlevel%
UpdateTestExecutionINTestlink.py 代码:
# -*- coding:UTF-8 -*- import testlink import time import sys print("url: %s" %sys.argv[1]) #Testlink api address print("key: %s" %sys.argv[2]) #Testlink developer key for specified user print("test_project_name: %s" %sys.argv[3]) #test project name in Testlink print("test_plan_name: %s" %sys.argv[4]) #test plan name for current test execution print("test_suite_name: %s" %sys.argv[5]) #test suite name of the test case print("test_case_name: %s" %sys.argv[6]) #test case name print("build_name: %s" %sys.argv[7]) #the build name, would be the SW version print("custom_fields: %s" %sys.argv[8]) #the custom fields defined in Testlink print("custom_fields_name: %s" %sys.argv[9]) #the custom fields value in test case print("exec_status: %s" %sys.argv[10]) #the test status for current test execution print("exec_duration(seconds): %s" %sys.argv[11]) #the duration for current test execution print("exec_notes: %s" %sys.argv[12].replace(";","\n")) #the useful information of jenkins job would be uploaded to Testlink print("exec_junit_xml_path: %s" %sys.argv[13]) #the path of the Junit type XML file for current test execution results url = sys.argv[1] key = sys.argv[2] test_project_name = sys.argv[3] test_plan_name = sys.argv[4] test_suite_name = sys.argv[5] test_case_name = sys.argv[6] build_name = sys.argv[7] dict_key = sys.argv[8] custom_fields = {} custom_fields[dict_key] = sys.argv[9] exec_status = sys.argv[10] exec_duration = sys.argv[11] exec_duration=round(float(exec_duration)//float(60.0) + float(exec_duration)%float(60.0)/float(60.0),2) #convert the time from seconds to minutes print("exec_duration(minutes): %s" %exec_duration) exec_notes = sys.argv[12].replace(";","\n")+"\nTime: "+str(exec_duration)+" minutes\n" #replace ; with \n . Then the note in Testlink would be readable print("exec_notes: %s" %exec_notes) exec_junit_xml_path = sys.argv[13] tlc = testlink.TestlinkAPIClient(url,key) for project in projects: print("testProject",project["id"],project["name"]) #print all project with id and name for project in projects: if project["name"]==test_project_name: project_id=project["id"] #get the project id by the known name print("project_id: %s" %project_id) test_plans=tlc.getProjectTestPlans(project_id) for test_plan in test_plans: if test_plan["name"]==test_plan_name: test_plan_id=test_plan["id"] #get the test plan id by the known name print("test_plan_id: %s" %test_plan_id) test_suites=tlc.getTestSuitesForTestPlan(test_plan_id) #get the test suites by test plan id for test_suite in test_suites: if test_suite["name"]==test_suite_name: test_suite_id=test_suite["id"] #get the test suite id by test suite name print("test_suite_id: %s" %test_suite_id) test_cases=tlc.getTestCasesForTestSuite(test_suite_id,True,None) for test_case in test_cases: if test_case["name"] == test_case_name: test_case_id=test_case["id"] #get the test case id by test case name print("test_case_id: %s" %test_case_id) localtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) #define the current time stamp newBuild = tlc.createBuild(test_plan_id,build_name,'Build created automatically with Python') #Create the build in Testlink newResult = tlc.reportTCResult(testcaseid=test_case_id,testplanid=test_plan_id,status=exec_status,guess=True,testcaseexternalid=None,platformname=None,buildname=build_name,customfields=custom_fields,execduration=exec_duration,timestamp=localtime,notes=exec_notes) print(newResult) newAttachment = tlc.uploadExecutionAttachment(exec_junit_xml_path,newResult[0]['id'],test_case_name,'Description')
在Python中查看方法使用:
Python 2.7.17 (v2.7.17:c2f86d86e6, Oct 19 2019, 20:49:36) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import testlink >>> tlc = testlink.TestlinkAPIClient("http://10.90.69.239:8181/testlink-1.9.20/lib/api/xmlrpc/v1/xmlrpc.php","740c93c48fa88452c4e172c15b161ffc") >>> print tlc.whatArgs('reportTCResult') reportTCResult(<testcaseid>, <testplanid>, <buildname>, <status>, <notes>, [testcaseexternalid=<testcaseexternalid>], [buildid=<buildid>], [platformid=<platformid>], [platformname=<platformname>], [guess=<guess>], [bugid=<bugid>], [customfields=<customfields>], [overwrite=<overwrite>], [user=<user>], [execduration=<execduration>], [timestamp=<timestamp>], [steps=<steps>], [devKey=<devKey>]) Reports a result for a single test case args variations: testcaseid - testcaseexternalid buildid - buildname platformid - platformname customfields : dictionary with customfields names + values VERY IMPORTANT: value must be formatted in the way it's written to db overwrite : if present and true, then last execution for (testcase,testplan,build,platform) will be overwritten. user : if present and user is a valid login (no other check will be done) it will be used when writing execution. execduration : Exec (min) as float (2.5 = 2min 30sec) timestamp : 'YYYY-MM-DD hh:mm[:ss]'# steps : [{'step_number' : 6, 'result' : 'p', 'notes" : 'a_note'}, {'step_number' : 7, 'result' : 'f', 'notes" : 'blabla'}] >>> print tlc.whatArgs('uploadExecutionAttachment') uploadExecutionAttachment(<attachmentfile>, <executionid>, <title>, <description>, [filename=<filename>], [filetype=<filetype>], [content=<content>], [devKey=<devKey>]) Uploads an attachment for an execution executionid - execution ID mandatory non api args: attachmentfile - python file descriptor pointing to the file - or a valid file path default values for filename, filetype, content are determine from ATTACHMENTFILE, but user could overwrite it, if user want to store the attachment with a different name >>>
>>> help(testlink.TestlinkAPIClient) Help on class TestlinkAPIClient in module testlink.testlinkapi: class TestlinkAPIClient(testlink.testlinkapigeneric.TestlinkAPIGeneric) | client for XML-RPC communication between Python and TestLink | | Inherits TestLink API methods from the generic client TestlinkAPIGeneric. | | Defines Service Methods like "countProjects" and change the | configuration for positional and optional arguments in a way, that often | used arguments are positional. | - see _changePositionalArgConfig() | - configuration of positional arguments is consistent with v0.4.0 | | Changes on Service Methods like "countProjects" should be implemented in | this class or sub classes | Changes of TestLink API methods should be implemented in generic API | TestlinkAPIGeneric. | | Method resolution order: | TestlinkAPIClient | testlink.testlinkapigeneric.TestlinkAPIGeneric | __builtin__.object | | Methods defined here: | | __init__(self, server_url, devKey, **kwargs) | call super for init generell slots, init sepcial slots for teststeps | and define special positional arg settings | | appendStep(self, actions, expected_results, execution_type) | appendStep : | Appends a step to the steps list | | copyTCnewTestCase(self, origTestCaseId, origVersion=None, **changedAttributes) | creates a test case with values from test case ORIGTESTCASEID | | ORIGVERSION specifies the test case version, which should be copied, | default is the max version number | | if the new test case should differ from the original test case, changed | api arguments could be defined as key value pairs. | Example for changed test suite and importance: | - copyTCnewTestCaseVersion('4711', testsuiteid = '1007', | importance = '1') | | Remarks for some special keys: | 'testsuiteid': defines, in which test suite the TC-copy is inserted. | Default is the same test suite as the original test case. | 'steps': must be a complete list of all steps, changed and unchanged steps | Maybe its better to change the steps in a separat call using | createTestCaseSteps with action='update'. | | copyTCnewVersion(self, origTestCaseId, origVersion=None, **changedAttributes) | creates a new version for test case ORIGTESTCASEID | | ORIGVERSION specifies the test case version, which should be copied, | default is the max version number | | if the new version should differ from the original test case, changed | api arguments could be defined as key value pairs. | Example for changed summary and importance: | - copyTCnewVersion('4711', summary = 'The summary has changed', | importance = '1') | Remarks for some special keys: | 'steps': must be a complete list of all steps, changed and unchanged steps | Maybe its better to change the steps in a separat call using | createTestCaseSteps with action='update'. | | countBuilds(self) | countBuilds : | Count all the Builds | | countPlatforms(self) | countPlatforms : | Count all the Platforms in TestPlans | | countProjects(self) | countProjects : | Count all the test project | | countTestCasesTP(self) | countProjects : | Count all the test cases linked to a Test Plan | | countTestCasesTS(self) | countProjects : | Count all the test cases linked to a Test Suite | | countTestPlans(self) | countProjects : | Count all the test plans | | countTestSuites(self) | countProjects : | Count all the test suites | | createTestCase(self, *argsPositional, **argsOptional) | createTestCase: Create a test case | positional args: testcasename, testsuiteid, testprojectid, authorlogin, | summary | optional args : steps, preconditions, importance, executiontype, order, | internalid, checkduplicatedname, actiononduplicatedname, | status, estimatedexecduration | | argument 'steps' will be set with values from .stepsList, | - when argsOptional does not include a 'steps' item | - .stepsList can be filled before call via .initStep() and .appendStep() | | otherwise, optional arg 'steps' must be defined as a list with | dictionaries , example | [{'step_number' : 1, 'actions' : "action A" , | 'expected_results' : "result A", 'execution_type' : 0}, | {'step_number' : 2, 'actions' : "action B" , | 'expected_results' : "result B", 'execution_type' : 1}, | {'step_number' : 3, 'actions' : "action C" , | 'expected_results' : "result C", 'execution_type' : 0}] | | echo(self, message) | | getProjectIDByName(self, projectName) | | getProjectIDByNode(self, a_nodeid) | returns project id , the nodeid belongs to. | | getTestCaseByVersion(self, testCaseID, version=None) | Gets testcase information based on the version. | | :param testCaseID: test case to search for | :param version: version to search for defaults to None. None searches for latest | :return: test case info dictionary | | getTestCaseIDByName(self, *argsPositional, **argsOptional) | getTestCaseIDByName : Find a test case by its name | positional args: testcasename, | optional args : testsuitename, testprojectname, testcasepathname | | testcasepathname : Full test case path name, | starts with test project name , pieces separator -> :: | | server return can be a list or a dictionary | - optional arg testprojectname seems to create a dictionary response | | this methods customize the generic behaviour and converts a dictionary | response into a list, so methods return will be always a list | | initStep(self, actions, expected_results, execution_type) | initStep : | Initializes the list which stores the Steps of a Test Case to create | | listKeywordsForTC(self, internal_or_external_tc_id) | Returns list with keyword for a test case | INTERNAL_OR_EXTERNAL_TC_ID defines | - either the internal test case ID (8111 or '8111') | - or the full external test case ID ('NPROAPI-2') | | Attention: | - the tcversion_id is not supported | - it is not possible to ask for a special test case version, cause TL | links keywords against a test case and not a test case version | | listKeywordsForTS(self, internal_ts_id) | Returns dictionary with keyword lists for all test cases of | test suite with id == INTERNAL_TS_ID | | listProjects(self) | listProjects : | Lists the Projects (display Name & ID) | | ---------------------------------------------------------------------- | Data descriptors defined here: | | stepsList | | ---------------------------------------------------------------------- | Data and other attributes defined here: | | __author__ = 'Luiko Czub, Olivier Renault, James Stock, TestLink-API-P... | | ---------------------------------------------------------------------- | Methods inherited from testlink.testlinkapigeneric.TestlinkAPIGeneric: | | __str__(self) | | about(self) | Gives basic information about the API | | addPlatformToTestPlan(self, *argsPositional, **argsOptional) | Adds a platform to a test plan | | addTestCaseKeywords(self, *argsPositional, **argsOptional) | adds list of keywords to a set of test cases | | expects as arg <keywords> a dictionary with | <testcaseexternalid> as a key and <list of keywords> as value | | example: | {'TC-4711' : ['KeyWord02'], 'TC-4712' : ['KeyWord01', KeyWord03']} | | adds to test case 'TC-4711' the keyword 'KeyWord02' | adds to test case 'TC-4712' the keywords 'KeyWord01' + KeyWord03' | | addTestCaseToTestPlan(self, *argsPositional, **argsOptional) | Add a test case version to a test plan | | assignRequirements(self, *argsPositional, **argsOptional) | Assign Requirements to a test case | It is possible to assign multiple requirements, belonging to different | requirement specifications. (the internal IDs must be known!) | | Argument REQUIREMENTS expects an array of dictionaries, example: | .assignRequirements('GPROAPI4-2', 6652, | [{'req_spec' : 6729, 'requirements' : [6731]}, | {'req_spec' : 6733, 'requirements' : [6735, 6737]}]) | This would assign to testcase 'GPROAPI4-2' (in testproject with id 6652) | a) requirement with ID 6731 of requirement spec 6729 AND | b) requirements with ID 6735 and 6737 of requirement spec 6733 | | assignTestCaseExecutionTask(self, *argsPositional, **argsOptional) | assigns a user to a test case execution task | | user login name => tester | testplanid test plan id | testcaseexternalid format PREFIX-NUMBER | | args variations: buildid - buildname | platformid - platformname | build information is general mandatory | platform information is required, when test plan has assigned platforms | | callServerWithPosArgs(self, methodNameAPI, *argsPositional, **argsOptional) | concat argsPositional and argsOptional before calling | server method methodNameAPI | | checkDevKey(self, *argsPositional, **argsOptional) | check if Developer Key exists | returns true if everything OK, otherwise error structure | | connectionInfo(self) | print current SERVER URL and DEVKEY settings and servers VERSION | | createBuild(self, *argsPositional, **argsOptional) | Creates a new build for a specific test plan | | active : 1 (default) = activ 0 = inactiv | open : 1 (default) = open 0 = closed | releasedate : YYYY-MM-DD | copytestersfrombuild : valid buildid tester assignments will be copied. | | createPlatform(self, *argsPositional, **argsOptional) | Creates a platform for test project | | createTestCaseSteps(self, *argsPositional, **argsOptional) | creates new test steps or updates existing test steps | | action - possible values: 'create','update','push' | create: if step exist NOTHING WILL BE DONE | update: if step DOES NOT EXIST will be created else will be updated. | push: NOT IMPLEMENTED YET (TL 1.9.9) | shift down all steps with step number >= step number provided | and use provided data to create step number requested. | steps - each element is a hash with following keys | step_number,actions,expected_results,execution_type | args variations: testcaseid - testcaseexternalid | version - optional if not provided LAST ACTIVE version will be used | if all versions are INACTIVE, then latest version will be used. | | createTestPlan(self, *argsPositional, **argsOptional) | create a test plan | | args variations: testprojectname - prefix | | supports also pre 1.9.14 arg definition, where 'testprojectname' | was mandatory ('prefix' comes as alternative with 1.9.14) | | examples: | - createTestPlan('aTPlanName', 'aTProjectName') | - createTestPlan('aTPlanName', testprojectname='aTProjectName') | - createTestPlan('aTPlanName', prefix='aTProjectPrefix') | | createTestProject(self, *argsPositional, **argsOptional) | Create a test project | | options : dictionary with keys | requirementsEnabled, testPriorityEnabled, | automationEnabled,inventoryEnabled | and values 0 (false) and 1 (true) | | createTestSuite(self, *argsPositional, **argsOptional) | create a test suite | | deleteExecution(self, *argsPositional, **argsOptional) | delete an execution | | Default TL server configuration does not allow deletion of exections | see Installation & Configuration Manual Version 1.9 | chap. 5.8. Test execution settings | $tlCfg->exec_cfg->can_delete_execution | | deleteTestCaseSteps(self, *argsPositional, **argsOptional) | deletes test cases steps | | steps - each element is a step_number | version - optional if not provided LAST ACTIVE version will be used | | deleteTestPlan(self, *argsPositional, **argsOptional) | Delete a test plan and all related link to other items | | deleteTestProject(self, *argsPositional, **argsOptional) | Delete a test project and all related link to other items | | doesUserExist(self, *argsPositional, **argsOptional) | Checks if user name exists | returns true if everything OK, otherwise error structure | | getAllExecutionsResults(self, *argsPositional, **argsOptional) | Gets ALL EXECUTIONS for a particular testcase on a test plan. | If there are no filter criteria regarding platform and build, | result will be get WITHOUT checking for a particular platform and build. | | mandatory arg: testplanid - identifies the test plan | | mandatory args variations: testcaseid - testcaseexternalid | - test case information is general mandatory | | optional args: buildid | platformid | | options : dictionary with key 'getBugs' and | values 0 (false = default) or 1 (true) | | getBuildsForTestPlan(self, *argsPositional, **argsOptional) | Gets a list of builds within a test plan | | returns an empty list, if no build is assigned | | getExecCountersByBuild(self, *argsPositional, **argsOptional) | Gets execution metrics information for a testplan | | getExecutionSet(self, *argsPositional, **argsOptional) | Gets a set of EXECUTIONS for a particular testcase on a test plan. | If there are no filter criteria regarding platform and build, result | will be get WITHOUT checking for a particular platform and build. | | mandatory arg: testplanid - identifies the test plan | | mandatory args variations: testcaseid - testcaseexternalid | - test case information is general mandatory | | optional args variations: buildid - buildname | platformid - platformname | | options : dictionary with key 'getOrderDescending' and | values 0 (false = default) or 1 (true) | | getFirstLevelTestSuitesForTestProject(self, *argsPositional, **argsOptional) | get set of test suites AT TOP LEVEL of tree on a Test Project | | returns an empty list, if no suite is assigned (api error 7008) | - details see comments for decoMakerApiCallReplaceTLResponseError | | getFullPath(self, *argsPositional, **argsOptional) | Gets full path from the given node till the top using nodes_hierarchy_table | | nodeid = can be just a single id or a list with ids | ATTENTION: id must be an integer. | | getIssueTrackerSystem(self, *argsPositional, **argsOptional) | Get Issue Tracker System by name | | getLastExecutionResult(self, *argsPositional, **argsOptional) | Gets the result of LAST EXECUTION for a particular testcase on a test plan. | If there are no filter criteria regarding platform and build, | result will be get WITHOUT checking for a particular platform and build. | | following optional arguments could only used with | TL version >= 1.9.9 | - platformid, platformname, buildid, buildname | | TL version >= 1.9.11 | - options : dictionary with key value pair | 'getBugs' : True / False | | getLatestBuildForTestPlan(self, *argsPositional, **argsOptional) | Gets the latest build by choosing the maximum build id for a specific test plan | | getProjectKeywords(self, *argsPositional, **argsOptional) | Gets a dictionary of valid keywords for a project | | returns an empty dictionary, if no keywords are defined | | getProjectPlatforms(self, *argsPositional, **argsOptional) | Gets a dictionary of platforms for a project | | returns an empty dictionary, if no platform is assigned | | getProjectTestPlans(self, *argsPositional, **argsOptional) | Gets a list of test plans within a project | | returns an empty list, if no testplan is assigned | | getProjects(self, *argsPositional, **argsOptional) | Gets a list of all projects | | returns an empty list, if no test project exist | | getReqCoverage(self, *argsPositional, **argsOptional) | Get requirement coverage. | Retrieve the test cases associated to a requirement | | mandatory arg: | testprojectid - identifies the test project | requirementdocid - identifies the requirement | | getReqSpecCustomFieldDesignValue(self, *argsPositional, **argsOptional) | Gets a Custom Field of a Requirement Specification in Design Scope. | | getRequirementCustomFieldDesignValue(self, *argsPositional, **argsOptional) | Gets a Custom Field of a Requirement Specification in Design Scope. | | getRequirements(self, *argsPositional, **argsOptional) | Get requirements. | | mandatory arg: testprojectid - identifies the test project | | optional args: testplanid, platformid | | getTestCase(self, *argsPositional, **argsOptional) | get test case specification using external or internal id | | attention - be careful with testcaseexternalid - it must include an '-'. | otherwise TL (<=1.9.8) returns | <ProtocolError for xmlrpc.php: 500 Internal Server Error> | | getTestCaseAssignedTester(self, *argsPositional, **argsOptional) | Gets the result of LAST EXECUTION for a particular testcase on a | test plan. | | testplanid test plan id | testcaseexternalid format PREFIX-NUMBER | | args variations: buildid - buildname | platformid - platformname | build information is general mandatory | platform information is required, when test plan has assigned platforms | | getTestCaseAttachments(self, *argsPositional, **argsOptional) | Gets attachments for specified test case. | | args variations: testcaseid - testcaseexternalid | | version - optional, if not present, the latest test case version | will be used | | The attachment file content is Base64 encoded. To save the file to disk | in client, Base64 decode the content and write file in binary mode. | | getTestCaseBugs(self, *argsPositional, **argsOptional) | Returns all bugs linked to a particular testcase on a test plan. | If there are no filter criteria regarding platform and build, | result will be get WITHOUT checking for a particular platform and build. | | | testplanid test plan id | | args variations: testcaseid - testcaseexternalid (mandatory!) | buildid - buildname | platformid - platformname | test case information is general mandatory | | getTestCaseCustomFieldDesignValue(self, *argsPositional, **argsOptional) | Gets value of a Custom Field with scope='design' for a given Test case | | details = changes output information | null or 'value' => just value | 'full' => a map with all custom field definition | plus value and internal test case id | 'simple' => value plus custom field name, label, and type (as code). | | attention - be careful with testcaseexternalid - it must include an '-'. | otherwise TL (<=1.9.8) returns | <ProtocolError for xmlrpc.php: 500 Internal Server Error> | | getTestCaseCustomFieldExecutionValue(self, *argsPositional, **argsOptional) | Gets a Custom Field of a Test Case in Execution Scope. | | getTestCaseCustomFieldTestPlanDesignValue(self, *argsPositional, **argsOptional) | Gets a Custom Field of a Test Case in Test Plan Design Scope. | | getTestCaseKeywords(self, *argsPositional, **argsOptional) | Gets a dictionary of keywords for a given Test case | | args variations: testcaseid - testcaseexternalid (mandatoy!) | | returns an empty dictionary, if no keywords are defined | | getTestCasesForTestPlan(self, *argsPositional, **argsOptional) | List test cases linked to a test plan | | details - default is 'full', | 'simple', 'details' ?? | | args variations: keywordid - keywords | | returns an empty list, if no build is assigned | | getTestCasesForTestSuite(self, *argsPositional, **argsOptional) | List test cases within a test suite alphabetically | | details - default is 'simple', | use 'full' if you want to get summary,steps & expected_results | or 'only_id', if you just need an ID list | | deep - True/False - default is True | if True, return also test case of child suites | | getkeywords - True/False - default is False | if True AND details='full', dictionary includes for each test | case, which as assigned keywords, an additional key value pair | 'keywords' | | returns an empty list, if no build is assigned | | getTestPlanByName(self, *argsPositional, **argsOptional) | Gets info about target test project | | getTestPlanCustomFieldDesignValue(self, *argsPositional, **argsOptional) | Gets a Custom Field of a Test Plan in Design Scope. | | getTestPlanPlatforms(self, *argsPositional, **argsOptional) | Returns the list of platforms associated to a given test plan | | returns an empty list, if no platform is assigned (api error 3041) | - details see comments for decoMakerApiCallReplaceTLResponseError | | getTestProjectByName(self, *argsPositional, **argsOptional) | Gets info about target test project | | getTestSuite(self, *argsPositional, **argsOptional) | Returns list with all test suites named TESTUITENAME defined for | test project using PREFIX | | getTestSuiteAttachments(self, *argsPositional, **argsOptional) | Gets attachments for specified test suite. | The attachment file content is Base64 encoded. To save the file to disk | in client, Base64 decode the content and write file in binary mode. | | getTestSuiteByID(self, *argsPositional, **argsOptional) | Return a TestSuite by ID | | getTestSuiteCustomFieldDesignValue(self, *argsPositional, **argsOptional) | Gets a Custom Field of a Test Suite in Design Scope. | | getTestSuitesForTestPlan(self, *argsPositional, **argsOptional) | List test suites within a test plan alphabetically | | returns an empty list, if no suite is assigned | | getTestSuitesForTestSuite(self, *argsPositional, **argsOptional) | get list of TestSuites which are DIRECT children of a given TestSuite | | returns an empty list, if no TestSuite is assigned | | getTotalsForTestPlan(self, *argsPositional, **argsOptional) | Gets the summarized results grouped by platform. | | getUserByID(self, *argsPositional, **argsOptional) | returns user data for account with USERID in users table, column ID | | * if everything ok returns an array on just one element with following user data | * | * firstName,lastName,emailAddress,locale,isActive,defaultTestprojectID, | * globalRoleID | * globalRole array with role info | * tprojectRoles array | * tplanRoles array | * login | * dbID | * loginRegExp | * | * ATTENTION: userApiKey will be set to NULL, because is worst that access to user password | | getUserByLogin(self, *argsPositional, **argsOptional) | returns user data for account with login name USER | | if everything ok returns an array on just one element with following user data | * | * firstName,lastName,emailAddress,locale,isActive,defaultTestprojectID, | * globalRoleID | * globalRole array with role info | * tprojectRoles array | * tplanRoles array | * login | * dbID | * loginRegExp | * | * ATTENTION: userApiKey will be set to NULL, because is worst that access to user password | | ping(self) | alias for methodAPI sayHello | | removePlatformFromTestPlan(self, *argsPositional, **argsOptional) | Removes a platform from a test plan | | removeTestCaseKeywords(self, *argsPositional, **argsOptional) | removes list of keywords from a set of test cases | | expects as arg <keywords> a dictionary with | <testcaseexternalid> as a key and <list of keywords> as value | | example: | {'TC-4711' : ['KeyWord02'], 'TC-4712' : ['KeyWord01', KeyWord03']} | | removes from test case 'TC-4711' the keyword 'KeyWord02' | removes from test case 'TC-4712' the keywords 'KeyWord01' + KeyWord03' | | repeat(self, *argsPositional, **argsOptional) | Repeats a message back | | reportTCResult(self, *argsPositional, **argsOptional) | Reports a result for a single test case | | args variations: testcaseid - testcaseexternalid | buildid - buildname | platformid - platformname | | customfields : dictionary with customfields names + values | VERY IMPORTANT: value must be formatted in the way it's written to db | overwrite : if present and true, then last execution for | (testcase,testplan,build,platform) will be overwritten. | user : if present and user is a valid login (no other check will be done) | it will be used when writing execution. | execduration : Exec (min) as float (2.5 = 2min 30sec) | timestamp : 'YYYY-MM-DD hh:mm[:ss]'# | steps : [{'step_number' : 6, 'result' : 'p', 'notes" : 'a_note'}, | {'step_number' : 7, 'result' : 'f', 'notes" : 'blabla'}] | | sayHello(self) | Lets you see if the server is up and running | | setTestCaseExecutionType(self, *argsPositional, **argsOptional) | Update execution type for a test case version | | possible executiontype values | 1 = TESTCASE_EXECUTION_TYPE_MANUAL, 2 = TESTCASE_EXECUTION_TYPE_AUTO | | setTestCaseTestSuite(self, *argsPositional, **argsOptional) | move a test case to a different Test Suite | | mandatory arg: | testcaseexternalid - identifies the test case | testsuiteid - identifies the test suite | | testLinkVersion(self) | Returns the TestLink Version | usable with TL>= 1.9.9 , returns '<= 1.9.8' for older versions | | unassignTestCaseExecutionTask(self, *argsPositional, **argsOptional) | assigns a user to a test case execution task | | testplanid test plan id | testcaseexternalid format PREFIX-NUMBER | | args variations: buildid - buildname | platformid - platformname | user (login name) - action ('unassignAll') | build information is general mandatory | platform information is required, when test plan has assigned platforms | if action=='unassignAll', user information is not needed | - otherwise, TL itself will set action to 'unassignOne' and expects a | valid user information (login name => tester) | | updateBuildCustomFieldsValues(self, *argsPositional, **argsOptional) | Update value of Custom Field with scope='design' for a given Build | | customfields : dictionary with customfields names + values | VERY IMPORTANT: value must be formatted in the way it's written to db | | updateTestCase(self, *argsPositional, **argsOptional) | Update an existing test case | | steps array - each element is a hash with following keys | step_number,actions,expected_results,execution_type | user login name used as updater - optional | if not provided will be set to user that request update | | Not all test case attributes will be able to be updated using this method | | updateTestCaseCustomFieldDesignValue(self, *argsPositional, **argsOptional) | Update value of Custom Field with scope='design' for a given Test case | | customfields : dictionary with customfields names + values | VERY IMPORTANT: value must be formatted in the way it's written to db | | updateTestSuite(self, *argsPositional, **argsOptional) | update a test suite | | mandatory arg: testsuiteid - identifies the test suite to be change | | mandatory args variations: testprojectid or prefix | - test project information is general mandatory | | optional args: | - testsuitename - if defined, test suite name will be changed | - details - if defined test suite details will be changed | - order - if defined, order inside parent container is changed | | updateTestSuiteCustomFieldDesignValue(self, *argsPositional, **argsOptional) | Update value of Custom Field with scope='design' for a given Test Suite | | customfields : dictionary with customfields names + values | VERY IMPORTANT: value must be formatted in the way it's written to db | | uploadAttachment(self, attachmentfile, *argsPositional, **argsOptional) | Uploads an attachment for an execution | | fkid - The Attachment Foreign Key ID | fktable - The Attachment Foreign Key Table | | mandatory non api args: attachmentfile | - python file descriptor pointing to the file | - or a valid file path | | default values for filename, filetype, content are determine from | ATTACHMENTFILE, but user could overwrite it, if user want to store the | attachment with a different name | | uploadExecutionAttachment(self, attachmentfile, *argsPositional, **argsOptional) | Uploads an attachment for an execution | | executionid - execution ID | | mandatory non api args: attachmentfile | - python file descriptor pointing to the file | - or a valid file path | | default values for filename, filetype, content are determine from | ATTACHMENTFILE, but user could overwrite it, if user want to store the | attachment with a different name | | uploadRequirementAttachment(self, attachmentfile, *argsPositional, **argsOptional) | Uploads an attachment for a Requirement. | | requirementid - The Requirement ID | | mandatory non api args: attachmentfile | - python file descriptor pointing to the file | - or a valid file path | | default values for filename, filetype, content are determine from | ATTACHMENTFILE, but user could overwrite it, if user want to store the | attachment with a different name | | uploadRequirementSpecificationAttachment(self, attachmentfile, *argsPositional, **argsOptional) | Uploads an attachment for a Requirement Specification. | | reqspecid - The Requirement Specification ID | | mandatory non api args: attachmentfile | - python file descriptor pointing to the file | - or a valid file path | | default values for filename, filetype, content are determine from | ATTACHMENTFILE, but user could overwrite it, if user want to store the | attachment with a different name | | uploadTestCaseAttachment(self, attachmentfile, *argsPositional, **argsOptional) | Uploads an attachment for a Test Case. | | testcaseid - Test Case INTERNAL ID | version - Test Case version number | | mandatory non api args: attachmentfile | - python file descriptor pointing to the file | - or a valid file path | | default values for filename, filetype, content are determine from | ATTACHMENTFILE, but user could overwrite it, if user want to store the | attachment with a different name | | uploadTestProjectAttachment(self, attachmentfile, *argsPositional, **argsOptional) | Uploads an attachment for a Test Project. | | testprojectid - The Test Project ID | | mandatory non api args: attachmentfile | - python file descriptor pointing to the file | - or a valid file path | | default values for filename, filetype, content are determine from | ATTACHMENTFILE, but user could overwrite it, if user want to store the | attachment with a different name | | uploadTestSuiteAttachment(self, attachmentfile, *argsPositional, **argsOptional) | Uploads an attachment for a Test Suite. | | testsuiteid - The Test Suite ID | | mandatory non api args: attachmentfile | - python file descriptor pointing to the file | - or a valid file path | | default values for filename, filetype, content are determine from | ATTACHMENTFILE, but user could overwrite it, if user want to store the | attachment with a different name | | whatArgs(self, methodNameAPI) | returns for METHODNAME a description with | - positional, optional and other (non api) mandatory args | - methods doc/help string | | ---------------------------------------------------------------------- | Data descriptors inherited from testlink.testlinkapigeneric.TestlinkAPIGeneric: | | devKey | | server | | ---------------------------------------------------------------------- | Data and other attributes inherited from testlink.testlinkapigeneric.TestlinkAPIGeneric: | | __version__ = '0.8.1'