|
| 1 | +TestLink-API-Python-client Usage |
| 2 | +================================ |
| 3 | + |
| 4 | +.. contents:: |
| 5 | + :local: |
| 6 | + |
| 7 | +Comment communiquer avec testlink dans une interface système python |
| 8 | +------------------------------------------- |
| 9 | + |
| 10 | +Se connecter à TestLink, compter les projets existants et récupérer les données d'un cas de test: :: |
| 11 | + |
| 12 | + [PYENV]\testlink\Scripts\activate |
| 13 | + set TESTLINK_API_PYTHON_SERVER_URL=http://[YOURSERVER]/testlink/lib/api/xmlrpc/v1/xmlrpc.php |
| 14 | + set TESTLINK_API_PYTHON_DEVKEY=[Users devKey generated by TestLink] |
| 15 | + python |
| 16 | + >>> import testlink |
| 17 | + >>> tls = testlink.TestLinkHelper().connect(testlink.TestlinkAPIClient) |
| 18 | + >>> tls.countProjects() |
| 19 | + 3 |
| 20 | + >>> tls.getTestCase(None, testcaseexternalid='NPROAPI3-1') |
| 21 | + [{'full_tc_external_id': 'NPROAPI3-1', 'node_order': '0', 'is_open': '1', 'id': '2757', ...}] |
| 22 | + |
| 23 | +Demander au TestLink API Client quels arguments attend une des méthodes de l'API: :: |
| 24 | + |
| 25 | + import testlink |
| 26 | + tlh = testlink.TestLinkHelper() |
| 27 | + tls = tlh.connect(testlink.TestlinkAPIClient) |
| 28 | + print tls.whatArgs('createTestPlan') |
| 29 | + > createTestPlan(<testplanname>, <testprojectname>, [note=<note>], [active=<active>], |
| 30 | + [public=<public>], [devKey=<devKey>]) |
| 31 | + > create a test plan |
| 32 | + |
| 33 | +Générer une description de toutes les méthodes implémentées par l'API: :: |
| 34 | + |
| 35 | + import testlink |
| 36 | + tlh = testlink.TestLinkHelper() |
| 37 | + tls = tlh.connect(testlink.TestlinkAPIClient) |
| 38 | + for m in testlink.testlinkargs._apiMethodsArgs.keys(): |
| 39 | + print(tls.whatArgs(m), '\n') |
| 40 | + |
| 41 | +Copier les cas de test |
| 42 | +--------------- |
| 43 | + |
| 44 | +Copier un cas de test dans une autre suite en changeant son nom:: |
| 45 | + |
| 46 | + >>> import testlink |
| 47 | + >>> tls = testlink.TestLinkHelper().connect(testlink.TestlinkAPIClient) |
| 48 | + >>> tc_info = tls.getTestCase(None, testcaseexternalid='NPROAPI-3') |
| 49 | + [{'full_tc_external_id': 'NPROAPI-3', ..., 'id': '5440', 'version': '2', |
| 50 | + 'testsuite_id': '5415', 'tc_external_id': '3','testcase_id': '5425', ...}] |
| 51 | + >>> tls.copyTCnewTestCase(tc_info[0]['testcase_id'], testsuiteid=newSuiteID, |
| 52 | + testcasename='a new test case name') |
| 53 | + |
| 54 | +Créer une nouvelle version d'un cas de test en changeant sa description et son importance:: |
| 55 | + |
| 56 | + >>> import testlink |
| 57 | + >>> tls = testlink.TestLinkHelper().connect(testlink.TestlinkAPIClient) |
| 58 | + >>> tc_info = tls.getTestCase(None, testcaseexternalid='NPROAPI-3') |
| 59 | + [{'full_tc_external_id': 'NPROAPI-3', ..., 'id': '5440', 'version': '2', |
| 60 | + 'testsuite_id': '5415', 'tc_external_id': '3','testcase_id': '5425', ...}] |
| 61 | + >>> tls.copyTCnewVersion(tc_info[0]['testcase_id'], summary='new summary', |
| 62 | + importance='1') |
| 63 | + |
| 64 | + |
| 65 | +Par défaut, la dernière version d'un cas de test sera utilisée pour la copie. |
| 66 | +Si une autre version doit être copiée, il est possible de spécifier la version |
| 67 | +attendue en tant que deuxième argument. Example:: |
| 68 | + |
| 69 | + >>> tls.copyTCnewTestCase(tc_info[0]['testcase_id'], 1, testsuiteid=newSuiteID, |
| 70 | + testcasename='a new test case name') |
| 71 | + >>> tls.copyTCnewVersion(tc_info[0]['testcase_id'], 1, summary='new summary', |
| 72 | + importance='1') |
| 73 | + |
| 74 | +Rapporter les résultats du test |
| 75 | +------------------- |
| 76 | + |
| 77 | +En utilisant la classe TestlinkAPIClient - exemple d'un cas de test échoué |
| 78 | +sans auteur (l'argument 'user' n'est utilisable qu'à partir d'une version |
| 79 | +de TestLink de 1.9.10 ou supérieure): |
| 80 | + |
| 81 | + >>> import testlink |
| 82 | + >>> tls = testlink.TestLinkHelper().connect(testlink.TestlinkAPIClient) |
| 83 | + >>> tls.reportTCResult(a_TestCaseID, a_TestPlanID, 'a build name', 'f', |
| 84 | + 'some notes', |
| 85 | + user='a user login name', platformid=a_platformID) |
| 86 | + |
| 87 | + |
| 88 | +En utilisant la classe TestlinkAPIGeneric - exemple d'un cas de test passé |
| 89 | +en utilisant un auteur (argument 'user'): |
| 90 | + |
| 91 | + >>> import testlink |
| 92 | + >>> tls = testlink.TestLinkHelper().connect(testlink.TestlinkAPIGeneric) |
| 93 | + >>> tls.reportTCResult(a_TestPlanID, 'p', testcaseid=a_TestCaseID, |
| 94 | + buildname='a build name', notes='some notes', |
| 95 | + user='a login name', platformid=a_platformID) |
| 96 | + |
| 97 | + |
| 98 | +En utilisant la classe TestlinkAPIGeneric - exemple d'un cas de test bloqué |
| 99 | +sans auteur |
| 100 | + |
| 101 | + >>> import testlink |
| 102 | + >>> tls = testlink.TestLinkHelper().connect(testlink.TestlinkAPIGeneric) |
| 103 | + >>> exTCID = tls.getTestCase(testcaseid=a_TestCaseID)[0]['full_tc_external_id'] |
| 104 | + >>> tls.reportTCResult(a_TestPlanID, 'b', testcaseexternalid=exTCID, |
| 105 | + buildid='a build name', platformname='a platform name') |
| 106 | + |
| 107 | +Rapport de résultats de tests avec horodatage et résultat des étapes |
| 108 | +-------------------------------------------------- |
| 109 | + |
| 110 | +Ce résultat de test utilise son id externe (testcaseexternalid), et non l'id interne (testcaseid) |
| 111 | + |
| 112 | +- Les arguments 'execduration' et 'timestamp' requièrent une version de |
| 113 | + TestLink de 1.9.14 ou supérieure |
| 114 | +- L'argument 'steps' requiert une version de TestLink de 1.9.15 ou supérieure |
| 115 | + |
| 116 | + >>> import testlink |
| 117 | + >>> tls = testlink.TestLinkHelper().connect(testlink.TestlinkAPIClient) |
| 118 | + >>> tls.reportTCResult(None, newTestPlanID_A, None, 'f', '', guess=True, |
| 119 | + testcaseexternalid=tc_aa_full_ext_id, platformname=NEWPLATFORM_A, |
| 120 | + execduration=3.9, timestamp='2015-09-18 14:33', |
| 121 | + steps=[{'step_number' : 6, 'result' : 'p', 'notes' : 'result note for passed step 6'}, |
| 122 | + {'step_number' : 7, 'result' : 'f', 'notes' : 'result note for failed step 7'}] ) |
| 123 | + |
| 124 | +Envoyer des pièces jointes |
| 125 | +------------------ |
| 126 | + |
| 127 | +Télécharger des pièces jointes peut être fait de deux différentes manières: |
| 128 | + |
| 129 | +Avec un descripteur de fichier : |
| 130 | + |
| 131 | + a_file_obj=open(CHEMIN_VALIDE_VERS_LE_FICHIER) |
| 132 | + newAttachment = myTestLink.uploadExecutionAttachment(a_file_obj, A_Result_ID, |
| 133 | + 'Attachment Title', 'Attachment Description') |
| 134 | + |
| 135 | + |
| 136 | +Ou avec un chemin de fichier : |
| 137 | + |
| 138 | + a_file_path=A_VALID_FILE_PATH |
| 139 | + newAttachment = myTestLink.uploadExecutionAttachment(CHEMIN_VALIDE_VERS_LE_FICHIER, A_Result_ID, |
| 140 | + 'Attachment Title', 'Attachment Description') |
| 141 | + |
| 142 | +Lister les mots-clés |
| 143 | +------------- |
| 144 | + |
| 145 | +En utilisant une méthode de l'API (classe TestlinkAPIGeneric) - |
| 146 | +Lister les mots-clés de tous les cas de test d'une suite: |
| 147 | + |
| 148 | + >>> import testlink |
| 149 | + >>> tls = testlink.TestLinkHelper().connect(testlink.TestlinkAPIClient) |
| 150 | + >>> ts_kw = tls.getTestCasesForTestSuite(SuiteID, False, 'full', getkeywords=True) |
| 151 | + |
| 152 | + |
| 153 | +En utilisant une méthode de l'API (classe TestlinkAPIGeneric) - |
| 154 | +Lister tous les mots clés d'une suite de test et ses sous-suites |
| 155 | + |
| 156 | + >>> ts_kw = tls.getTestCasesForTestSuite(SuiteID, True, 'full', getkeywords=True) |
| 157 | + |
| 158 | +En utilisant une méthode du service (classe TestlinkAPIClient) - |
| 159 | +Lister tous les mots clés sans ses détails pour un cas de test |
| 160 | + |
| 161 | + >>> tc_kw = tls.listKeywordsForTC(5440) |
| 162 | + >>> tc_kw = tls.listKeywordsForTC('NPROAPI-3') |
| 163 | + |
| 164 | +En utilisant une méthode du service (classe TestlinkAPIClient) - |
| 165 | +Lister tous les mots clés sans ses détails pour tous les cas de test d'une suite |
| 166 | + |
| 167 | + >>> ts_kw = tls.listKeywordsForTS('5415') |
| 168 | + |
| 169 | + |
| 170 | +Lancement d'un exemple |
| 171 | +------------ |
| 172 | + |
| 173 | +Pour lancer l'exemple "comment utiliser la classe TestlinkAPIClient", en |
| 174 | +spécifiant les paramètres de connexion en tant qu'arguments de ligne de commande [1]_: :: |
| 175 | + |
| 176 | + [PYENV]\testlink\Scripts\activate |
| 177 | + python example\TestLinkExample.py |
| 178 | + --server_url http://[YOURSERVER]/testlink/lib/api/xmlrpc.php |
| 179 | + --devKey [Users devKey generated by TestLink] |
| 180 | + |
| 181 | +Pour lancer l'exemple "comment utiliser la classe TestlinkAPIGeneric", en |
| 182 | +spécifiant les paramètres de connexion en tant que variable d'environment [2]_: :: |
| 183 | + |
| 184 | + [PYENV]\testlink\Scripts\activate |
| 185 | + set TESTLINK_API_PYTHON_SERVER_URL=http://[YOURSERVER]/testlink/lib/api/xmlrpc/v1/xmlrpc.php |
| 186 | + set TESTLINK_API_PYTHON_DEVKEY=[Users devKey generated by TestLink] |
| 187 | + python example\TestLinkExampleGenericApi.py |
| 188 | + |
| 189 | +.. [1] TestLinkExample.py creates a new test project NEW_PROJECT_API-[CountProjects+1]. |
| 190 | +.. [2] TestLinkExampleGenericApi.py creates a new test project PROJECT_API_GENERIC-[CountProjects+1]. |
| 191 | + |
| 192 | +Lancer des tests unitaires |
| 193 | +------------- |
| 194 | + |
| 195 | +Lancer des tests unitaires avec interaction du serveur de TestLink: :: |
| 196 | + |
| 197 | + [PYENV]\testlink\Scripts\activate |
| 198 | + set TESTLINK_API_PYTHON_SERVER_URL=http://[YOURSERVER]/testlink/lib/api/xmlrpc.php |
| 199 | + set TESTLINK_API_PYTHON_DEVKEY=[Users devKey generated by TestLink] |
| 200 | + cd test\utest |
| 201 | + python -m unittest discover -s test\utest-online |
| 202 | + |
| 203 | +Lancer des tests unitaires sans interaction du serveur de TestLink: :: |
| 204 | + |
| 205 | + [PYENV]\testlink\Scripts\activate |
| 206 | + cd test\utest |
| 207 | + python -m unittest discover -s test\utest-offline |
| 208 | + |
| 209 | +En deca de Py26, unittest2_ doit être utilisé. |
| 210 | + |
| 211 | +.. _unittest2: https://pypi.python.org/pypi/unittest2 |
| 212 | + |
| 213 | + |
| 214 | +Comment accéder aux données originelles d'échange de XML |
| 215 | +------------------------------------------ |
| 216 | + |
| 217 | +Si pour des raisons de débogage les versions originelles d'échange de XML sont requises, |
| 218 | +il est possible d'initialiser l'API client avec le paramètre optionnel *verbose* mis à *True*: :: |
| 219 | + |
| 220 | + >>> tlh = testlink.TestLinkHelper() |
| 221 | + >>> tls = testlink.TestlinkAPIClient(tlh._server_url, tl._devkey, verbose=True) |
| 222 | + send: b"POST /testlink/lib/api/xmlrpc/v1/xmlrpc.php HTTP/1.1\r\nHost: ... |
| 223 | + <?xml version='1.0'?>\n<methodCall>\n<methodName>tl.getUserByLogin</methodName>\n<params>...</params>\n</methodCall>\n" |
| 224 | + reply: 'HTTP/1.1 200 OK\r\n' |
| 225 | + header: Date header: Server header: ... body: b'<?xml version="1.0"?>\n<methodResponse>\n <params> ...' |
| 226 | + body: b'</name><value><string>1</string></value></member>\n</struct></value>\n <value><struct>\n ...' |
| 227 | + body: b'... </params>\n</methodResponse>\n' |
| 228 | + |
| 229 | + |
0 commit comments