code: def testFunction(self):
      for dim in [6, 8, 15]:
          f = Gsobol(dim=dim)
          self.assertIsNotNone(f.a)
          self.assertEqual(len(f.a), dim)
      f = Gsobol(dim=3, a=[1, 2, 3])
      self.assertEqual(f.a, [1, 2, 3])
      X = torch.tensor([[1.0, 1.0, 1.0], [2.0, 2.0, 2.0]])
      Z = f.evaluate_true(X)
      Ztrue = torch.tensor([2.5, 21.0])
      self.assertAllClose(Z, Ztrue, atol=1e-3)
      self.assertIsNone(f._optimizers)
      with self.assertRaises(NotImplementedError):
          f.optimal_value
  
file_path: botorch/test/test_functions/test_sensitivity_analysis.py
imports: import torch
  from botorch.test_functions.sensitivity_analysis import Gsobol, Ishigami, Morris
  from botorch.utils.testing import BotorchTestCase
label_desc: Use image node_id 1 for calling the TestGsobol obj's underlying member method code with example usage: obj.testFunction() without return types