class_docstr: Test integration of the gradient transform decorator
class_docstr_tok: ["Test","integration","of","the","gradient","transform","decorator"]
docstr: Test that a gradient transform acts on QNodes with multiple parameters correctly
docstr_tok: ["Test","that","a","gradient","transform","acts","on","QNodes","with","multiple","parameters","correctly"]
code: def test_acting_on_qnodes_multi_param(self, shots, atol):
      """Test that a gradient transform acts on QNodes with multiple parameters correctly"""
      np.random.seed(412)
      dev = qml.device("default.qubit", wires=2, shots=shots)
  
      @qml.qnode(dev)
      def circuit(weights):
          qml.RX(weights[0], wires=[0])
          qml.RY(weights[1], wires=[1])
          qml.CNOT(wires=[0, 1])
          return qml.expval(qml.PauliZ(0)), qml.var(qml.PauliX(1))
  
      grad_fn = qml.gradients.param_shift(circuit)
  
      w = np.array([0.543, -0.654], requires_grad=True)
      res = grad_fn(w)
      assert circuit.interface == "auto"
      x, y = w
      expected = np.array(
          [[-np.sin(x), 0], [0, -2 * np.cos(y) * np.sin(y)]]
      )
      if isinstance(shots, list):
          assert all(
              np.allclose(r, expected, atol=atol, rtol=0) for r in res
          )
      else:
          assert np.allclose(res, expected, atol=atol, rtol=0)
  
imports: import pytest
  import pennylane
  from pennylane import numpy
  from pennylane.gradients.gradient_transform import _find_gradient_methods, _validate_gradient_methods, choose_trainable_params
label_desc: Use image node_id 2 for calling the TestGradientTransformIntegration obj's underlying member method code with example usage: obj.test_acting_on_qnodes_multi_param(shots, atol) and returns: qml,  qml