Repository: aristanetworks/anta
Pull request #1219 (2025-05-23 19:17:03)

feat(anta.tests): Add VerifyOSPFSpecificNeighbors test
# Description

See title.

# Checklist:

<!-- Delete not relevant items !-->

- [X] My code follows the style guidelines of this project
- [X] I have performed a self-review of my code
- [X] I have run pre-commit for code linting and typing (`pre-commit run`)
- [X] I have made corresponding changes to the documentation
- [X] I have added tests that prove my fix is effective or that my feature works
- [X] New and existing unit tests pass locally with my changes (`tox -e testenv`)


codspeed-hq[bot]: <!-- __CODSPEED_PERFORMANCE_REPORT_COMMENT__ -->
<!-- __CODSPEED_INSTRUMENTATION_PERFORMANCE_REPORT_COMMENT__ -->

## [CodSpeed Performance Report](https://codspeed.io/aristanetworks/anta/branches/carl-baillargeon%3Afeat%2Fadd_ospf_tests)

### Merging #1219 will **not alter performance**

<sub>Comparing <code>carl-baillargeon:feat/add_ospf_tests</code> (0f0fcda) with <code>main</code> (fce0e36)</sub>



### Summary

`✅ 26` untouched benchmarks  




sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=aristanetworks_anta&pullRequest=1219) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2 New issues](https://sonarcloud.io/project/issues?id=aristanetworks_anta&pullRequest=1219&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=aristanetworks_anta&pullRequest=1219&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=aristanetworks_anta&pullRequest=1219&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [100.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=aristanetworks_anta&pullRequest=1219&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=aristanetworks_anta&pullRequest=1219&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=aristanetworks_anta&pullRequest=1219)


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=aristanetworks_anta&pullRequest=1219) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1 New issue](https://sonarcloud.io/project/issues?id=aristanetworks_anta&pullRequest=1219&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=aristanetworks_anta&pullRequest=1219&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=aristanetworks_anta&pullRequest=1219&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [100.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=aristanetworks_anta&pullRequest=1219&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=aristanetworks_anta&pullRequest=1219&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=aristanetworks_anta&pullRequest=1219)



Patch:
diff --git a/.github/markdownlint.yaml b/.github/markdownlint.yaml
index 1804cf75..5b1b12ea 100644
--- a/.github/markdownlint.yaml
+++ b/.github/markdownlint.yaml
@@ -6,8 +6,7 @@
 # being expressed.
 
 # default state for all rules
-default:
-  true
+default: true
 
 # heading style
 MD003:
@@ -43,21 +42,17 @@ MD029:
   style: "ordered"
 
 # fenced code  should be surrounded by blank lines default: true
-MD031:
-  true
+MD031: true
 
 # lists should be surrounded by blank lines default: true
-MD032:
-  true
+MD032: true
 
 # MD033/no-inline-html - Inline HTML
-MD033:
-  false
+MD033: false
 
 # bare URL - bare URLs should be wrapped in angle brackets
 # <https://eos.arista.com>
-MD034:
-  false
+MD034: false
 
 # horizontal rule style default: consistent
 MD035:
@@ -65,17 +60,14 @@ MD035:
 
 # first line in a file to be a top-level heading
 # since we're using front-matter, this
-MD041:
-  false
+MD041: false
 
 # proper-names - proper names to have the correct capitalization
 # probably not entirely helpful in a technical writing environment.
-MD044:
-  false
+MD044: false
 
 # block style - disabled to allow for admonitions
-MD046:
-  false
+MD046: false
 
 # MD048/code-fence-style - Code fence style
 MD048:
@@ -94,5 +86,8 @@ MD050:
 
 # MD037/no-space-in-emphasis - Spaces inside emphasis markers
 # This incorrectly catches stars used in table contents, so *foo | *bar is triggered to remove the space between | and *bar.
-MD037:
-  false
+MD037: false
+
+# MD059/descriptive-link-text
+# Link text should be descriptive - by default this rule flags when a link text is "here"
+MD059: false
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 1121aeb3..82af795d 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -47,7 +47,7 @@ repos:
           - "<!--|  ~|  -->"
 
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.11.10
+    rev: v0.11.11
     hooks:
       - id: ruff
         name: Run Ruff linter
@@ -104,7 +104,7 @@ repos:
 
   - repo: https://github.com/igorshubovych/markdownlint-cli
     # Keep v0.44.0 because pre-commit.ci is failing 
-    rev: v0.44.0
+    rev: v0.45.0
     hooks:
       - id: markdownlint
         name: Check Markdown files style.
diff --git a/anta/_runner.py b/anta/_runner.py
index 109108be..eaa1cf9a 100644
--- a/anta/_runner.py
+++ b/anta/_runner.py
@@ -16,7 +16,6 @@ from typing import TYPE_CHECKING, Any
 from pydantic import BaseModel, ConfigDict
 
 from anta import GITHUB_SUGGESTION
-from anta.cli.console import console
 from anta.inventory import AntaInventory
 from anta.logger import anta_log_exception
 from anta.models import AntaTest
@@ -287,7 +286,7 @@ class AntaRunner:
             return ctx
 
         if AntaTest.progress is not None:
-            AntaTest.nrfu_task = AntaTest.progress.add_task("Running NRFU Tests...", total=ctx.total_tests_scheduled)
+            AntaTest.nrfu_task = AntaTest.progress.add_task("Running NRFU Tests ...", total=ctx.total_tests_scheduled)
 
         with Catchtime(logger=logger, message="Running Tests"):
             sem = Semaphore(self._settings.max_concurrency)
@@ -415,48 +414,35 @@ class AntaRunner:
         for coro in coros:
             # Get the AntaTest instance from the coroutine locals, can be in `args` when decorated
             coro_locals = getcoroutinelocals(coro)
-            test = coro_locals.get("self") or coro_locals.get("args", (None))[0]
+            test = coro_locals.get("self") or coro_locals.get("args")
             if isinstance(test, AntaTest):
                 ctx.manager.add(test.result)
+            elif test and isinstance(test, tuple) and isinstance(test[0], AntaTest):
+                ctx.manager.add(test[0].result)
             else:
                 logger.error("Coroutine %s does not have an AntaTest instance.", coro)
             coro.close()
 
     def _log_run_information(self, ctx: AntaRunContext) -> None:
         """Log ANTA run information and potential resource limit warnings."""
-        # 34 is an estimate of the combined length of timestamp, log level name, filename and spacing added by the Rich logger
-        width = min(int(console.width) - 34, len("  Potential connections needed: 100000000\n"))
-
-        # Build device information
-        device_lines = [
-            "Devices:",
-            f"  Total in initial inventory: {ctx.total_devices_in_inventory}",
-        ]
+        logger.info("Initial inventory contains %s devices", ctx.total_devices_in_inventory)
+
         if ctx.total_devices_filtered_by_tags > 0:
-            device_lines.append(f"  Excluded by tags: {ctx.total_devices_filtered_by_tags}")
+            device_list_str = ", ".join(sorted(ctx.devices_filtered_at_setup))
+            logger.info("%d devices excluded by name/tag filters: %s", ctx.total_devices_filtered_by_tags, device_list_str)
+
         if ctx.total_devices_unreachable > 0:
-            device_lines.append(f"  Failed to connect: {ctx.total_devices_unreachable}")
-        device_lines.append(f"  Selected for testing: {ctx.total_devices_selected_for_testing}")
-        joined_device_lines = "\n".join(device_lines)
-
-        # Build title
-        title = " ANTA NRFU Dry Run Information " if ctx.dry_run else " ANTA NRFU Run Information "
-        formatted_title_line = f"{title:-^{width}}"
-
-        # Log run information
-        run_info = "\n".join(
-            [
-                f"{formatted_title_line}",
-                f"{joined_device_lines}",
-                f"Total number of selected tests: {ctx.total_tests_scheduled}",
-                f"{'':-^{width}}",
-            ]
-        )
-        logger.info(run_info)
-        logger.debug("Max concurrent tests: %d", self._settings.max_concurrency)
-        if potential_connections := ctx.selected_inventory.max_potential_connections:
-            logger.debug("Potential connections needed: %d", potential_connections)
-        logger.debug("File descriptors limit: %d", self._settings.file_descriptor_limit)
+            device_list_str = ", ".join(sorted(ctx.devices_unreachable_at_setup))
+            logger.info("%d devices found unreachable after connection attempts: %s", ctx.total_devices_unreachable, device_list_str)
+
+        logger.info("%d devices selected for testing", ctx.total_devices_selected_for_testing)
+        logger.info("%d total tests scheduled across all selected devices", ctx.total_tests_scheduled)
+
+        # Log debugs for runner settings
+        logger.debug("Max concurrent tests configured: %d", self._settings.max_concurrency)
+        if (potential_connections := ctx.selected_inventory.max_potential_connections) is not None:
+            logger.debug("Potential device connections estimated for this run: %d", potential_connections)
+        logger.debug("System file descriptor limit configured: %d", self._settings.file_descriptor_limit)
 
         # Log warnings for potential resource limits
         if ctx.total_tests_scheduled > self._settings.max_concurrency:
diff --git a/anta/input_models/routing/ospf.py b/anta/input_models/routing/ospf.py
new file mode 100644
index 00000000..5c0f6157
--- /dev/null
+++ b/anta/input_models/routing/ospf.py
@@ -0,0 +1,41 @@
+# Copyright (c) 2025 Arista Networks, Inc.
+# Use of this source code is governed by the Apache License 2.0
+# that can be found in the LICENSE file.
+"""Module containing input models for routing OSPF tests."""
+
+from __future__ import annotations
+
+from ipaddress import IPv4Address
+from typing import Annotated, Literal
+
+from pydantic import BaseModel, ConfigDict, Field, field_validator
+
+from anta.custom_types import Interface
+
+
+class OSPFNeighbor(BaseModel):
+    """Model for an OSPF neighbor."""
+
+    model_config = ConfigDict(extra="forbid")
+    instance: int = Field(ge=1, le=65535)
+    """OSPF instance."""
+    vrf: str = "default"
+    """VRF context of the OSPF instance."""
+    ip_address: IPv4Address
+    """Neighbor interface IP address."""
+    local_interface: Interface
+    """Local interface establishing the adjacency."""
+    state: Literal["full", "2Ways"] = "full"
+    """Expected adjacency state."""
+    area_id: IPv4Address | Annotated[int, Field(ge=0, le=4294967295)]
+    """OSPF area-id in decimal or IP address format."""
+
+    @field_validator("area_id", mode="after")
+    @classmethod
+    def convert_area_id(cls, area_id: IPv4Address | int) -> IPv4Address:
+        """Convert a decimal OSPF area-id to an IP address format if needed."""
+        return IPv4Address(area_id) if isinstance(area_id, int) else area_id
+
+    def __str__(self) -> str:
+        """Return a human-readable string representation of the OSPFNeighbor for reporting."""
+        return f"Instance: {self.instance} VRF: {self.vrf} Neighbor IP: {self.ip_address} Area: {self.area_id}"
diff --git a/anta/tools.py b/anta/tools.py
index 45efb13d..c7fd4ab6 100644
--- a/anta/tools.py
+++ b/anta/tools.py
@@ -415,3 +415,45 @@ def format_data(data: dict[str, bool]) -> str:
     "Advertised: True, Received: True, Enabled: True"
     """
     return ", ".join(f"{k.capitalize()}: {v}" for k, v in data.items())
+
+
+def is_interface_ignored(interface: str, ignored_interfaces: list[str] | None = None) -> bool | None:
+    """Verify if an interface is present in the ignored interfaces list.
+
+    Parameters
+    ----------
+    interface
+        This is a string containing the interface name.
+    ignored_interfaces
+        A list containing the interfaces or interface types to ignore.
+
+    Returns
+    -------
+    bool
+        True if the interface is in the list of ignored interfaces, false otherwise.
+    Example
+    -------
+    ```python
+    >>> _is_interface_ignored(interface="Ethernet1", ignored_interfaces=["Ethernet", "Port-Channel1"])
+    True
+    >>> _is_interface_ignored(interface="Ethernet2", ignored_interfaces=["Ethernet1", "Port-Channel"])
+    False
+    >>> _is_interface_ignored(interface="Port-Channel1", ignored_interfaces=["Ethernet1", "Port-Channel"])
+    True
+     >>> _is_interface_ignored(interface="Ethernet1/1", ignored_interfaces: ["Ethernet1/1", "Port-Channel"])
+    True
+    >>> _is_interface_ignored(interface="Ethernet1/1", ignored_interfaces: ["Ethernet1", "Port-Channel"])
+    False
+    >>> _is_interface_ignored(interface="Ethernet1.100", ignored_interfaces: ["Ethernet1.100", "Port-Channel"])
+    True
+    ```
+    """
+    interface_prefix = re.findall(r"^[a-zA-Z-]+", interface, re.IGNORECASE)[0]
+    interface_exact_match = False
+    if ignored_interfaces:
+        for ignored_interface in ignored_interfaces:
+            if interface == ignored_interface:
+                interface_exact_match = True
+                break
+        return bool(any([interface_exact_match, interface_prefix in ignored_interfaces]))
+    return None
diff --git a/asynceapi/device.py b/asynceapi/device.py
index 504d072f..32529e5e 100644
--- a/asynceapi/device.py
+++ b/asynceapi/device.py
@@ -51,7 +51,6 @@ class Device(httpx.AsyncClient):
     httpx.AsyncClient, so any initialization options can be passed directly.
     """
 
-    auth = None
     EAPI_COMMAND_API_URL = "/command-api"
     EAPI_OFMT_OPTIONS = ("json", "text")
     EAPI_DEFAULT_OFMT = "json"
@@ -103,10 +102,8 @@ class Device(httpx.AsyncClient):
         kwargs.setdefault("base_url", httpx.URL(f"{proto}://{self.host}:{self.port}"))
         kwargs.setdefault("verify", False)
 
-        if username and password:
-            self.auth = httpx.BasicAuth(username, password)
-
-        kwargs.setdefault("auth", self.auth)
+        auth_object = httpx.BasicAuth(username, password) if username and password else None
+        kwargs.setdefault("auth", auth_object)
 
         super().__init__(**kwargs)
         self.headers["Content-Type"] = "application/json-rpc"
diff --git a/pyproject.toml b/pyproject.toml
index 20281f73..3aba6ccb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 # content of pyproject.toml
 [build-system]
-requires = ["setuptools>=64.0.0", "wheel"]
+requires = ["setuptools>=77.0.0", "wheel"]
 build-backend = "setuptools.build_meta"
 
 [project]
@@ -66,7 +66,7 @@ dev = [
   "pre-commit>=3.3.3",
   "pylint-pydantic>=0.2.4",
   "pylint>=2.17.5",
-  "pytest-asyncio>=0.21.1",
+  "pytest-asyncio>=1.0.0",
   "pytest-cov>=4.1.0",
   "pytest-dependency",
   "pytest-codspeed>=2.2.0",


Test patch:
diff --git a/anta/tests/aaa.py b/anta/tests/aaa.py
index a135fca5..be79109e 100644
--- a/anta/tests/aaa.py
+++ b/anta/tests/aaa.py
@@ -12,6 +12,7 @@ from typing import TYPE_CHECKING, ClassVar, Literal
 
 from anta.custom_types import AAAAuthMethod
 from anta.models import AntaCommand, AntaTest
+from anta.tools import get_value
 
 if TYPE_CHECKING:
     from anta.models import AntaTemplate
@@ -102,7 +103,8 @@ class VerifyTacacsServers(AntaTest):
             str(server)
             for server in self.inputs.servers
             if not any(
-                str(server) == tacacs_server["serverInfo"]["hostname"] and self.inputs.vrf == tacacs_server["serverInfo"]["vrf"] for tacacs_server in tacacs_servers
+                str(server) == get_value(tacacs_server, "serverInfo.hostname") and self.inputs.vrf == get_value(tacacs_server, "serverInfo.vrf", default="default")
+                for tacacs_server in tacacs_servers
             )
         ]
         if not not_configured:
diff --git a/anta/tests/hardware.py b/anta/tests/hardware.py
index f44657a9..58f2b36d 100644
--- a/anta/tests/hardware.py
+++ b/anta/tests/hardware.py
@@ -9,7 +9,7 @@ from __future__ import annotations
 
 from typing import TYPE_CHECKING, ClassVar, Literal
 
-from anta.custom_types import PowerSupplyFanStatus, PowerSupplyStatus
+from anta.custom_types import PositiveInteger, PowerSupplyFanStatus, PowerSupplyStatus
 from anta.decorators import skip_on_platforms
 from anta.models import AntaCommand, AntaTest
 
@@ -203,12 +203,13 @@ class VerifyEnvironmentCooling(AntaTest):
 
 
 class VerifyEnvironmentPower(AntaTest):
-    """Verifies the power supplies status.
+    """Verifies the power supplies state and input voltage.
 
     Expected Results
     ----------------
-    * Success: The test will pass if the power supplies status are within the accepted states list.
-    * Failure: The test will fail if some power supplies status is not within the accepted states list.
+    * Success: The test will pass if all power supplies are in an accepted state and their input voltage is greater than or equal to `min_input_voltage`
+    (if provided).
+    * Failure: The test will fail if any power supply is in an unaccepted state or its input voltage is less than `min_input_voltage` (if provided).
 
     Examples
     --------
@@ -227,7 +228,9 @@ class VerifyEnvironmentPower(AntaTest):
         """Input model for the VerifyEnvironmentPower test."""
 
         states: list[PowerSupplyStatus]
-        """List of accepted states list of power supplies status."""
+        """List of accepted states for power supplies."""
+        min_input_voltage: PositiveInteger | None = None
+        """Optional minimum input voltage (Volts) to verify."""
 
     @skip_on_platforms(["cEOSLab", "vEOS-lab", "cEOSCloudLab", "vEOS"])
     @AntaTest.anta_test
@@ -240,6 +243,12 @@ class VerifyEnvironmentPower(AntaTest):
             if (state := value["state"]) not in self.inputs.states:
                 self.result.is_failure(f"Power Slot: {power_supply} - Invalid power supplies state - Expected: {', '.join(self.inputs.states)} Actual: {state}")
 
+            # Verify if the power supply voltage is greater than the minimum input voltage
+            if self.inputs.min_input_voltage and value["inputVoltage"] < self.inputs.min_input_voltage:
+                self.result.is_failure(
+                    f"Power Supply: {power_supply} - Input voltage mismatch - Expected: > {self.inputs.min_input_voltage} Actual: {value['inputVoltage']}"
+                )
+
 
 class VerifyAdverseDrops(AntaTest):
     """Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.
diff --git a/anta/tests/interfaces.py b/anta/tests/interfaces.py
index 25a048d6..9760ac17 100644
--- a/anta/tests/interfaces.py
+++ b/anta/tests/interfaces.py
@@ -7,7 +7,6 @@
 # mypy: disable-error-code=attr-defined
 from __future__ import annotations
 
-import re
 from typing import ClassVar, TypeVar
 
 from pydantic import Field, field_validator
@@ -17,7 +16,7 @@ from anta.custom_types import Interface, InterfaceType, Percent, PortChannelInte
 from anta.decorators import skip_on_platforms
 from anta.input_models.interfaces import InterfaceDetail, InterfaceState
 from anta.models import AntaCommand, AntaTemplate, AntaTest
-from anta.tools import custom_division, format_data, get_item, get_value
+from anta.tools import custom_division, format_data, get_item, get_value, is_interface_ignored
 
 BPS_GBPS_CONVERSIONS = 1000000000
 
@@ -25,48 +24,6 @@ BPS_GBPS_CONVERSIONS = 1000000000
 T = TypeVar("T", bound=InterfaceState)
 
 
-def _is_interface_ignored(interface: str, ignored_interfaces: list[str] | None = None) -> bool | None:
-    """Verify if an interface is present in the ignored interfaces list.
-
-    Parameters
-    ----------
-    interface
-        This is a string containing the interface name.
-    ignored_interfaces
-         A list containing the interfaces or interface types to ignore.
-
-    Returns
-    -------
-    bool
-        True if the interface is in the list of ignored interfaces, false otherwise.
-    Example
-    -------
-    ```python
-    >>> _is_interface_ignored(interface="Ethernet1", ignored_interfaces=["Ethernet", "Port-Channel1"])
-    True
-    >>> _is_interface_ignored(interface="Ethernet2", ignored_interfaces=["Ethernet1", "Port-Channel"])
-    False
-    >>> _is_interface_ignored(interface="Port-Channel1", ignored_interfaces=["Ethernet1", "Port-Channel"])
-    True
-     >>> _is_interface_ignored(interface="Ethernet1/1", ignored_interfaces: ["Ethernet1/1", "Port-Channel"])
-    True
-    >>> _is_interface_ignored(interface="Ethernet1/1", ignored_interfaces: ["Ethernet1", "Port-Channel"])
-    False
-    >>> _is_interface_ignored(interface="Ethernet1.100", ignored_interfaces: ["Ethernet1.100", "Port-Channel"])
-    True
-    ```
-    """
-    interface_prefix = re.findall(r"^[a-zA-Z-]+", interface, re.IGNORECASE)[0]
-    interface_exact_match = False
-    if ignored_interfaces:
-        for ignored_interface in ignored_interfaces:
-            if interface == ignored_interface:
-                interface_exact_match = True
-                break
-        return bool(any([interface_exact_match, interface_prefix in ignored_interfaces]))
-    return None
-
-
 class VerifyInterfaceUtilization(AntaTest):
     """Verifies that the utilization of interfaces is below a certain threshold.
 
@@ -77,7 +34,7 @@ class VerifyInterfaceUtilization(AntaTest):
 
     Expected Results
     ----------------
-    * Success: The test will pass if all interfaces have a usage below the threshold.
+    * Success: The test will pass if all or specified interfaces have a usage below the threshold.
     * Failure: If any of the following occur:
         - One or more interfaces have a usage above the threshold.
         - The device has at least one non full-duplex interface.
@@ -91,6 +48,9 @@ class VerifyInterfaceUtilization(AntaTest):
           ignored_interfaces:
             - Ethernet1
             - Port-Channel1
+          interfaces:
+            - Ethernet10
+            - Loopback0
     ```
     """
 
@@ -105,6 +65,8 @@ class VerifyInterfaceUtilization(AntaTest):
 
         threshold: Percent = 75.0
         """Interface utilization threshold above which the test will fail."""
+        interfaces: list[Interface] | None = None
+        """A list of interfaces to be tested. If not provided, all interfaces (excluding any in `ignored_interfaces`) are tested."""
         ignored_interfaces: list[InterfaceType | Interface] | None = None
         """A list of interfaces or interface types like Management which will ignore all Management interfaces."""
 
@@ -115,11 +77,17 @@ class VerifyInterfaceUtilization(AntaTest):
         duplex_full = "duplexFull"
         rates = self.instance_commands[0].json_output
         interfaces = self.instance_commands[1].json_output
+        interface_details = self.inputs.interfaces if self.inputs.interfaces else rates["interfaces"].keys()
 
-        for intf, rate in rates["interfaces"].items():
+        for intf in interface_details:
             interface_data = []
             # Verification is skipped if the interface is in the ignored interfaces list.
-            if _is_interface_ignored(intf, self.inputs.ignored_interfaces):
+            if is_interface_ignored(intf, self.inputs.ignored_interfaces):
+                continue
+
+            # If specified interface is not configured, test fails
+            if (intf_data := get_value(rates["interfaces"], intf)) is None:
+                self.result.is_failure(f"Interface: {intf} - Not found")
                 continue
 
             # The utilization logic has been implemented for full-duplex interfaces only
@@ -141,7 +109,7 @@ class VerifyInterfaceUtilization(AntaTest):
 
             # If one or more interfaces have a usage above the threshold, test fails.
             for bps_rate in ("inBpsRate", "outBpsRate"):
-                usage = rate[bps_rate] / bandwidth * 100
+                usage = intf_data[bps_rate] / bandwidth * 100
                 if usage > self.inputs.threshold:
                     self.result.is_failure(
                         f"Interface: {intf} BPS Rate: {bps_rate} - Usage exceeds the threshold - Expected: < {self.inputs.threshold}% Actual: {usage}%"
@@ -170,6 +138,8 @@ class VerifyInterfaceErrors(AntaTest):
     class Input(AntaTest.Input):
         """Input model for the VerifyInterfaceErrors test."""
 
+        interfaces: list[Interface] | None = None
+        """A list of interfaces to be tested. If not provided, all interfaces (excluding any in `ignored_interfaces`) are tested."""
         ignored_interfaces: list[InterfaceType | Interface] | None = None
         """A list of interfaces or interface types like Management which will ignore all Management interfaces."""
 
@@ -178,11 +148,18 @@ class VerifyInterfaceErrors(AntaTest):
         """Main test function for VerifyInterfaceErrors."""
         self.result.is_success()
         command_output = self.instance_commands[0].json_output
-        for interface, counters in command_output["interfaceErrorCounters"].items():
+        interfaces = self.inputs.interfaces if self.inputs.interfaces else command_output["interfaceErrorCounters"].keys()
+        for interface in interfaces:
             # Verification is skipped if the interface is in the ignored interfaces list.
-            if _is_interface_ignored(interface, self.inputs.ignored_interfaces):
+            if is_interface_ignored(interface, self.inputs.ignored_interfaces):
+                continue
+
+            # If specified interface is not configured, test fails
+            if (intf_counters := get_value(command_output["interfaceErrorCounters"], interface)) is None:
+                self.result.is_failure(f"Interface: {interface} - Not found")
                 continue
-            counters_data = [f"{counter}: {value}" for counter, value in counters.items() if value > 0]
+
+            counters_data = [f"{counter}: {value}" for counter, value in intf_counters.items() if value > 0]
             if counters_data:
                 self.result.is_failure(f"Interface: {interface} - Non-zero error counter(s) - {', '.join(counters_data)}")
 
@@ -192,7 +169,7 @@ class VerifyInterfaceDiscards(AntaTest):
 
     Expected Results
     ----------------
-    * Success: The test will pass if all interfaces have discard counters equal to zero.
+    * Success: The test will pass if all or specified interfaces have discard counters equal to zero.
     * Failure: The test will fail if one or more interfaces have non-zero discard counters.
 
     Examples
@@ -200,9 +177,12 @@ class VerifyInterfaceDiscards(AntaTest):
     ```yaml
     anta.tests.interfaces:
       - VerifyInterfaceDiscards:
-          ignored_interfaces:
+          interfaces:
             - Ethernet
             - Port-Channel1
+          ignored_interfaces:
+            - Vxlan1
+            - Loopback0
     ```
     """
 
@@ -212,6 +192,8 @@ class VerifyInterfaceDiscards(AntaTest):
     class Input(AntaTest.Input):
         """Input model for the VerifyInterfaceDiscards test."""
 
+        interfaces: list[Interface] | None = None
+        """A list of interfaces to be tested. If not provided, all interfaces (excluding any in `ignored_interfaces`) are tested."""
         ignored_interfaces: list[InterfaceType | Interface] | None = None
         """A list of interfaces or interface types like Management which will ignore all Management interfaces."""
 
@@ -220,11 +202,19 @@ class VerifyInterfaceDiscards(AntaTest):
         """Main test function for VerifyInterfaceDiscards."""
         self.result.is_success()
         command_output = self.instance_commands[0].json_output
-        for interface, interface_data in command_output["interfaces"].items():
+        interfaces = self.inputs.interfaces if self.inputs.interfaces else command_output["interfaces"].keys()
+
+        for interface in interfaces:
             # Verification is skipped if the interface is in the ignored interfaces list.
-            if _is_interface_ignored(interface, self.inputs.ignored_interfaces):
+            if is_interface_ignored(interface, self.inputs.ignored_interfaces):
+                continue
+
+            # If specified interface is not configured, test fails
+            if (intf_details := get_value(command_output["interfaces"], interface)) is None:
+                self.result.is_failure(f"Interface: {interface} - Not found")
                 continue
-            counters_data = [f"{counter}: {value}" for counter, value in interface_data.items() if value > 0]
+
+            counters_data = [f"{counter}: {value}" for counter, value in intf_details.items() if value > 0]
             if counters_data:
                 self.result.is_failure(f"Interface: {interface} - Non-zero discard counter(s): {', '.join(counters_data)}")
 
@@ -358,34 +348,56 @@ class VerifyStormControlDrops(AntaTest):
     ```yaml
     anta.tests.interfaces:
       - VerifyStormControlDrops:
+          interfaces:
+            - Ethernet1
+            - Ethernet2
+          ignored_interfaces:
+            - Vxlan1
+            - Loopback0
     ```
     """
 
     categories: ClassVar[list[str]] = ["interfaces"]
     commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show storm-control", revision=1)]
 
+    class Input(AntaTest.Input):
+        """Input model for the VerifyStormControlDrops test."""
+
+        interfaces: list[Interface] | None = None
+        """A list of interfaces to be tested. If not provided, all interfaces (excluding any in `ignored_interfaces`) are tested."""
+        ignored_interfaces: list[InterfaceType | Interface] | None = None
+        """A list of interfaces or interface types like Management which will ignore all Management interfaces."""
+
     @skip_on_platforms(["cEOSLab", "vEOS-lab", "cEOSCloudLab", "vEOS"])
     @AntaTest.anta_test
     def test(self) -> None:
         """Main test function for VerifyStormControlDrops."""
         command_output = self.instance_commands[0].json_output
-        storm_controlled_interfaces = []
         self.result.is_success()
+        interfaces = self.inputs.interfaces if self.inputs.interfaces else command_output["interfaces"].keys()
+
+        for interface in interfaces:
+            # Verification is skipped if the interface is in the ignored interfaces list.
+            if is_interface_ignored(interface, self.inputs.ignored_interfaces):
+                continue
+
+            # If specified interface is not configured, test fails
+            if (intf_details := get_value(command_output["interfaces"], interface)) is None:
+                self.result.is_failure(f"Interface: {interface} - Not found")
+                continue
 
-        for interface, interface_dict in command_output["interfaces"].items():
-            for traffic_type, traffic_type_dict in interface_dict["trafficTypes"].items():
+            for traffic_type, traffic_type_dict in intf_details["trafficTypes"].items():
                 if "drop" in traffic_type_dict and traffic_type_dict["drop"] != 0:
-                    storm_controlled_interfaces.append(f"{traffic_type}: {traffic_type_dict['drop']}")
-            if storm_controlled_interfaces:
-                self.result.is_failure(f"Interface: {interface} - Non-zero storm-control drop counter(s) - {', '.join(storm_controlled_interfaces)}")
+                    storm_controlled_interfaces = f"{traffic_type}: {traffic_type_dict['drop']}"
+                    self.result.is_failure(f"Interface: {interface} - Non-zero storm-control drop counter(s) - {storm_controlled_interfaces}")
 
 
 class VerifyPortChannels(AntaTest):
-    """Verifies there are no inactive ports in all port channels.
+    """Verifies there are no inactive ports in port channels.
 
     Expected Results
     ----------------
-    * Success: The test will pass if there are no inactive ports in all port channels.
+    * Success: The test will pass if there are no inactive ports in all or specified port channels.
     * Failure: The test will fail if there is at least one inactive port in a port channel.
 
     Examples
@@ -396,7 +408,9 @@ class VerifyPortChannels(AntaTest):
           ignored_interfaces:
             - Port-Channel1
             - Port-Channel2
-
+          interfaces:
+            - Port-Channel11
+            - Port-Channel22
     ```
     """
 
@@ -406,6 +420,8 @@ class VerifyPortChannels(AntaTest):
     class Input(AntaTest.Input):
         """Input model for the VerifyPortChannels test."""
 
+        interfaces: list[PortChannelInterface] | None = None
+        """A list of port-channel interfaces to be tested. If not provided, all port-channel interfaces (excluding any in `ignored_interfaces`) are tested."""
         ignored_interfaces: list[PortChannelInterface] | None = None
         """A list of port-channel interfaces to ignore."""
 
@@ -414,17 +430,25 @@ class VerifyPortChannels(AntaTest):
         """Main test function for VerifyPortChannels."""
         self.result.is_success()
         command_output = self.instance_commands[0].json_output
-        for port_channel, port_channel_details in command_output["portChannels"].items():
+        port_channels = self.inputs.interfaces if self.inputs.interfaces else command_output["portChannels"].keys()
+
+        for port_channel in port_channels:
             # Verification is skipped if the interface is in the ignored interfaces list.
-            if _is_interface_ignored(port_channel, self.inputs.ignored_interfaces):
+            if is_interface_ignored(port_channel, self.inputs.ignored_interfaces):
                 continue
+
+            # If specified interface is not configured, test fails
+            if (port_channel_details := get_value(command_output["portChannels"], port_channel)) is None:
+                self.result.is_failure(f"Interface: {port_channel} - Not found")
+                continue
+
             # Verify that the no inactive ports in all port channels.
             if inactive_ports := port_channel_details["inactivePorts"]:
                 self.result.is_failure(f"{port_channel} - Inactive port(s) - {', '.join(inactive_ports.keys())}")
 
 
 class VerifyIllegalLACP(AntaTest):
-    """Verifies there are no illegal LACP packets in all port channels.
+    """Verifies there are no illegal LACP packets in port channels.
 
     Expected Results
     ----------------
@@ -439,6 +463,9 @@ class VerifyIllegalLACP(AntaTest):
           ignored_interfaces:
             - Port-Channel1
             - Port-Channel2
+          interfaces:
+            - Port-Channel10
+            - Port-Channel12
     ```
     """
 
@@ -448,6 +475,8 @@ class VerifyIllegalLACP(AntaTest):
     class Input(AntaTest.Input):
         """Input model for the VerifyIllegalLACP test."""
 
+        interfaces: list[PortChannelInterface] | None = None
+        """A list of port-channel interfaces to be tested. If not provided, all port-channel interfaces (excluding any in `ignored_interfaces`) are tested."""
         ignored_interfaces: list[PortChannelInterface] | None = None
         """A list of port-channel interfaces to ignore."""
 
@@ -456,11 +485,19 @@ class VerifyIllegalLACP(AntaTest):
         """Main test function for VerifyIllegalLACP."""
         self.result.is_success()
         command_output = self.instance_commands[0].json_output
-        for port_channel, port_channel_dict in command_output["portChannels"].items():
+        port_channels = self.inputs.interfaces if self.inputs.interfaces else command_output["portChannels"].keys()
+
+        for port_channel in port_channels:
             # Verification is skipped if the interface is in the ignored interfaces list.
-            if _is_interface_ignored(port_channel, self.inputs.ignored_interfaces):
+            if is_interface_ignored(port_channel, self.inputs.ignored_interfaces):
                 continue
-            for interface, interface_details in port_channel_dict["interfaces"].items():
+
+            # If specified port-channel is not configured, test fails
+            if (port_channel_details := get_value(command_output["portChannels"], port_channel)) is None:
+                self.result.is_failure(f"Interface: {port_channel} - Not found")
+                continue
+
+            for interface, interface_details in port_channel_details["interfaces"].items():
                 # Verify that the no illegal LACP packets in all port channels.
                 if interface_details["illegalRxCount"] != 0:
                     self.result.is_failure(f"{port_channel} Interface: {interface} - Illegal LACP packets found")
@@ -593,7 +630,7 @@ class VerifyL3MTU(AntaTest):
 
         for interface, details in command_output["interfaces"].items():
             # Verification is skipped if the interface is in the ignored interfaces list
-            if _is_interface_ignored(interface, self.inputs.ignored_interfaces) or details["forwardingModel"] != "routed":
+            if is_interface_ignored(interface, self.inputs.ignored_interfaces) or details["forwardingModel"] != "routed":
                 continue
 
             actual_mtu = details["mtu"]
@@ -695,7 +732,7 @@ class VerifyL2MTU(AntaTest):
 
         for interface, details in interface_output.items():
             # Verification is skipped if the interface is in the ignored interfaces list
-            if _is_interface_ignored(interface, self.inputs.ignored_interfaces) or details["forwardingModel"] != "bridged":
+            if is_interface_ignored(interface, self.inputs.ignored_interfaces) or details["forwardingModel"] != "bridged":
                 continue
 
             actual_mtu = details["mtu"]
diff --git a/anta/tests/routing/ospf.py b/anta/tests/routing/ospf.py
index a99ac18a..1c0b2f0a 100644
--- a/anta/tests/routing/ospf.py
+++ b/anta/tests/routing/ospf.py
@@ -9,6 +9,7 @@ from __future__ import annotations
 
 from typing import TYPE_CHECKING, ClassVar
 
+from anta.input_models.routing.ospf import OSPFNeighbor
 from anta.models import AntaCommand, AntaTest
 from anta.tools import get_value
 
@@ -160,3 +161,75 @@ class VerifyOSPFMaxLSA(AntaTest):
                 num_lsa = get_value(instance_data, "lsaInformation.numLsa")
                 if num_lsa > (max_lsa_threshold := round(max_lsa * (max_lsa_threshold / 100))):
                     self.result.is_failure(f"Instance: {instance} - Crossed the maximum LSA threshold - Expected: < {max_lsa_threshold} Actual: {num_lsa}")
+
+
+class VerifyOSPFSpecificNeighbors(AntaTest):
+    """Verifies OSPF specific neighbors.
+
+    Expected Results
+    ----------------
+    * Success: The test will pass if all specified OSPF neighbors meet expected state and area.
+    * Failure: The test will fail if OSPF is not configured, or any specified neighbor is not found or has incorrect state/area.
+
+    Examples
+    --------
+    ```yaml
+    anta.tests.routing:
+      ospf:
+        - VerifyOSPFSpecificNeighbors:
+            neighbors:
+              - instance: 100
+                vrf: default
+                ip_address: 10.1.255.46
+                local_interface: Ethernet2
+                area_id: 0  # Support for decimal format
+                state: full
+              - instance: 200
+                vrf: DEV
+                ip_address: 10.9.1.1
+                local_interface: Vlan911
+                area_id: 0.0.0.1  # Support for IP address format
+                state: 2Ways
+    ```
+    """
+
+    categories: ClassVar[list[str]] = ["ospf"]
+    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show ip ospf neighbor", revision=1)]
+
+    class Input(AntaTest.Input):
+        """Input model for the VerifyOSPFSpecificNeighbors test."""
+
+        neighbors: list[OSPFNeighbor]
+        """List of OSPF neighbors to verify."""
+
+    @AntaTest.anta_test
+    def test(self) -> None:
+        """Main test function for VerifyOSPFSpecificNeighbors."""
+        self.result.is_success()
+
+        # If OSPF is not configured on the device, test fails
+        if not (vrf_data := get_value(self.instance_commands[0].json_output, "vrfs")):
+            self.result.is_failure("OSPF not configured")
+            return
+
+        for neighbor in self.inputs.neighbors:
+            # Try to get the neighbor data from the ospfNeighborEntries output list
+            neighbor_data = {}
+            for entry in get_value(vrf_data, f"{neighbor.vrf}..instList..{neighbor.instance}..ospfNeighborEntries", default=[], separator=".."):
+                if str(neighbor.ip_address) == entry["interfaceAddress"] and neighbor.local_interface == entry["interfaceName"]:
+                    # Neighbor found
+                    neighbor_data = entry
+                    break
+
+            if not neighbor_data:
+                self.result.is_failure(f"{neighbor} - Neighbor not found")
+                continue
+
+            # Check the area_id
+            if (exp_area_id := str(neighbor.area_id)) != (act_area_id := neighbor_data["details"]["areaId"]):
+                self.result.is_failure(f"{neighbor} - Area-ID mismatch - Expected: {exp_area_id} Actual: {act_area_id}")
+                continue
+
+            # Check the adjacency state
+            if (exp_adj_state := neighbor.state) != (act_adj_state := neighbor_data["adjacencyState"]):
+                self.result.is_failure(f"{neighbor} - Adjacency state mismatch - Expected: {exp_adj_state} Actual: {act_adj_state}")
diff --git a/anta/tests/stp.py b/anta/tests/stp.py
index 6b3d4407..80a82e57 100644
--- a/anta/tests/stp.py
+++ b/anta/tests/stp.py
@@ -11,9 +11,9 @@ from typing import ClassVar, Literal
 
 from pydantic import Field
 
-from anta.custom_types import VlanId
+from anta.custom_types import Interface, InterfaceType, VlanId
 from anta.models import AntaCommand, AntaTemplate, AntaTest
-from anta.tools import get_value
+from anta.tools import get_value, is_interface_ignored
 
 
 class VerifySTPMode(AntaTest):
@@ -104,7 +104,7 @@ class VerifySTPCounters(AntaTest):
 
     Expected Results
     ----------------
-    * Success: The test will pass if there are NO STP BPDU packet errors under all interfaces participating in STP.
+    * Success: The test will pass if there are NO STP BPDU packet errors under all or on specified interfaces participating in STP.
     * Failure: The test will fail if there are STP BPDU packet errors on one or many interface(s).
 
     Examples
@@ -112,19 +112,43 @@ class VerifySTPCounters(AntaTest):
     ```yaml
     anta.tests.stp:
       - VerifySTPCounters:
+        interfaces:
+          - Ethernet10
+          - Ethernet12
+        ignored_interfaces:
+           - Vxlan1
+           - Loopback0
     ```
     """
 
     categories: ClassVar[list[str]] = ["stp"]
     commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show spanning-tree counters", revision=1)]
 
+    class Input(AntaTest.Input):
+        """Input model for the VerifySTPCounters test."""
+
+        interfaces: list[Interface] | None = None
+        """A list of interfaces to be tested. If not provided, all interfaces (excluding any in `ignored_interfaces`) are tested."""
+        ignored_interfaces: list[InterfaceType | Interface] | None = None
+        """A list of interfaces or interface types like Ethernet which will ignore all Ethernet interfaces."""
+
     @AntaTest.anta_test
     def test(self) -> None:
         """Main test function for VerifySTPCounters."""
         self.result.is_success()
         command_output = self.instance_commands[0].json_output
+        interfaces = self.inputs.interfaces if self.inputs.interfaces else command_output["interfaces"].keys()
+
+        for interface in interfaces:
+            # Verification is skipped if the interface is in the ignored interfaces list.
+            if is_interface_ignored(interface, self.inputs.ignored_interfaces):
+                continue
+
+            # If specified interface is not configured, test fails
+            if (counters := get_value(command_output["interfaces"], interface)) is None:
+                self.result.is_failure(f"Interface: {interface} - Not found")
+                continue
 
-        for interface, counters in command_output["interfaces"].items():
             if counters["bpduTaggedError"] != 0:
                 self.result.is_failure(f"Interface {interface} - STP BPDU packet tagged errors count mismatch - Expected: 0 Actual: {counters['bpduTaggedError']}")
             if counters["bpduOtherError"] != 0:
diff --git a/docs/api/tests/avt.md b/docs/api/tests/avt.md
index bcf4999f..49b9df18 100644
--- a/docs/api/tests/avt.md
+++ b/docs/api/tests/avt.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for Adaptive Virtual Topology (AVT)
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.avt
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for Adaptive Virtual Topology (AVT)
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for Adaptive Virtual Topology (AVT)
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.avt
 
@@ -36,6 +37,7 @@ anta_title: ANTA Tests for Adaptive Virtual Topology (AVT)
       filters:
         - "!^__init__"
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/bfd.md b/docs/api/tests/bfd.md
index 4fc2fe57..1b5bb4b3 100644
--- a/docs/api/tests/bfd.md
+++ b/docs/api/tests/bfd.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for BFD
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.bfd
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for BFD
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for BFD
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.bfd
 
@@ -35,6 +36,7 @@ anta_title: ANTA Tests for BFD
           anta_hide_test_module_description: true
       filters:
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/connectivity.md b/docs/api/tests/connectivity.md
index ff58489b..02928c09 100644
--- a/docs/api/tests/connectivity.md
+++ b/docs/api/tests/connectivity.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for connectivity
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.connectivity
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for connectivity
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for connectivity
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.connectivity
 
@@ -36,6 +37,7 @@ anta_title: ANTA Tests for connectivity
       filters:
         - "!^__str__"
         - "!^__init__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/cvx.md b/docs/api/tests/cvx.md
index 298e746a..043d7602 100644
--- a/docs/api/tests/cvx.md
+++ b/docs/api/tests/cvx.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for CVX
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.cvx
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for CVX
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for CVX
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.cvx
 
@@ -36,6 +37,7 @@ anta_title: ANTA Tests for CVX
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/evpn.md b/docs/api/tests/evpn.md
index 79a45d81..4ac6874e 100644
--- a/docs/api/tests/evpn.md
+++ b/docs/api/tests/evpn.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for EVPN
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.evpn
 
@@ -19,6 +19,7 @@ anta_title: ANTA Tests for EVPN
         - "!test"
         - "!render"
         - "!^_[^_]"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -27,7 +28,7 @@ anta_title: ANTA Tests for EVPN
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.evpn
 
@@ -36,6 +37,7 @@ anta_title: ANTA Tests for EVPN
           anta_hide_test_module_description: true
       filters:
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/flow_tracking.md b/docs/api/tests/flow_tracking.md
index 8f9ecd92..2e6d7fa8 100644
--- a/docs/api/tests/flow_tracking.md
+++ b/docs/api/tests/flow_tracking.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for flow tracking
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.flow_tracking
 
@@ -19,6 +19,7 @@ anta_title: ANTA Tests for flow tracking
         - "!test"
         - "!render"
         - "!validate_exporters"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -27,7 +28,7 @@ anta_title: ANTA Tests for flow tracking
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.flow_tracking
 
@@ -37,6 +38,7 @@ anta_title: ANTA Tests for flow tracking
       filters:
         - "!^__init__"
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/interfaces.md b/docs/api/tests/interfaces.md
index 59a54f0e..0033cc82 100644
--- a/docs/api/tests/interfaces.md
+++ b/docs/api/tests/interfaces.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for interfaces
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.interfaces
 
@@ -19,6 +19,7 @@ anta_title: ANTA Tests for interfaces
         - "!test"
         - "!render"
         - "!_.*"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -27,7 +28,7 @@ anta_title: ANTA Tests for interfaces
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.interfaces
 
@@ -37,6 +38,7 @@ anta_title: ANTA Tests for interfaces
       filters:
         - "!^__str__"
         - "!^__init__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/logging.md b/docs/api/tests/logging.md
index ead594a0..ef821577 100644
--- a/docs/api/tests/logging.md
+++ b/docs/api/tests/logging.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for logging
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.logging
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for logging
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for logging
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.logging
 
@@ -36,6 +37,7 @@ anta_title: ANTA Tests for logging
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/path_selection.md b/docs/api/tests/path_selection.md
index 11538162..8a1c4620 100644
--- a/docs/api/tests/path_selection.md
+++ b/docs/api/tests/path_selection.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for Router path-selection
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.path_selection
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for Router path-selection
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for Router path-selection
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.path_selection
 
@@ -35,6 +36,7 @@ anta_title: ANTA Tests for Router path-selection
           anta_hide_test_module_description: true
       filters:
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/routing.bgp.md b/docs/api/tests/routing.bgp.md
index 8a0e66ee..0c754fbc 100644
--- a/docs/api/tests/routing.bgp.md
+++ b/docs/api/tests/routing.bgp.md
@@ -16,7 +16,7 @@ anta_title: ANTA Tests for BGP
       - `VerifyBGPPeerSessionRibd`
       - `VerifyBGPPeersHealthRibd`
 
-# Tests
+## Tests
 
 ::: anta.tests.routing.bgp
 
@@ -27,6 +27,7 @@ anta_title: ANTA Tests for BGP
         - "!test"
         - "!render"
         - "!^_[^_]"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -35,7 +36,7 @@ anta_title: ANTA Tests for BGP
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.routing.bgp
 
@@ -48,6 +49,7 @@ anta_title: ANTA Tests for BGP
         - "!AFI_SAFI_EOS_KEY"
         - "!eos_key"
         - "!BgpAfi"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/routing.generic.md b/docs/api/tests/routing.generic.md
index ad6f08a8..3426e27f 100644
--- a/docs/api/tests/routing.generic.md
+++ b/docs/api/tests/routing.generic.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for generic routing
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.routing.generic
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for generic routing
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for generic routing
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.routing.generic
 
@@ -35,6 +36,7 @@ anta_title: ANTA Tests for generic routing
           anta_hide_test_module_description: true
       filters:
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/routing.isis.md b/docs/api/tests/routing.isis.md
index 1b7dad90..58d60252 100644
--- a/docs/api/tests/routing.isis.md
+++ b/docs/api/tests/routing.isis.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for IS-IS
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.routing.isis
 
@@ -19,6 +19,7 @@ anta_title: ANTA Tests for IS-IS
         - "!test"
         - "!render"
         - "!^_[^_]"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -27,7 +28,7 @@ anta_title: ANTA Tests for IS-IS
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.routing.isis
 
@@ -37,6 +38,7 @@ anta_title: ANTA Tests for IS-IS
       filters:
         - "!^__init__"
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/security.md b/docs/api/tests/security.md
index f96f3d16..ece53621 100644
--- a/docs/api/tests/security.md
+++ b/docs/api/tests/security.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for security
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.security
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for security
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for security
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.security
 
@@ -36,6 +37,7 @@ anta_title: ANTA Tests for security
       filters:
         - "!^__init__"
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/services.md b/docs/api/tests/services.md
index 6339e972..48b19d68 100644
--- a/docs/api/tests/services.md
+++ b/docs/api/tests/services.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for services
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.services
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for services
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for services
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.services
 
@@ -36,6 +37,7 @@ anta_title: ANTA Tests for services
       filters:
         - "!^__init__"
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/snmp.md b/docs/api/tests/snmp.md
index 8b3e3413..f3da0b90 100644
--- a/docs/api/tests/snmp.md
+++ b/docs/api/tests/snmp.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for SNMP
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.snmp
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for SNMP
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for SNMP
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.snmp
 
@@ -35,6 +36,7 @@ anta_title: ANTA Tests for SNMP
           anta_hide_test_module_description: true
       filters:
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/stun.md b/docs/api/tests/stun.md
index 2d8dfa36..47e18bc5 100644
--- a/docs/api/tests/stun.md
+++ b/docs/api/tests/stun.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for STUN
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.stun
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for STUN
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for STUN
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.stun
 
@@ -36,6 +37,7 @@ anta_title: ANTA Tests for STUN
       filters:
         - "!^__init__"
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/system.md b/docs/api/tests/system.md
index 783de320..0f148272 100644
--- a/docs/api/tests/system.md
+++ b/docs/api/tests/system.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for System
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.system
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for System
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for System
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.system
 
@@ -35,6 +36,7 @@ anta_title: ANTA Tests for System
           anta_hide_test_module_description: true
       filters:
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/docs/api/tests/vlan.md b/docs/api/tests/vlan.md
index 91bc3bfd..3b2f2938 100644
--- a/docs/api/tests/vlan.md
+++ b/docs/api/tests/vlan.md
@@ -8,7 +8,7 @@ anta_title: ANTA Tests for VLAN
   ~ that can be found in the LICENSE file.
   -->
 
-# Tests
+## Tests
 
 ::: anta.tests.vlan
 
@@ -18,6 +18,7 @@ anta_title: ANTA Tests for VLAN
       filters:
         - "!test"
         - "!render"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
@@ -26,7 +27,7 @@ anta_title: ANTA Tests for VLAN
       show_symbol_type_heading: false
       show_symbol_type_toc: false
 
-# Input models
+## Input models
 
 ::: anta.input_models.vlan
 
@@ -35,6 +36,7 @@ anta_title: ANTA Tests for VLAN
           anta_hide_test_module_description: true
       filters:
         - "!^__str__"
+      heading_level: 3
       merge_init_into_class: false
       show_bases: false
       show_labels: true
diff --git a/examples/tests.yaml b/examples/tests.yaml
index 1efbbffe..37935229 100644
--- a/examples/tests.yaml
+++ b/examples/tests.yaml
@@ -224,7 +224,7 @@ anta.tests.hardware:
       states:
         - ok
   - VerifyEnvironmentPower:
-      # Verifies the power supplies status.
+      # Verifies the power supplies state and input voltage.
       states:
         - ok
   - VerifyEnvironmentSystemCooling:
@@ -248,15 +248,21 @@ anta.tests.interfaces:
         - Ethernet1
         - Ethernet2
   - VerifyIllegalLACP:
-      # Verifies there are no illegal LACP packets in all port channels.
+      # Verifies there are no illegal LACP packets in port channels.
       ignored_interfaces:
         - Port-Channel1
         - Port-Channel2
+      interfaces:
+        - Port-Channel10
+        - Port-Channel12
   - VerifyInterfaceDiscards:
       # Verifies that the interfaces packet discard counters are equal to zero.
-      ignored_interfaces:
+      interfaces:
         - Ethernet
         - Port-Channel1
+      ignored_interfaces:
+        - Vxlan1
+        - Loopback0
   - VerifyInterfaceErrDisabled:
       # Verifies there are no interfaces in the errdisabled state.
   - VerifyInterfaceErrors:
@@ -275,6 +281,9 @@ anta.tests.interfaces:
       ignored_interfaces:
         - Ethernet1
         - Port-Channel1
+      interfaces:
+        - Ethernet10
+        - Loopback0
   - VerifyInterfacesSpeed:
       # Verifies the speed, lanes, auto-negotiation status, and mode as full duplex for interfaces.
       interfaces:
@@ -328,15 +337,23 @@ anta.tests.interfaces:
       # Verifies the number of loopback interfaces and their status.
       number: 3
   - VerifyPortChannels:
-      # Verifies there are no inactive ports in all port channels.
+      # Verifies there are no inactive ports in port channels.
       ignored_interfaces:
         - Port-Channel1
         - Port-Channel2
-
+      interfaces:
+        - Port-Channel11
+        - Port-Channel22
   - VerifySVI:
       # Verifies the status of all SVIs.
   - VerifyStormControlDrops:
       # Verifies there are no interface storm-control drop counters.
+      interfaces:
+        - Ethernet1
+        - Ethernet2
+      ignored_interfaces:
+        - Vxlan1
+        - Loopback0
 anta.tests.lanz:
   - VerifyLANZ:
       # Verifies if LANZ is enabled.
@@ -901,6 +918,21 @@ anta.tests.routing.ospf:
       number: 3
   - VerifyOSPFNeighborState:
       # Verifies all OSPF neighbors are in FULL state.
+  - VerifyOSPFSpecificNeighbors:
+      # Verifies OSPF specific neighbors.
+      neighbors:
+        - instance: 100
+          vrf: default
+          ip_address: 10.1.255.46
+          local_interface: Ethernet2
+          area_id: 0  # Support for decimal format
+          state: full
+        - instance: 200
+          vrf: DEV
+          ip_address: 10.9.1.1
+          local_interface: Vlan911
+          area_id: 0.0.0.1  # Support for IP address format
+          state: 2Ways
 anta.tests.security:
   - VerifyAPIHttpStatus:
       # Verifies if eAPI HTTP server is disabled globally.
@@ -1108,6 +1140,12 @@ anta.tests.stp:
       # Verifies there is no STP blocked ports.
   - VerifySTPCounters:
       # Verifies there is no errors in STP BPDU packets.
+      interfaces:
+        - Ethernet10
+        - Ethernet12
+      ignored_interfaces:
+         - Vxlan1
+         - Loopback0
   - VerifySTPDisabledVlans:
       # Verifies the STP disabled VLAN(s).
       vlans:
diff --git a/tests/benchmark/test_anta.py b/tests/benchmark/test_anta.py
index fdf6fcba..7c64f5d7 100644
--- a/tests/benchmark/test_anta.py
+++ b/tests/benchmark/test_anta.py
@@ -25,7 +25,6 @@ logger = logging.getLogger(__name__)
 
 def test_anta_dry_run(
     benchmark: BenchmarkFixture,
-    event_loop: asyncio.AbstractEventLoop,
     catalog: AntaCatalog,
     inventory: AntaInventory,
     request: pytest.FixtureRequest,
@@ -42,7 +41,7 @@ def test_anta_dry_run(
     def _() -> None:
         results.reset()
         catalog.clear_indexes()
-        event_loop.run_until_complete(main(results, inventory, catalog, dry_run=True))
+        asyncio.run(main(results, inventory, catalog, dry_run=True))
 
     logging.disable(logging.NOTSET)
 
@@ -58,7 +57,6 @@ def test_anta_dry_run(
 @respx.mock  # Mock eAPI responses
 def test_anta(
     benchmark: BenchmarkFixture,
-    event_loop: asyncio.AbstractEventLoop,
     catalog: AntaCatalog,
     inventory: AntaInventory,
     request: pytest.FixtureRequest,
@@ -75,7 +73,7 @@ def test_anta(
     def _() -> None:
         results.reset()
         catalog.clear_indexes()
-        event_loop.run_until_complete(main(results, inventory, catalog))
+        asyncio.run(main(results, inventory, catalog))
 
     logging.disable(logging.NOTSET)
 
diff --git a/tests/units/anta_tests/routing/test_ospf.py b/tests/units/anta_tests/routing/test_ospf.py
index 4dd5c639..c76f39a8 100644
--- a/tests/units/anta_tests/routing/test_ospf.py
+++ b/tests/units/anta_tests/routing/test_ospf.py
@@ -10,7 +10,7 @@ from typing import TYPE_CHECKING, Any
 
 from anta.models import AntaTest
 from anta.result_manager.models import AntaTestStatus
-from anta.tests.routing.ospf import VerifyOSPFMaxLSA, VerifyOSPFNeighborCount, VerifyOSPFNeighborState
+from anta.tests.routing.ospf import VerifyOSPFMaxLSA, VerifyOSPFNeighborCount, VerifyOSPFNeighborState, VerifyOSPFSpecificNeighbors
 from tests.units.anta_tests import AntaUnitTest, test
 
 if sys.version_info >= (3, 10):
@@ -345,4 +345,286 @@ DATA: AntaUnitTestDataDict = {
         },
     },
     (VerifyOSPFMaxLSA, "skipped"): {"eos_data": [{"vrfs": {}}], "expected": {"result": AntaTestStatus.SKIPPED, "messages": ["OSPF not configured"]}},
+    (VerifyOSPFSpecificNeighbors, "success"): {
+        "eos_data": [
+            {
+                "vrfs": {
+                    "default": {
+                        "instList": {
+                            "100": {
+                                "ospfNeighborEntries": [
+                                    {
+                                        "routerId": "10.1.0.14",
+                                        "interfaceAddress": "10.1.255.53",
+                                        "interfaceName": "Ethernet4",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.0.0",  # noqa: S104
+                                        },
+                                    },
+                                    {
+                                        "routerId": "10.1.0.13",
+                                        "interfaceAddress": "10.1.255.49",
+                                        "interfaceName": "Ethernet3",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.0.0",  # noqa: S104
+                                        },
+                                    },
+                                ]
+                            }
+                        }
+                    },
+                    "PROD": {
+                        "instList": {
+                            "200": {
+                                "ospfNeighborEntries": [
+                                    {
+                                        "routerId": "10.1.0.14",
+                                        "interfaceAddress": "10.1.255.53",
+                                        "interfaceName": "Ethernet4",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.0.1",
+                                        },
+                                    },
+                                    {
+                                        "routerId": "10.1.0.13",
+                                        "interfaceAddress": "10.1.255.49",
+                                        "interfaceName": "Ethernet3",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.0.2",
+                                        },
+                                    },
+                                ]
+                            }
+                        }
+                    },
+                },
+            }
+        ],
+        "inputs": {
+            "neighbors": [
+                {"instance": 100, "vrf": "default", "ip_address": "10.1.255.53", "local_interface": "Ethernet4", "area_id": 0},
+                {
+                    "instance": 100,
+                    "vrf": "default",
+                    "ip_address": "10.1.255.49",
+                    "local_interface": "Ethernet3",
+                    "area_id": "0.0.0.0",  # noqa: S104
+                },
+                {"instance": 200, "vrf": "PROD", "ip_address": "10.1.255.53", "local_interface": "Ethernet4", "area_id": 1},
+                {"instance": 200, "vrf": "PROD", "ip_address": "10.1.255.49", "local_interface": "Ethernet3", "area_id": "0.0.0.2"},
+            ]
+        },
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyOSPFSpecificNeighbors, "success-2-ways"): {
+        "eos_data": [
+            {
+                "vrfs": {
+                    "default": {
+                        "instList": {
+                            "100": {
+                                "ospfNeighborEntries": [
+                                    {
+                                        "routerId": "10.1.0.14",
+                                        "interfaceAddress": "10.1.255.53",
+                                        "interfaceName": "Vlan911",
+                                        "adjacencyState": "2Ways",
+                                        "details": {
+                                            "areaId": "0.0.0.0",  # noqa: S104
+                                        },
+                                    },
+                                    {
+                                        "routerId": "10.1.0.13",
+                                        "interfaceAddress": "10.1.255.49",
+                                        "interfaceName": "Ethernet3",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.0.0",  # noqa: S104
+                                        },
+                                    },
+                                ]
+                            }
+                        }
+                    }
+                },
+            }
+        ],
+        "inputs": {
+            "neighbors": [
+                {"instance": 100, "vrf": "default", "ip_address": "10.1.255.53", "local_interface": "Vlan911", "area_id": 0, "state": "2Ways"},
+                {
+                    "instance": 100,
+                    "vrf": "default",
+                    "ip_address": "10.1.255.49",
+                    "local_interface": "Ethernet3",
+                    "area_id": "0.0.0.0",  # noqa: S104
+                },
+            ]
+        },
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyOSPFSpecificNeighbors, "failure-ospf-not-configured"): {
+        "eos_data": [
+            {
+                "vrfs": {},
+            }
+        ],
+        "inputs": {
+            "neighbors": [
+                {"instance": 100, "vrf": "default", "ip_address": "10.1.255.53", "local_interface": "Ethernet4", "area_id": 0},
+            ]
+        },
+        "expected": {"result": AntaTestStatus.FAILURE, "messages": ["OSPF not configured"]},
+    },
+    (VerifyOSPFSpecificNeighbors, "neighbor-not-found"): {
+        "eos_data": [
+            {
+                "vrfs": {
+                    "default": {
+                        "instList": {
+                            "100": {
+                                "ospfNeighborEntries": [
+                                    {
+                                        "routerId": "10.1.0.14",
+                                        "interfaceAddress": "10.1.255.53",
+                                        "interfaceName": "Ethernet4",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.0.0",  # noqa: S104
+                                        },
+                                    },
+                                    {
+                                        "routerId": "10.1.0.13",
+                                        "interfaceAddress": "10.1.255.49",
+                                        "interfaceName": "Ethernet3",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.0.0",  # noqa: S104
+                                        },
+                                    },
+                                ]
+                            }
+                        }
+                    }
+                },
+            }
+        ],
+        "inputs": {
+            "neighbors": [
+                {"instance": 200, "vrf": "PROD", "ip_address": "10.1.255.53", "local_interface": "Ethernet4", "area_id": 1},
+                {"instance": 200, "vrf": "PROD", "ip_address": "10.1.255.49", "local_interface": "Ethernet3", "area_id": "0.0.0.2"},
+            ]
+        },
+        "expected": {
+            "result": AntaTestStatus.FAILURE,
+            "messages": [
+                "Instance: 200 VRF: PROD Neighbor IP: 10.1.255.53 Area: 0.0.0.1 - Neighbor not found",
+                "Instance: 200 VRF: PROD Neighbor IP: 10.1.255.49 Area: 0.0.0.2 - Neighbor not found",
+            ],
+        },
+    },
+    (VerifyOSPFSpecificNeighbors, "area-id-mismatch"): {
+        "eos_data": [
+            {
+                "vrfs": {
+                    "default": {
+                        "instList": {
+                            "100": {
+                                "ospfNeighborEntries": [
+                                    {
+                                        "routerId": "10.1.0.14",
+                                        "interfaceAddress": "10.1.255.53",
+                                        "interfaceName": "Ethernet4",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.217.3",
+                                        },
+                                    },
+                                    {
+                                        "routerId": "10.1.0.13",
+                                        "interfaceAddress": "10.1.255.49",
+                                        "interfaceName": "Ethernet3",
+                                        "adjacencyState": "full",
+                                        "details": {
+                                            "areaId": "0.0.217.3",
+                                        },
+                                    },
+                                ]
+                            }
+                        }
+                    },
+                },
+            }
+        ],
+        "inputs": {
+            "neighbors": [
+                {"instance": 100, "vrf": "default", "ip_address": "10.1.255.53", "local_interface": "Ethernet4", "area_id": 0},
+                {
+                    "instance": 100,
+                    "vrf": "default",
+                    "ip_address": "10.1.255.49",
+                    "local_interface": "Ethernet3",
+                    "area_id": "0.0.0.0",  # noqa: S104
+                },
+            ]
+        },
+        "expected": {
+            "result": AntaTestStatus.FAILURE,
+            "messages": [
+                "Instance: 100 VRF: default Neighbor IP: 10.1.255.53 Area: 0.0.0.0 - Area-ID mismatch - Expected: 0.0.0.0 Actual: 0.0.217.3",
+                "Instance: 100 VRF: default Neighbor IP: 10.1.255.49 Area: 0.0.0.0 - Area-ID mismatch - Expected: 0.0.0.0 Actual: 0.0.217.3",
+            ],
+        },
+    },
+    (VerifyOSPFSpecificNeighbors, "adjacency-state-mismatch"): {
+        "eos_data": [
+            {
+                "vrfs": {
+                    "default": {
+                        "instList": {
+                            "100": {
+                                "ospfNeighborEntries": [
+                                    {
+                                        "routerId": "10.1.0.14",
+                                        "interfaceAddress": "10.1.255.53",
+                                        "interfaceName": "Ethernet4",
+                                        "adjacencyState": "exchStart",
+                                        "details": {
+                                            "areaId": "0.0.217.3",
+                                        },
+                                    },
+                                    {
+                                        "routerId": "10.1.0.13",
+                                        "interfaceAddress": "10.1.255.49",
+                                        "interfaceName": "Ethernet3",
+                                        "adjacencyState": "down",
+                                        "details": {
+                                            "areaId": "0.0.217.3",
+                                        },
+                                    },
+                                ]
+                            }
+                        }
+                    },
+                },
+            }
+        ],
+        "inputs": {
+            "neighbors": [
+                {"instance": 100, "vrf": "default", "ip_address": "10.1.255.53", "local_interface": "Ethernet4", "area_id": 55555},
+                {"instance": 100, "vrf": "default", "ip_address": "10.1.255.49", "local_interface": "Ethernet3", "area_id": "0.0.217.3"},
+            ]
+        },
+        "expected": {
+            "result": AntaTestStatus.FAILURE,
+            "messages": [
+                "Instance: 100 VRF: default Neighbor IP: 10.1.255.53 Area: 0.0.217.3 - Adjacency state mismatch - Expected: full Actual: exchStart",
+                "Instance: 100 VRF: default Neighbor IP: 10.1.255.49 Area: 0.0.217.3 - Adjacency state mismatch - Expected: full Actual: down",
+            ],
+        },
+    },
 }
diff --git a/tests/units/anta_tests/test_aaa.py b/tests/units/anta_tests/test_aaa.py
index c2b8c161..6261f7a1 100644
--- a/tests/units/anta_tests/test_aaa.py
+++ b/tests/units/anta_tests/test_aaa.py
@@ -74,6 +74,15 @@ DATA: AntaUnitTestDataDict = {
         "inputs": {"servers": ["10.22.10.91"], "vrf": "MGMT"},
         "expected": {"result": AntaTestStatus.SUCCESS},
     },
+    (VerifyTacacsServers, "success-default-vrf"): {
+        "eos_data": [
+            {
+                "tacacsServers": [{"serverInfo": {"hostname": "10.22.10.91", "authport": 49}}],
+            }
+        ],
+        "inputs": {"servers": ["10.22.10.91"]},
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
     (VerifyTacacsServers, "failure-no-servers"): {
         "eos_data": [{"tacacsServers": [], "groups": {}, "srcIntf": {}}],
         "inputs": {"servers": ["10.22.10.91"], "vrf": "MGMT"},
@@ -101,6 +110,24 @@ DATA: AntaUnitTestDataDict = {
         "inputs": {"servers": ["10.22.10.91"], "vrf": "MGMT"},
         "expected": {"result": AntaTestStatus.FAILURE, "messages": ["TACACS servers 10.22.10.91 are not configured in VRF MGMT"]},
     },
+    (VerifyTacacsServers, "failure-wrong-vrf-2"): {
+        "eos_data": [
+            {
+                "tacacsServers": [{"serverInfo": {"hostname": "10.22.10.91", "authport": 49, "vrf": "PROD"}}],
+            }
+        ],
+        "inputs": {"servers": ["10.22.10.91"]},
+        "expected": {"result": AntaTestStatus.FAILURE, "messages": ["TACACS servers 10.22.10.91 are not configured in VRF default"]},
+    },
+    (VerifyTacacsServers, "failure-wrong-vrf-3"): {
+        "eos_data": [
+            {
+                "tacacsServers": [{"serverInfo": {"hostname": "10.22.10.91", "authport": 49}}],
+            }
+        ],
+        "inputs": {"servers": ["10.22.10.91"], "vrf": "MGMT"},
+        "expected": {"result": AntaTestStatus.FAILURE, "messages": ["TACACS servers 10.22.10.91 are not configured in VRF MGMT"]},
+    },
     (VerifyTacacsServerGroups, "success"): {
         "eos_data": [
             {
diff --git a/tests/units/anta_tests/test_hardware.py b/tests/units/anta_tests/test_hardware.py
index 14df82ec..11b1e88e 100644
--- a/tests/units/anta_tests/test_hardware.py
+++ b/tests/units/anta_tests/test_hardware.py
@@ -778,6 +778,92 @@ DATA: AntaUnitTestDataDict = {
         "inputs": {"states": ["ok"]},
         "expected": {"result": AntaTestStatus.SUCCESS},
     },
+    (VerifyEnvironmentPower, "success-min_power-voltage"): {
+        "eos_data": [
+            {
+                "powerSupplies": {
+                    "1": {
+                        "modelName": "PWR-747AC-RED",
+                        "capacity": 750.0,
+                        "dominant": False,
+                        "inputCurrent": 0.705078125,
+                        "outputCurrent": 9.921875,
+                        "inputVoltage": 206.25,
+                        "outputVoltage": 12.025390625,
+                        "outputPower": 119.375,
+                        "state": "ok",
+                        "uptime": 1730845612.5112484,
+                        "fans": {"FanP1/1": {"status": "ok", "speed": 33}},
+                        "tempSensors": {"TempSensorP1/2": {"status": "ok", "temperature": 50.0}, "TempSensorP1/1": {"status": "ok", "temperature": 61.0}},
+                        "managed": True,
+                    },
+                    "2": {
+                        "modelName": "PWR-747AC-RED",
+                        "capacity": 750.0,
+                        "dominant": False,
+                        "inputCurrent": 0.724609375,
+                        "outputCurrent": 10.765625,
+                        "inputVoltage": 204.75,
+                        "outputVoltage": 12.009765625,
+                        "outputPower": 128.0,
+                        "state": "ok",
+                        "uptime": 1730142355.4805274,
+                        "fans": {"FanP2/1": {"status": "ok", "speed": 33}},
+                        "tempSensors": {"TempSensorP2/2": {"status": "ok", "temperature": 53.0}, "TempSensorP2/1": {"status": "ok", "temperature": 63.0}},
+                        "managed": True,
+                    },
+                }
+            }
+        ],
+        "inputs": {"states": ["ok"], "min_input_voltage": 1},
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyEnvironmentPower, "failure-min_power-voltage"): {
+        "eos_data": [
+            {
+                "powerSupplies": {
+                    "1": {
+                        "modelName": "PWR-747AC-RED",
+                        "capacity": 750.0,
+                        "dominant": False,
+                        "inputCurrent": 0.705078125,
+                        "outputCurrent": 9.921875,
+                        "inputVoltage": 0.25,
+                        "outputVoltage": 12.025390625,
+                        "outputPower": 119.375,
+                        "state": "ok",
+                        "uptime": 1730845612.5112484,
+                        "fans": {"FanP1/1": {"status": "ok", "speed": 33}},
+                        "tempSensors": {"TempSensorP1/2": {"status": "ok", "temperature": 50.0}, "TempSensorP1/1": {"status": "ok", "temperature": 61.0}},
+                        "managed": True,
+                    },
+                    "2": {
+                        "modelName": "PWR-747AC-RED",
+                        "capacity": 750.0,
+                        "dominant": False,
+                        "inputCurrent": 0.724609375,
+                        "outputCurrent": 10.765625,
+                        "inputVoltage": 0.75,
+                        "outputVoltage": 12.009765625,
+                        "outputPower": 128.0,
+                        "state": "ok",
+                        "uptime": 1730142355.4805274,
+                        "fans": {"FanP2/1": {"status": "ok", "speed": 33}},
+                        "tempSensors": {"TempSensorP2/2": {"status": "ok", "temperature": 53.0}, "TempSensorP2/1": {"status": "ok", "temperature": 63.0}},
+                        "managed": True,
+                    },
+                }
+            }
+        ],
+        "inputs": {"states": ["ok"], "min_input_voltage": 1},
+        "expected": {
+            "result": AntaTestStatus.FAILURE,
+            "messages": [
+                "Power Supply: 1 - Input voltage mismatch - Expected: > 1 Actual: 0.25",
+                "Power Supply: 2 - Input voltage mismatch - Expected: > 1 Actual: 0.75",
+            ],
+        },
+    },
     (VerifyEnvironmentPower, "success-additional-states"): {
         "eos_data": [
             {
diff --git a/tests/units/anta_tests/test_interfaces.py b/tests/units/anta_tests/test_interfaces.py
index 57292832..f49b6caa 100644
--- a/tests/units/anta_tests/test_interfaces.py
+++ b/tests/units/anta_tests/test_interfaces.py
@@ -1126,6 +1126,288 @@ DATA: AntaUnitTestDataDict = {
             ],
         },
     },
+    (VerifyInterfaceUtilization, "success-specific-interface"): {
+        "eos_data": [
+            {
+                "interfaces": {
+                    "Ethernet1/1": {
+                        "description": "P2P_LINK_TO_DC1-SPINE1_Ethernet1/1",
+                        "interval": 300,
+                        "inBpsRate": 100000000.0,
+                        "inPktsRate": 0.00028663359326985426,
+                        "inPpsRate": 3.9005388262031966,
+                        "outBpsRate": 100000000.0,
+                        "outPktsRate": 0.0,
+                        "outPpsRate": 0.0,
+                        "lastUpdateTimestamp": 1710253727.138605,
+                    },
+                    "Port-Channel31": {
+                        "description": "MLAG_PEER_dc1-leaf1b_Po31",
+                        "interval": 300,
+                        "inBpsRate": 100000000.0,
+                        "inPktsRate": 0.00011473185873493155,
+                        "inPpsRate": 2.7009344704495084,
+                        "outBpsRate": 1862.4876594267096,
+                        "outPktsRate": 0.00010844978034772172,
+                        "outPpsRate": 2.5686946869154013,
+                        "lastUpdateTimestamp": 1710253726.4029949,
+                    },
+                }
+            },
+            {
+                "interfaces": {
+                    "Ethernet1/1": {
+                        "name": "Ethernet1/1",
+                        "forwardingModel": "routed",
+                        "lineProtocolStatus": "up",
+                        "interfaceStatus": "connected",
+                        "hardware": "ethernet",
+                        "interfaceAddress": [
+                            {
+                                "primaryIp": {"address": "10.255.255.1", "maskLen": 31},
+                                "secondaryIps": {},
+                                "secondaryIpsOrderedList": [],
+                                "virtualIp": {"address": "0.0.0.0", "maskLen": 0},
+                                "virtualSecondaryIps": {},
+                                "virtualSecondaryIpsOrderedList": [],
+                                "broadcastAddress": "255.255.255.255",
+                                "dhcp": False,
+                            }
+                        ],
+                        "physicalAddress": "aa:c1:ab:7e:76:36",
+                        "burnedInAddress": "aa:c1:ab:7e:76:36",
+                        "description": "P2P_LINK_TO_DC1-SPINE1_Ethernet1/1",
+                        "bandwidth": 1000000000,
+                        "mtu": 1500,
+                        "l3MtuConfigured": True,
+                        "l2Mru": 0,
+                        "lastStatusChangeTimestamp": 1710234511.3085763,
+                        "interfaceStatistics": {
+                            "updateInterval": 300.0,
+                            "inBitsRate": 2240.0023281094,
+                            "inPktsRate": 3.8978070399448654,
+                            "outBitsRate": 0.0,
+                            "outPktsRate": 0.0,
+                        },
+                        "interfaceCounters": {
+                            "inOctets": 5413008,
+                            "inUcastPkts": 74693,
+                            "inMulticastPkts": 643,
+                            "inBroadcastPkts": 1,
+                            "inDiscards": 0,
+                            "inTotalPkts": 75337,
+                            "outOctets": 0,
+                            "outUcastPkts": 0,
+                            "outMulticastPkts": 0,
+                            "outBroadcastPkts": 0,
+                            "outDiscards": 0,
+                            "outTotalPkts": 0,
+                            "linkStatusChanges": 2,
+                            "totalInErrors": 0,
+                            "inputErrorsDetail": {"runtFrames": 0, "giantFrames": 0, "fcsErrors": 0, "alignmentErrors": 0, "symbolErrors": 0, "rxPause": 0},
+                            "totalOutErrors": 0,
+                            "outputErrorsDetail": {"collisions": 0, "lateCollisions": 0, "deferredTransmissions": 0, "txPause": 0},
+                            "counterRefreshTime": 1710253760.6489396,
+                        },
+                        "duplex": "duplexFull",
+                        "autoNegotiate": "unknown",
+                        "loopbackMode": "loopbackNone",
+                        "lanes": 0,
+                    },
+                    "Port-Channel31": {
+                        "name": "Port-Channel31",
+                        "forwardingModel": "bridged",
+                        "lineProtocolStatus": "up",
+                        "interfaceStatus": "connected",
+                        "hardware": "portChannel",
+                        "interfaceAddress": [],
+                        "physicalAddress": "aa:c1:ab:72:58:40",
+                        "description": "MLAG_PEER_dc1-leaf1b_Po31",
+                        "bandwidth": 2000000000,
+                        "mtu": 9214,
+                        "l3MtuConfigured": False,
+                        "l2Mru": 0,
+                        "lastStatusChangeTimestamp": 1710234510.1133935,
+                        "interfaceStatistics": {
+                            "updateInterval": 300.0,
+                            "inBitsRate": 1854.287898883752,
+                            "inPktsRate": 2.6902775246495665,
+                            "outBitsRate": 1749.1141130864632,
+                            "outPktsRate": 2.5565618978302362,
+                        },
+                        "interfaceCounters": {
+                            "inOctets": 4475556,
+                            "inUcastPkts": 48949,
+                            "inMulticastPkts": 2579,
+                            "inBroadcastPkts": 2,
+                            "inDiscards": 0,
+                            "inTotalPkts": 51530,
+                            "outOctets": 4230011,
+                            "outUcastPkts": 48982,
+                            "outMulticastPkts": 6,
+                            "outBroadcastPkts": 2,
+                            "outDiscards": 0,
+                            "outTotalPkts": 48990,
+                            "linkStatusChanges": 2,
+                            "totalInErrors": 0,
+                            "totalOutErrors": 0,
+                            "counterRefreshTime": 1710253760.6500373,
+                        },
+                        "memberInterfaces": {
+                            "Ethernet3/1": {"bandwidth": 1000000000, "duplex": "duplexFull"},
+                            "Ethernet4/1": {"bandwidth": 1000000000, "duplex": "duplexFull"},
+                        },
+                        "fallbackEnabled": False,
+                        "fallbackEnabledType": "fallbackNone",
+                    },
+                }
+            },
+        ],
+        "inputs": {"threshold": 7.0, "interfaces": ["Port-Channel31"]},
+        "expected": {
+            "result": AntaTestStatus.SUCCESS,
+        },
+    },
+    (VerifyInterfaceUtilization, "failure-specific-interface-not-found"): {
+        "eos_data": [
+            {
+                "interfaces": {
+                    "Ethernet1/1": {
+                        "description": "P2P_LINK_TO_DC1-SPINE1_Ethernet1/1",
+                        "interval": 300,
+                        "inBpsRate": 100000000.0,
+                        "inPktsRate": 0.00028663359326985426,
+                        "inPpsRate": 3.9005388262031966,
+                        "outBpsRate": 100000000.0,
+                        "outPktsRate": 0.0,
+                        "outPpsRate": 0.0,
+                        "lastUpdateTimestamp": 1710253727.138605,
+                    },
+                    "Port-Channel31": {
+                        "description": "MLAG_PEER_dc1-leaf1b_Po31",
+                        "interval": 300,
+                        "inBpsRate": 100000000.0,
+                        "inPktsRate": 0.00011473185873493155,
+                        "inPpsRate": 2.7009344704495084,
+                        "outBpsRate": 1862.4876594267096,
+                        "outPktsRate": 0.00010844978034772172,
+                        "outPpsRate": 2.5686946869154013,
+                        "lastUpdateTimestamp": 1710253726.4029949,
+                    },
+                }
+            },
+            {
+                "interfaces": {
+                    "Ethernet1/1": {
+                        "name": "Ethernet1/1",
+                        "forwardingModel": "routed",
+                        "lineProtocolStatus": "up",
+                        "interfaceStatus": "connected",
+                        "hardware": "ethernet",
+                        "interfaceAddress": [
+                            {
+                                "primaryIp": {"address": "10.255.255.1", "maskLen": 31},
+                                "secondaryIps": {},
+                                "secondaryIpsOrderedList": [],
+                                "virtualIp": {"address": "0.0.0.0", "maskLen": 0},
+                                "virtualSecondaryIps": {},
+                                "virtualSecondaryIpsOrderedList": [],
+                                "broadcastAddress": "255.255.255.255",
+                                "dhcp": False,
+                            }
+                        ],
+                        "physicalAddress": "aa:c1:ab:7e:76:36",
+                        "burnedInAddress": "aa:c1:ab:7e:76:36",
+                        "description": "P2P_LINK_TO_DC1-SPINE1_Ethernet1/1",
+                        "bandwidth": 1000000000,
+                        "mtu": 1500,
+                        "l3MtuConfigured": True,
+                        "l2Mru": 0,
+                        "lastStatusChangeTimestamp": 1710234511.3085763,
+                        "interfaceStatistics": {
+                            "updateInterval": 300.0,
+                            "inBitsRate": 2240.0023281094,
+                            "inPktsRate": 3.8978070399448654,
+                            "outBitsRate": 0.0,
+                            "outPktsRate": 0.0,
+                        },
+                        "interfaceCounters": {
+                            "inOctets": 5413008,
+                            "inUcastPkts": 74693,
+                            "inMulticastPkts": 643,
+                            "inBroadcastPkts": 1,
+                            "inDiscards": 0,
+                            "inTotalPkts": 75337,
+                            "outOctets": 0,
+                            "outUcastPkts": 0,
+                            "outMulticastPkts": 0,
+                            "outBroadcastPkts": 0,
+                            "outDiscards": 0,
+                            "outTotalPkts": 0,
+                            "linkStatusChanges": 2,
+                            "totalInErrors": 0,
+                            "inputErrorsDetail": {"runtFrames": 0, "giantFrames": 0, "fcsErrors": 0, "alignmentErrors": 0, "symbolErrors": 0, "rxPause": 0},
+                            "totalOutErrors": 0,
+                            "outputErrorsDetail": {"collisions": 0, "lateCollisions": 0, "deferredTransmissions": 0, "txPause": 0},
+                            "counterRefreshTime": 1710253760.6489396,
+                        },
+                        "duplex": "duplexFull",
+                        "autoNegotiate": "unknown",
+                        "loopbackMode": "loopbackNone",
+                        "lanes": 0,
+                    },
+                    "Port-Channel31": {
+                        "name": "Port-Channel31",
+                        "forwardingModel": "bridged",
+                        "lineProtocolStatus": "up",
+                        "interfaceStatus": "connected",
+                        "hardware": "portChannel",
+                        "interfaceAddress": [],
+                        "physicalAddress": "aa:c1:ab:72:58:40",
+                        "description": "MLAG_PEER_dc1-leaf1b_Po31",
+                        "bandwidth": 2000000000,
+                        "mtu": 9214,
+                        "l3MtuConfigured": False,
+                        "l2Mru": 0,
+                        "lastStatusChangeTimestamp": 1710234510.1133935,
+                        "interfaceStatistics": {
+                            "updateInterval": 300.0,
+                            "inBitsRate": 1854.287898883752,
+                            "inPktsRate": 2.6902775246495665,
+                            "outBitsRate": 1749.1141130864632,
+                            "outPktsRate": 2.5565618978302362,
+                        },
+                        "interfaceCounters": {
+                            "inOctets": 4475556,
+                            "inUcastPkts": 48949,
+                            "inMulticastPkts": 2579,
+                            "inBroadcastPkts": 2,
+                            "inDiscards": 0,
+                            "inTotalPkts": 51530,
+                            "outOctets": 4230011,
+                            "outUcastPkts": 48982,
+                            "outMulticastPkts": 6,
+                            "outBroadcastPkts": 2,
+                            "outDiscards": 0,
+                            "outTotalPkts": 48990,
+                            "linkStatusChanges": 2,
+                            "totalInErrors": 0,
+                            "totalOutErrors": 0,
+                            "counterRefreshTime": 1710253760.6500373,
+                        },
+                        "memberInterfaces": {
+                            "Ethernet3/1": {"bandwidth": 1000000000, "duplex": "duplexFull"},
+                            "Ethernet4/1": {"bandwidth": 1000000000, "duplex": "duplexFull"},
+                        },
+                        "fallbackEnabled": False,
+                        "fallbackEnabledType": "fallbackNone",
+                    },
+                }
+            },
+        ],
+        "inputs": {"threshold": 5.0, "interfaces": ["Port-Channel31", "Port-Channel1"]},
+        "expected": {"result": AntaTestStatus.FAILURE, "messages": ["Interface: Port-Channel1 - Not found"]},
+    },
     (VerifyInterfaceErrors, "success"): {
         "eos_data": [
             {
@@ -1222,6 +1504,46 @@ DATA: AntaUnitTestDataDict = {
         ],
         "expected": {"result": AntaTestStatus.FAILURE, "messages": ["Interface: Ethernet1 - Non-zero error counter(s) - inErrors: 42, outErrors: 2"]},
     },
+    (VerifyInterfaceErrors, "success-specific-interface"): {
+        "eos_data": [
+            {
+                "interfaceErrorCounters": {
+                    "Ethernet1": {"inErrors": 0, "frameTooLongs": 0, "outErrors": 0, "frameTooShorts": 0, "fcsErrors": 0, "alignmentErrors": 0, "symbolErrors": 0},
+                    "Management0": {
+                        "inErrors": 0,
+                        "frameTooLongs": 0,
+                        "outErrors": 0,
+                        "frameTooShorts": 0,
+                        "fcsErrors": 0,
+                        "alignmentErrors": 666,
+                        "symbolErrors": 0,
+                    },
+                }
+            }
+        ],
+        "inputs": {"interfaces": ["Etherne1"]},
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyInterfaceErrors, "failure-specific-interface-not-found"): {
+        "eos_data": [
+            {
+                "interfaceErrorCounters": {
+                    "Ethernet1": {"inErrors": 0, "frameTooLongs": 0, "outErrors": 0, "frameTooShorts": 0, "fcsErrors": 0, "alignmentErrors": 0, "symbolErrors": 0},
+                    "Management0": {
+                        "inErrors": 0,
+                        "frameTooLongs": 0,
+                        "outErrors": 0,
+                        "frameTooShorts": 0,
+                        "fcsErrors": 0,
+                        "alignmentErrors": 666,
+                        "symbolErrors": 0,
+                    },
+                }
+            }
+        ],
+        "inputs": {"interfaces": ["Etherne10"]},
+        "expected": {"result": AntaTestStatus.FAILURE, "messages": ["Interface: Ethernet10 - Not found"]},
+    },
     (VerifyInterfaceDiscards, "success"): {
         "eos_data": [
             {
@@ -1274,6 +1596,43 @@ DATA: AntaUnitTestDataDict = {
         "eos_data": [{"interfaceStatuses": {"Ethernet2": {"description": "", "status": "errdisabled"}}}],
         "expected": {"result": AntaTestStatus.FAILURE, "messages": ["Interface: Ethernet2 - Error disabled"]},
     },
+    (VerifyInterfaceDiscards, "success-specific-interface"): {
+        "eos_data": [
+            {
+                "inDiscardsTotal": 0,
+                "interfaces": {
+                    "Ethernet2": {"outDiscards": 0, "inDiscards": 0},
+                    "Ethernet1": {"outDiscards": 0, "inDiscards": 42},
+                    "Ethernet3": {"outDiscards": 0, "inDiscards": 0},
+                    "Port-Channel1": {"outDiscards": 0, "inDiscards": 0},
+                    "Port-Channel2": {"outDiscards": 30, "inDiscards": 0},
+                },
+                "outDiscardsTotal": 0,
+            }
+        ],
+        "inputs": {"interfaces": ["Port-Channel1", "Ethernet3", "Ethernet2"]},
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyInterfaceDiscards, "failure-specific-interface-not-found"): {
+        "eos_data": [
+            {
+                "inDiscardsTotal": 0,
+                "interfaces": {
+                    "Ethernet2": {"outDiscards": 0, "inDiscards": 0},
+                    "Ethernet1": {"outDiscards": 0, "inDiscards": 42},
+                    "Ethernet3": {"outDiscards": 40, "inDiscards": 0},
+                    "Port-Channel1": {"outDiscards": 30, "inDiscards": 0},
+                    "Port-Channel2": {"outDiscards": 30, "inDiscards": 0},
+                },
+                "outDiscardsTotal": 0,
+            }
+        ],
+        "inputs": {"interfaces": ["Port-Channel10", "Ethernet3", "Ethernet2"]},
+        "expected": {
+            "result": AntaTestStatus.FAILURE,
+            "messages": ["Interface: Port-Channel10 - Not found", "Interface: Ethernet3 - Non-zero discard counter(s): outDiscards: 40"],
+        },
+    },
     (VerifyInterfacesStatus, "success"): {
         "eos_data": [
             {
@@ -1479,6 +1838,88 @@ DATA: AntaUnitTestDataDict = {
         ],
         "expected": {"result": AntaTestStatus.FAILURE, "messages": ["Interface: Ethernet1 - Non-zero storm-control drop counter(s) - broadcast: 666"]},
     },
+    (VerifyStormControlDrops, "success-ignore-interfface"): {
+        "eos_data": [
+            {
+                "aggregateTrafficClasses": {},
+                "interfaces": {
+                    "Ethernet1": {
+                        "trafficTypes": {"broadcast": {"level": 100, "thresholdType": "packetsPerSecond", "rate": 0, "drop": 0, "dormant": False}},
+                        "active": True,
+                        "reason": "",
+                        "errdisabled": False,
+                    },
+                    "Ethernet10": {
+                        "trafficTypes": {"broadcast": {"level": 100, "thresholdType": "packetsPerSecond", "rate": 440, "drop": 40, "dormant": False}},
+                        "active": True,
+                        "reason": "",
+                        "errdisabled": False,
+                    },
+                },
+            }
+        ],
+        "inputs": {"ignored_interfaces": ["Ethernet10"]},
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyStormControlDrops, "success-specific-interfface"): {
+        "eos_data": [
+            {
+                "aggregateTrafficClasses": {},
+                "interfaces": {
+                    "Ethernet1": {
+                        "trafficTypes": {"broadcast": {"level": 100, "thresholdType": "packetsPerSecond", "rate": 0, "drop": 0, "dormant": False}},
+                        "active": True,
+                        "reason": "",
+                        "errdisabled": False,
+                    },
+                    "Ethernet10": {
+                        "trafficTypes": {"broadcast": {"level": 100, "thresholdType": "packetsPerSecond", "rate": 440, "drop": 40, "dormant": False}},
+                        "active": True,
+                        "reason": "",
+                        "errdisabled": False,
+                    },
+                },
+            }
+        ],
+        "inputs": {"interfaces": ["Ethernet1"]},
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyStormControlDrops, "failure-specific-interfface-not-found"): {
+        "eos_data": [
+            {
+                "aggregateTrafficClasses": {},
+                "interfaces": {
+                    "Ethernet1": {
+                        "trafficTypes": {"broadcast": {"level": 100, "thresholdType": "packetsPerSecond", "rate": 0, "drop": 0, "dormant": False}},
+                        "active": True,
+                        "reason": "",
+                        "errdisabled": False,
+                    },
+                    "Ethernet10": {
+                        "trafficTypes": {"broadcast": {"level": 100, "thresholdType": "packetsPerSecond", "rate": 440, "drop": 40, "dormant": False}},
+                        "active": True,
+                        "reason": "",
+                        "errdisabled": False,
+                    },
+                    "Ethernet20": {
+                        "trafficTypes": {"broadcast": {"level": 100, "thresholdType": "packetsPerSecond", "rate": 440, "drop": 40, "dormant": False}},
+                        "active": True,
+                        "reason": "",
+                        "errdisabled": False,
+                    },
+                },
+            }
+        ],
+        "inputs": {"interfaces": ["Ethernet13", "Ethernet10", "Ethernet20"]},
+        "expected": {
+            "result": AntaTestStatus.FAILURE,
+            "messages": [
+                "Interface: Ethernet13 - Not found",
+                "Interface: Ethernet10 - Non-zero storm-control drop counter(s) - broadcast: 40",
+                "Interface: Ethernet20 - Non-zero storm-control drop counter(s) - broadcast: 40",
+            ],
+        },
+    },
     (VerifyPortChannels, "success"): {
         "eos_data": [
             {
@@ -1583,6 +2024,70 @@ DATA: AntaUnitTestDataDict = {
         ],
         "expected": {"result": AntaTestStatus.FAILURE, "messages": ["Port-Channel42 - Inactive port(s) - Ethernet8"]},
     },
+    (VerifyPortChannels, "success-specified-interface"): {
+        "eos_data": [
+            {
+                "portChannels": {
+                    "Port-Channel1": {
+                        "activePorts": {"Ethernet1": {}, "Ethernet6": {}},
+                        "rxPorts": {},
+                        "inactivePorts": {},
+                        "recircFeature": [],
+                        "inactiveLag": False,
+                        "minLinks": 0,
+                        "minSpeed": "0 gbps",
+                        "currWeight": 0,
+                        "maxWeight": 16,
+                    },
+                    "Port-Channel5": {
+                        "activePorts": {"Ethernet4": {}, "PeerEthernet4": {}},
+                        "rxPorts": {},
+                        "inactivePorts": {"Ethernet8": {"reasonUnconfigured": "waiting for LACP response"}},
+                        "recircFeature": [],
+                        "inactiveLag": False,
+                        "minLinks": 0,
+                        "minSpeed": "0 gbps",
+                        "currWeight": 0,
+                        "maxWeight": 16,
+                    },
+                }
+            }
+        ],
+        "inputs": {"interfaces": ["Port-Channel1"]},
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyPortChannels, "failure-specified-interface-not-found"): {
+        "eos_data": [
+            {
+                "portChannels": {
+                    "Port-Channel1": {
+                        "activePorts": {"Ethernet1": {}, "Ethernet6": {}},
+                        "rxPorts": {},
+                        "inactivePorts": {},
+                        "recircFeature": [],
+                        "inactiveLag": False,
+                        "minLinks": 0,
+                        "minSpeed": "0 gbps",
+                        "currWeight": 0,
+                        "maxWeight": 16,
+                    },
+                    "Port-Channel5": {
+                        "activePorts": {"Ethernet4": {}, "PeerEthernet4": {}},
+                        "rxPorts": {},
+                        "inactivePorts": {"Ethernet8": {"reasonUnconfigured": "waiting for LACP response"}},
+                        "recircFeature": [],
+                        "inactiveLag": False,
+                        "minLinks": 0,
+                        "minSpeed": "0 gbps",
+                        "currWeight": 0,
+                        "maxWeight": 16,
+                    },
+                }
+            }
+        ],
+        "inputs": {"interfaces": ["Port-Channel10", "Port-Channel5"]},
+        "expected": {"result": AntaTestStatus.FAILURE, "messages": ["Interface: Port-Channel10 - Not found", "Port-Channel5 - Inactive port(s) - Ethernet8"]},
+    },
     (VerifyIllegalLACP, "success"): {
         "eos_data": [
             {
@@ -1658,6 +2163,139 @@ DATA: AntaUnitTestDataDict = {
         "inputs": {"ignored_interfaces": ["Port-Channel1", "Port-Channel5"]},
         "expected": {"result": AntaTestStatus.SUCCESS},
     },
+    (VerifyIllegalLACP, "success-specific-interface"): {
+        "eos_data": [
+            {
+                "portChannels": {
+                    "Port-Channel1": {
+                        "interfaces": {
+                            "Ethernet1": {
+                                "actorPortStatus": "bundled",
+                                "lacpdusRxCount": 512,
+                                "lacpdusTxCount": 514,
+                                "markersRxCount": 0,
+                                "markersTxCount": 0,
+                                "markerResponseRxCount": 0,
+                                "markerResponseTxCount": 0,
+                                "illegalRxCount": 66,
+                            },
+                            "Ethernet6": {
+                                "actorPortStatus": "bundled",
+                                "lacpdusRxCount": 513,
+                                "lacpdusTxCount": 516,
+                                "markersRxCount": 0,
+                                "markersTxCount": 0,
+                                "markerResponseRxCount": 0,
+                                "markerResponseTxCount": 0,
+                                "illegalRxCount": 0,
+                            },
+                        }
+                    },
+                    "Port-Channel5": {
+                        "markers": {"markers": ["*"]},
+                        "interfaces": {
+                            "Ethernet4": {
+                                "actorPortStatus": "bundled",
+                                "lacpdusRxCount": 521,
+                                "lacpdusTxCount": 15119,
+                                "markersRxCount": 0,
+                                "markersTxCount": 0,
+                                "markerResponseRxCount": 0,
+                                "markerResponseTxCount": 0,
+                                "illegalRxCount": 66,
+                            }
+                        },
+                    },
+                    "Port-Channel42": {
+                        "interfaces": {
+                            "Ethernet8": {
+                                "actorPortStatus": "noAgg",
+                                "illegalRxCount": 0,
+                                "markerResponseTxCount": 0,
+                                "markerResponseRxCount": 0,
+                                "lacpdusRxCount": 0,
+                                "lacpdusTxCount": 454,
+                                "markersTxCount": 0,
+                                "markersRxCount": 0,
+                            }
+                        }
+                    },
+                },
+                "markerMessages": {"markerMessages": [{"marker": "*"}]},
+                "orphanPorts": {},
+            }
+        ],
+        "inputs": {"interfaces": ["Port-Channel42"]},
+        "expected": {"result": AntaTestStatus.SUCCESS},
+    },
+    (VerifyIllegalLACP, "success-specific-interface-not-found"): {
+        "eos_data": [
+            {
+                "portChannels": {
+                    "Port-Channel1": {
+                        "interfaces": {
+                            "Ethernet1": {
+                                "actorPortStatus": "bundled",
+                                "lacpdusRxCount": 512,
+                                "lacpdusTxCount": 514,
+                                "markersRxCount": 0,
+                                "markersTxCount": 0,
+                                "markerResponseRxCount": 0,
+                                "markerResponseTxCount": 0,
+                                "illegalRxCount": 66,
+                            },
+                            "Ethernet6": {
+                                "actorPortStatus": "bundled",
+                                "lacpdusRxCount": 513,
+                                "lacpdusTxCount": 516,
+                                "markersRxCount": 0,
+                                "markersTxCount": 0,
+                                "markerResponseRxCount": 0,
+                                "markerResponseTxCount": 0,
+                                "illegalRxCount": 0,
+                            },
+                        }
+                    },
+                    "Port-Channel5": {
+                        "markers": {"markers": ["*"]},
+                        "interfaces": {
+                            "Ethernet4": {
+                                "actorPortStatus": "bundled",
+                                "lacpdusRxCount": 521,
+                                "lacpdusTxCount": 15119,
+                                "markersRxCount": 0,
+                                "markersTxCount": 0,
+                                "markerResponseRxCount": 0,
+                                "markerResponseTxCount": 0,
+                                "illegalRxCount": 66,
+                            }
+                        },
+                    },
+                    "Port-Channel42": {
+                        "interfaces": {
+                            "Ethernet8": {
+                                "actorPortStatus": "noAgg",
+                                "illegalRxCount": 0,
+                                "markerResponseTxCount": 0,
+                                "markerResponseRxCount": 0,
+                                "lacpdusRxCount": 0,
+                                "lacpdusTxCount": 454,
+                                "markersTxCount": 0,
+                                "markersRxCount": 0,
+                            }
+                        }
+                    },
+                },
+                "markerMessages": {"markerMessages": [{"marker": "*"}]},
+                "orphanPorts": {},
+            }
+        ],
+        "inputs": {"interfaces": ["Port-Channel4", "Port-Channel5"]},
+        "expected": {
+            "result": AntaTestStatus.FAILURE,
+            "messages": ["Interface: Port-Channel4 - Not found", "Port-Channel5 Interface: Ethernet4 - Illegal LACP packets found"],
+        },
+    },
     (VerifyIllegalLACP, "failure"): {
         "eos_data": [
             {
diff --git a/tests/units/anta_tests/test_stp.py b/tests/units/anta_tests/test_stp.py
index 67aaf32f..0fc7e559 100644
--- a/tests/units/anta_tests/test_stp.py
+++ b/tests/units/anta_tests/test_stp.py
@@ -103,6 +103,46 @@ DATA: AntaUnitTestDataDict = {
             ],
         },
     },
+    (VerifySTPCounters, "success-ignore-interface"): {
+        "eos_data": [
+            {
+                "interfaces": {
+                    "Ethernet10": {"bpduSent": 201, "bpduReceived": 0, "bpduTaggedError": 3, "bpduOtherError": 0, "bpduRateLimitCount": 0},
+                    "Ethernet11": {"bpduSent": 99, "bpduReceived": 0, "bpduTaggedError": 0, "bpduOtherError": 0, "bpduRateLimitCount": 0},
+                }
+            }
+        ],
+        "inputs": {"ignored_interfaces": ["Ethernet10"]},
+        "expected": {
+            "result": AntaTestStatus.SUCCESS,
+        },
+    },
+    (VerifySTPCounters, "success-specific-interface"): {
+        "eos_data": [
+            {
+                "interfaces": {
+                    "Ethernet10": {"bpduSent": 201, "bpduReceived": 0, "bpduTaggedError": 3, "bpduOtherError": 0, "bpduRateLimitCount": 0},
+                    "Ethernet11": {"bpduSent": 99, "bpduReceived": 0, "bpduTaggedError": 0, "bpduOtherError": 0, "bpduRateLimitCount": 0},
+                }
+            }
+        ],
+        "inputs": {"interfaces": ["Ethernet11"]},
+        "expected": {
+            "result": AntaTestStatus.SUCCESS,
+        },
+    },
+    (VerifySTPCounters, "failure-specific-interface-not-found"): {
+        "eos_data": [
+            {
+                "interfaces": {
+                    "Ethernet10": {"bpduSent": 201, "bpduReceived": 0, "bpduTaggedError": 3, "bpduOtherError": 0, "bpduRateLimitCount": 0},
+                    "Ethernet11": {"bpduSent": 99, "bpduReceived": 0, "bpduTaggedError": 0, "bpduOtherError": 0, "bpduRateLimitCount": 0},
+                }
+            }
+        ],
+        "inputs": {"interfaces": ["Ethernet12"]},
+        "expected": {"result": AntaTestStatus.FAILURE, "messages": ["Interface: Ethernet12 - Not found"]},
+    },
     (VerifySTPForwardingPorts, "success"): {
         "eos_data": [
             {
diff --git a/tests/units/test__runner.py b/tests/units/test__runner.py
index 46c63ed0..efb5f454 100644
--- a/tests/units/test__runner.py
+++ b/tests/units/test__runner.py
@@ -310,11 +310,28 @@ class TestAntaRunner:
         await runner.run(inventory, catalog, dry_run=True)
 
         expected_output = [
-            "ANTA NRFU Dry Run Information",
-            "Devices:",
-            "  Total in initial inventory: 3",
-            "  Selected for testing: 3",
-            "Total number of selected tests: 27",
+            "Initial inventory contains 3 devices",
+            "3 devices selected for testing",
+            "27 total tests scheduled across all selected devices",
+        ]
+        for line in expected_output:
+            assert line in caplog.text
+
+    async def test_log_run_information_filters(self, caplog: pytest.LogCaptureFixture) -> None:
+        """Test AntaRunner._log_run_information with filters."""
+        caplog.set_level(logging.INFO)
+
+        inventory = AntaInventory.parse(filename=DATA_DIR / "test_inventory_with_tags.yml", username="anta", password="anta")
+        catalog = AntaCatalog.parse(filename=DATA_DIR / "test_catalog_with_tags.yml")
+        runner = AntaRunner()
+        filters = AntaRunFilters(devices={"spine1"})
+        await runner.run(inventory, catalog, filters=filters, dry_run=True)
+
+        expected_output = [
+            "Initial inventory contains 3 devices",
+            "2 devices excluded by name/tag filters: leaf1, leaf2",
+            "1 devices selected for testing",
+            "9 total tests scheduled across all selected devices",
         ]
         for line in expected_output:
             assert line in caplog.text
@@ -350,6 +367,36 @@ class TestAntaRunner:
         assert warning_msg in ctx.warnings_at_setup
         assert warning_msg in caplog.messages
 
+    async def test_log_run_information_from_context(self, caplog: pytest.LogCaptureFixture) -> None:
+        """Test AntaRunner._log_run_information from a fake context."""
+        caplog.set_level(logging.INFO)
+
+        inventory = AntaInventory.parse(filename=DATA_DIR / "test_inventory_with_tags.yml", username="anta", password="anta")
+        catalog = AntaCatalog.parse(filename=DATA_DIR / "test_catalog_with_tags.yml")
+        manager = ResultManager()
+        filters = AntaRunFilters()
+        context = AntaRunContext(
+            inventory=inventory,
+            catalog=catalog,
+            manager=manager,
+            filters=filters,
+        )
+        context.devices_filtered_at_setup = ["leaf1"]
+        context.devices_unreachable_at_setup = ["leaf2"]
+        context.selected_inventory.add_device(inventory["spine1"])
+
+        AntaRunner()._log_run_information(context)
+
+        expected_output = [
+            "Initial inventory contains 3 devices",
+            "1 devices excluded by name/tag filters: leaf1",
+            "1 devices found unreachable after connection attempts: leaf2",
+            "1 devices selected for testing",
+            "0 total tests scheduled across all selected devices",
+        ]
+        for line in expected_output:
+            assert line in caplog.text
+
     @pytest.mark.parametrize(("inventory"), [{"count": 3}], indirect=True)
     @respx.mock
     async def test_run(self, inventory: AntaInventory) -> None:
diff --git a/tests/units/test_tools.py b/tests/units/test_tools.py
index 396b0c84..d2029936 100644
--- a/tests/units/test_tools.py
+++ b/tests/units/test_tools.py
@@ -11,7 +11,7 @@ from typing import Any
 
 import pytest
 
-from anta.tools import convert_categories, custom_division, format_data, get_dict_superset, get_failed_logs, get_item, get_value
+from anta.tools import convert_categories, custom_division, format_data, get_dict_superset, get_failed_logs, get_item, get_value, is_interface_ignored
 
 TEST_GET_FAILED_LOGS_DATA = [
     {"id": 1, "name": "Alice", "age": 30, "email": "alice@example.com"},
@@ -527,3 +527,87 @@ def test_convert_categories(test_input: list[str], expected_raise: AbstractConte
 def test_format_data(input_data: dict[str, bool], expected_output: str) -> None:
     """Test format_data."""
     assert format_data(input_data) == expected_output
+
+
+CANONICAL_TYPES = {
+    "ethernet": "Ethernet",
+    "portchannel": "Port-Channel",
+    "vlan": "Vlan",
+    "loopback": "Loopback",
+    "management": "Management",
+    "tunnel": "Tunnel",
+    "fabric": "Fabric",
+    "vxlan": "Vxlan",
+    "dps": "Dps",
+    "recircchannel": "Recirc-Channel",
+}
+
+
+@pytest.mark.parametrize(
+    ("input_params", "expected_output"),
+    [
+        # Docstring Examples
+        pytest.param({"interface": "Ethernet1", "ignored_interfaces": [CANONICAL_TYPES["ethernet"], "Port-Channel1"]}, True, id="doc_ex1_prefix_match_type"),
+        pytest.param({"interface": "Ethernet2", "ignored_interfaces": ["Ethernet1", CANONICAL_TYPES["portchannel"]]}, False, id="doc_ex2_no_match"),
+        pytest.param(
+            {"interface": "Port-Channel1", "ignored_interfaces": ["Ethernet1", CANONICAL_TYPES["portchannel"]]}, True, id="doc_ex3_prefix_match_type_portchannel"
+        ),
+        pytest.param({"interface": "Ethernet1/1", "ignored_interfaces": ["Ethernet1/1", CANONICAL_TYPES["portchannel"]]}, True, id="doc_ex4_exact_match_subif"),
+        pytest.param(
+            {"interface": "Ethernet1/1", "ignored_interfaces": ["Ethernet1", CANONICAL_TYPES["portchannel"]]}, False, id="doc_ex5_no_match_specific_ignored_name"
+        ),
+        pytest.param(
+            {"interface": "Ethernet1.100", "ignored_interfaces": ["Ethernet1.100", CANONICAL_TYPES["portchannel"]]}, True, id="doc_ex6_exact_match_dot_subif"
+        ),
+        # Cases for None or Empty ignored_interfaces (function returns None)
+        pytest.param({"interface": "Loopback0", "ignored_interfaces": None}, None, id="none_ignored_list"),
+        pytest.param({"interface": "Management1", "ignored_interfaces": []}, None, id="empty_ignored_list"),
+        # Exact Match Cases (full interface names in ignored_interfaces list)
+        pytest.param({"interface": "Vlan20", "ignored_interfaces": ["Vlan20", CANONICAL_TYPES["ethernet"]]}, True, id="exact_match_Vlan20"),
+        pytest.param(
+            {"interface": "Port-Channel200", "ignored_interfaces": ["port-channel200", CANONICAL_TYPES["ethernet"]]}, False, id="exact_match_case_sensitive_fail"
+        ),
+        pytest.param(
+            {"interface": "Port-Channel200", "ignored_interfaces": ["Port-Channel200", CANONICAL_TYPES["ethernet"]]}, True, id="exact_match_case_sensitive_pass"
+        ),
+        pytest.param({"interface": "Ethernet1/1/1", "ignored_interfaces": ["ethernet1/1/1"]}, False, id="exact_match_subif_case_fail"),
+        pytest.param({"interface": "Ethernet1/1/1", "ignored_interfaces": ["Ethernet1/1/1"]}, True, id="exact_match_subif_case_pass"),
+        # Prefix Match Cases (interface types in ignored_interfaces list)
+        pytest.param(
+            {"interface": "Ethernet10/1", "ignored_interfaces": [CANONICAL_TYPES["ethernet"], CANONICAL_TYPES["loopback"]]}, True, id="prefix_match_Ethernet_type"
+        ),
+        pytest.param(
+            {"interface": "Port-Channel123", "ignored_interfaces": [CANONICAL_TYPES["portchannel"], CANONICAL_TYPES["vlan"]]},
+            True,
+            id="prefix_match_PortChannel_type",
+        ),
+        pytest.param({"interface": "Tunnel5", "ignored_interfaces": [CANONICAL_TYPES["tunnel"], CANONICAL_TYPES["vxlan"]]}, True, id="prefix_match_Tunnel_type"),
+        pytest.param({"interface": "Fabric1/2", "ignored_interfaces": [CANONICAL_TYPES["fabric"]]}, True, id="prefix_match_Fabric_type"),
+        pytest.param({"interface": "Dps1", "ignored_interfaces": [CANONICAL_TYPES["dps"]]}, True, id="prefix_match_Dps_type"),
+        pytest.param({"interface": "Recirc-Channel2/1", "ignored_interfaces": [CANONICAL_TYPES["recircchannel"]]}, True, id="prefix_match_RecircChannel_type"),
+        # Prefix Match: Case sensitivity of items in ignored_interfaces
+        pytest.param(
+            {"interface": "Ethernet20/1", "ignored_interfaces": ["ethernet", CANONICAL_TYPES["loopback"]]}, False, id="prefix_match_vs_lowercase_type_in_list_fail"
+        ),
+        pytest.param({"interface": "Vlan30.10", "ignored_interfaces": ["vlan"]}, False, id="prefix_match_vs_lowercase_vlan_in_list_fail"),  # "Vlan" vs "vlan"
+        # Mixed: Exact name vs. Type in ignored_interfaces
+        pytest.param({"interface": "Ethernet1", "ignored_interfaces": ["Ethernet1"]}, True, id="mixed_exact_name_match_Ethernet1"),
+        pytest.param({"interface": "Ethernet1", "ignored_interfaces": [CANONICAL_TYPES["ethernet"]]}, True, id="mixed_type_match_Ethernet"),
+        pytest.param({"interface": "Ethernet1/1", "ignored_interfaces": [CANONICAL_TYPES["ethernet"]]}, True, id="mixed_type_match_subif_Ethernet"),
+        pytest.param({"interface": "Management1", "ignored_interfaces": ["Management1", CANONICAL_TYPES["management"]]}, True, id="mixed_exact_and_type_present"),
+        # No Match Cases
+        pytest.param(
+            {"interface": "Management1/1", "ignored_interfaces": [CANONICAL_TYPES["ethernet"], "Vlan10"]}, False, id="no_match_completely_different_types_and_names"
+        ),
+        pytest.param(
+            {"interface": "Loopback0", "ignored_interfaces": ["Loopback1", CANONICAL_TYPES["vxlan"]]}, False, id="no_match_specific_names_different_number"
+        ),
+        pytest.param({"interface": "Ethernet1", "ignored_interfaces": ["Eth", CANONICAL_TYPES["loopback"]]}, False, id="no_match_partial_prefix_in_list"),
+        pytest.param({"interface": "Vxlan1", "ignored_interfaces": [CANONICAL_TYPES["vlan"]]}, False, id="no_match_vxlan_vs_vlan_type"),
+    ],
+)
+def test_is_interface_ignored(input_params: dict[str, Any], expected_output: bool | None) -> None:
+    """Tests the is_interface_ignored function with various inputs, assuming Pydantic has validated and canonicalized interface names."""
+    interface_value = input_params["interface"]
+    ignored_interfaces_value = input_params["ignored_interfaces"]
+    assert is_interface_ignored(interface_value, ignored_interfaces_value) == expected_output