code: def test_random_gen(self, device, dtype):
      torch.manual_seed(42)
      degrees = torch.tensor(
          [[0.0, 30.0], [0.0, 30.0], [0.0, 30.0]],
          device=device,
          dtype=dtype,
      )
      param_gen = RotationGenerator3D(degrees=degrees)
      res = param_gen(torch.Size((2,)), same_on_batch=False)
  
      expected = {
          "yaw": torch.tensor(
              [26.4681, 27.4501], device=device, dtype=dtype
          ),
          "pitch": torch.tensor(
              [11.4859, 28.7792], device=device, dtype=dtype
          ),
          "roll": torch.tensor(
              [11.7134, 18.0269], device=device, dtype=dtype
          ),
      }
      assert res.keys() == expected.keys()
      assert_close(res["yaw"], expected["yaw"], atol=1e-4, rtol=1e-4)
      assert_close(
          res["pitch"], expected["pitch"], atol=1e-4, rtol=1e-4
      )
      assert_close(res["roll"], expected["roll"], atol=1e-4, rtol=1e-4)
  
imports: import pytest
  import torch
  from kornia.augmentation.random_generator import AffineGenerator3D, CropGenerator3D, MotionBlurGenerator3D, PerspectiveGenerator3D, RotationGenerator3D, center_crop_generator3d
  from kornia.testing import assert_close
label_desc: Use image node_id 3 for calling the TestRandomRotationGen3D obj's underlying member method code with example usage: obj.test_random_gen(device, dtype) without return types