code: def _test_logging(self, history, lrs=None):
      if lrs is None:
          lrs = [BaseCSVLoggerTest.lr]
      with open(self.csv_filename, "r", encoding="utf-8") as csvfile:
          reader = csv.DictReader(csvfile)
          rows = []
          for row in reader:
              if row["epoch"] != "":
                  if len(lrs) == 1:
                      self.assertAlmostEqual(float(row["lr"]), lrs[0])
                      del row["lr"]
                  else:
                      for i, lr in enumerate(lrs):
                          self.assertAlmostEqual(
                              float(row[f"lr_group_{i}"]), lr
                          )
                          del row[f"lr_group_{i}"]
  
              rows.append(row)
      self.assertEqual(len(rows), len(history))
      for row, hist_entry in zip(rows, history):
          row = {k: v for k, v in row.items() if v != ""}
          self.assertEqual(row.keys(), hist_entry.keys())
          for k in row.keys():
              if isinstance(hist_entry[k], float):
                  self.assertAlmostEqual(float(row[k]), hist_entry[k])
              else:
                  self.assertEqual(str(row[k]), str(hist_entry[k]))
  
imports: import csv
  import os
  from tempfile import TemporaryDirectory
  from unittest import TestCase, main, skipIf
  from unittest.mock import MagicMock, call
  import torch
  import torch.nn
  from tests.framework.tools import some_data_generator
  from poutyne import AtomicCSVLogger, Callback
  from poutyne import CSVLogger
  from poutyne import Model, TensorBoardLogger
label_desc: Use image node_id 8 for calling the BaseCSVLoggerTest obj's underlying member method code with example usage: obj._test_logging(history, lrs) without return types