code: def test_basic(self):
      env = _make_fake_env()
      observer = action_norm.ActionNormObserver()
      timestep = env.reset()
      observer.observe_first(env, timestep)
      for it in range(5):
          action = np.ones((1,), dtype=np.float32) * it
          timestep = env.step(action)
          observer.observe(env, timestep, action)
      metrics = observer.get_metrics()
      self.assertLen(metrics, 3)
      np.testing.assert_equal(metrics["action_norm_min"], 0)
      np.testing.assert_equal(metrics["action_norm_max"], 4)
      np.testing.assert_equal(metrics["action_norm_avg"], 2)
  
file_path: acme/acme/utils/observers/action_norm_test.py
imports: from acme import specs
  from acme.testing import fakes
  from acme.utils.observers import action_norm
  import dm_env
  import numpy
  from absl.testing import absltest
label_desc: Use image node_id 1 for calling the ActionNormTest obj's underlying member method code with example usage: obj.test_basic() without return types