def on_test_end(self, trainer: Trainer, pl_module: LightningModule) -> None:
        """Called when test ends.

        Calculates and logs testing time and throughput metrics.

        Args:
            trainer (Trainer): PyTorch Lightning trainer instance
            pl_module (LightningModule): The current training module

        Note:
            - Calculates total testing time
            - Computes throughput in frames per second (FPS)
            - Logs batch size along with throughput for reference
            - The module argument is not used but kept for callback signature compatibility
        """
        del pl_module  # Unused argument.

        testing_time = time.time() - self.start
        output = f"Testing took {testing_time} seconds\nThroughput "
        if trainer.test_dataloaders is not None:
            if isinstance(trainer.test_dataloaders, torch.utils.data.dataloader.DataLoader):
                test_data_loader = trainer.test_dataloaders
            else:
                test_data_loader = trainer.test_dataloaders[0]
            output += f"(batch_size={test_data_loader.batch_size})"
        output += f" : {self.num_images / testing_time} FPS"
        logger.info(output)
Called when test ends.

        Calculates and logs testing time and throughput metrics.

        Args:
            trainer (Trainer): PyTorch Lightning trainer instance
            pl_module (LightningModule): The current training module

        Note:
            - Calculates total testing time
            - Computes throughput in frames per second (FPS)
            - Logs batch size along with throughput for reference
            - The module argument is not used but kept for callback signature compatibility
        
src/anomalib/callbacks/timer.py