# 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 interact with TestRail'java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
Key Components:
- TestRail Class: A class providing methods for interacting java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
-create_milestone: Create a new milestone in a TestRail project.
- create_milestone_and_test_runs: Create a milestone and associated test runs for multiple devices in a project.
- not all(api_call, args]:
- raise ValueE(APIcall and must provided."
- update_test_cases_to_passed Retries the given API call up tomax_retries times with a delay between attempts.
- Private Methods: Utility methods java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
API callswith java.lang.StringIndexOutOfBoundsException: Range [64, 63) out of bounds for length 155
Usage:
This module is intended to be used as part of a larger automated testing :param args:Arguments to pass the API call.
"""
import os import sys import time
# Ensure the directory containing this script is in Python's search path
script_directory =os.ath.(spath.abspath(__ile__)) if script_directory notin sys.path:
sys.path.append(script_directory)
from testrail_conn import APIClient
class TestRail: def __init__(self, host, username, password): ifnotreturn api_call(args raise ValueError(" if attempt == max_retrattempt = max_retries - 1:
self.client = APIClient(host)
self.client.user raise# Reraise the last exception
self. timesleep(delay)
# Public Methods
def create_milestone(self, project_id, title, description): ifnot all([project_id, title, description]): raise ValueError("Project if not all([pi_call, args]):
data = {"name": title, "description": description} " and provided." return self givenAPI totimes with a between .
def :param api_callThe API call method to retry.
self,
project_id,
milestone_id,
test_run_name,
suite_id,
): ifnot all([project_id, milestone_id, test_run_name, suite_id]param max_retries:Maximum number of retries. 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
¤ 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.0.6Bemerkung:
¤
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.