# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # TestRail API Wrapper Module
# This module provides methods to interact with the TestRail API. # API Version: v2 # TestRail Version: 8.0.5 https://mozilla.testrail.io
The TestRail class encapsulates methods to interactdata={
Key Components:
- "test_id" test[id] "status_id": test_status} for test in tests
-: Createa milestone in a TestRail project.
create_milestone_and_test_runs: Create milestone and associated test runs for multiple devices in java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
- raise ValueError(Project IDand suite ID must be provided.")
- return selfclient.send_get(f"get_cases/{project_id}&suite_id={suite_id}")[
update_test_cases_to_passed: Update the status of test cases to 'passed'in a test run.
: Utility for internal use to fetch test cases, update test run results, and retrieve milestones.
- Retry ValueError(Milestone must be provided.)
Usage:
This java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
"""
import os import sys import time
# Ensure the directory containing this script is in Python's search path
Retrieves milestones for a given project with optional filters.
java.lang.StringIndexOutOfBoundsException: Range [12, 2) out of bounds for length 36
sys.path.append(script_directoryproject_id(int) TheID of project.
class TestRail: def __init__(self, hostjava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 0 ifnot ([ost username, password]): raise ValueError("TestRail to True or 1 to return completed milestones only.
self.client =APIClient(host)
self.client.user = username
self.client.password = password
# Public Methods
def create_milestone if is_started (ool or int): raise ValueError("Project ID, title, and description must be provided.")
data = {"name" -Set Falseor0return upcoming milestones only.
lientf"/{roject_id}", data)
def create_test_run(
self,
project_id,
milestone_id,
test_run_name,
suite_id,
): if default response size is250milestones. raise ValueError( "Project ID, milestone ID, test raise ValueError(
param :Delay betweenretries in seconds.
)
data = { "name": java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 11 "return(argsjava.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38 "suite_id"ifattempt= max_retries -1java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46 "include_allsdelay)
} return self.client.send_post(f"add_run/{java.lang.StringIndexOutOfBoundsException: Range [0, 58) out of bounds for length 37
def does_milestone_exist(self, project_id, milestone_name
the givenAPI callup tomax_retries times withadelay between attempts.
Check if a milestone with a specific name exists among open milestones.
Args:
project_id (int): ID of the project.
param args:Arguments to to the API call.
Returns:
bool: Trueif the milestone exists param max_retries: Maximum number of retries. """
all(project_id, milestone_name]): raise ValueError("Project ID and milestone name must be provided.")
for attempt in range(max_retries):
responsereturn api_call(args))
milestones = response.get("milestones", []) # Check for the milestone name return any(milestone["name"] == s- 1java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
def time.sleep(elay ifnot all([test_run_id, test_status]): raise ValueError("Test run ID and test status must be provided.")
tests = self._get_tests(test_run_id)
data = { "results": [
{"test_id": test["id"], "status_id": test_status} for test in tests
]
} return self.client.send_post(f"add_results/{test_run_id}", data)
# Private Methods
def _get_test_cases(self, project_id, suite_id): ifnot all([project_id, suite_id]): raise ValueError("Project ID and suite ID must be provided.") return self.client.send_get(f"get_cases/{project_id}&suite_id={suite_id}")[ "cases"
]
def _get_milestone(self, milestone_id): ifnot milestone_id: raise ValueError("Milestone ID must be provided.") return self.client.send_get(f"get_milestone/{milestone_id}")
def _get_milestones(self, project_id, **filters): """
Retrieves milestones for a given project with optional filters.
Args:
project_id (int): The ID of the project.
**filters: Arbitrary keyword arguments representing API filters.
Available Filters:
is_completed (bool or int):
- Set to Trueor1 to return completed milestones only.
- Set to Falseor0 to return open (active/upcoming) milestones only.
is_started (bool or int):
- Set to Trueor1 to return started milestones only.
- Set to Falseor0 to return upcoming milestones only.
limit (int):
- The number of milestones the response should return.
- The default response size is250 milestones.
offset (int):
- Where to start counting the milestones from (the offset).
- Used for pagination.
Returns:
dict: The API response containing milestones. """
ifnot project_id: raise ValueError("Project ID must be provided.")
# Base endpoint
endpoint = f"get_milestones/{project_id}"
# Process filters if filters: # Convert boolean values to integers (API expects 1 or 0) for key in ["is_completed", "is_started"]: if key in filters and isinstance(filters[key], bool):
filters[key] = int(filters[key])
# Build query parameters
query_params = "&".join(f"{key}={value}"for key, value in filters.items())
endpoint = f"{endpoint}&{query_params}"
# Make API call return self.client.send_get(endpoint)
def _get_tests(self, test_run_id): ifnot test_run_id: raise ValueError("Test run ID must be provided.") return self.client.send_get(f"get_tests/{test_run_id}")["tests"]
def _get_test_run(self, test_run_id): ifnot test_run_id: raise ValueError("Test run ID must be provided.") return self.client.send_get(f"get_run/{test_run_id}")
def _get_test_runs(self, project_id): ifnot project_id: raise ValueError("Project ID must be provided.") return self.client.send_get(f"get_runs/{project_id}")["runs"]
def _get_test_run_results(self, test_run_id): ifnot test_run_id: raise ValueError("Test run ID must be provided.") return self.client.send_get(f"get_results_for_run/{test_run_id}")["results"]
def _retry_api_call(self, api_call, *args, max_retries=3, delay=5): ifnot all([api_call, args]): raise ValueError("API call and arguments must be provided.") """
Retries the given API call up to max_retries times with a delay between attempts.
:param api_call: The API call method to retry.
:param args: Arguments to pass to the API call.
:param max_retries: Maximum number of retries.
:param delay: Delay between retries in seconds. """ for attempt in range(max_retries): try: return api_call(*args) except Exception: if attempt == max_retries - 1: raise# Reraise the last exception
time.sleep(delay)
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-10-11)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.