class_docstr: Base class for op test.
  
  It must be used in conjunction with `op_test` decorator.
  
  Examples:
  
  @op_utils.op_test(['native:0', 'cuda:0'])
  class test_relu(op_utils.OpTest):
  
      # ReLU function has a non-differentiable point around zero, so
      # dodge_nondifferentiable should be set to True.
      dodge_nondifferentiable = True
  
      def setup(self, float_dtype):
          self.dtype = float_dtype
  
      def generate_inputs(self):
          dtype = self.dtype
          x = numpy.random.uniform(-1, 1, (1, 3)).astype(dtype)
          return x, w, b
  
      def forward_chainerx(self, inputs):
          x, w, b = inputs
          y = chainerx.relu(x)
          return y,
  
      def forward_expected(self, inputs):
          x, w, b = inputs
          expected = x.copy()
          expected[expected < 0] = 0
          return expected,
  
  In this example, `float_dtype` is a Pytest fixture for parameterizing
  floating-point dtypes (i.e. float16, float32, float64). As seen from
  this, arguments in the `setup` method are treated as Pytest fixtures.
  
  Test implementations must at least override the following methods:
    * `generate_inputs`: Generates inputs to the test target.
    * `forward_chainerx`: Forward implementation using ChainerX.
    * `forward_expected`: Forward reference implementation.
  
  It can have the same attributes as `chainer.testing.FunctionTestCase`.
class_docstr_tok: ["Base","class","for","op","test",".","It","must","be","used","in","conjunction","with","`","op_test","`","decorator",".","Examples",":","@","op_utils.op_test","(","[","'native:0","'",",","'cuda:0","'","]",")","class","test_relu","(","op_utils.OpTest",")",":","#","ReLU","function","has","a","non-differentiable","point","around","zero",",","so","#","dodge_nondifferentiable","should","be","set","to","True",".","dodge_nondifferentiable","=","True","def","setup","(","self",",","float_dtype",")",":","self.dtype","=","float_dtype","def","generate_inputs","(","self",")",":","dtype","=","self.dtype","x","=","numpy.random.uniform","(","-1",",","1",",","(","1",",","3",")",")",".astype","(","dtype",")","return","x",",","w",",","b","def","forward_chainerx","(","self",",","inputs",")",":","x",",","w",",","b","=","inputs","y","=","chainerx.relu","(","x",")","return","y",",","def","forward_expected","(","self",",","inputs",")",":","x",",","w",",","b","=","inputs","expected","=","x.copy","(",")","expected","[","expected","<","0","]","=","0","return","expected",",","In","this","example",",","`","float_dtype","`","is","a","Pytest","fixture","for","parameterizing","floating-point","dtypes","(","i.e",".","float16",",","float32",",","float64",")",".","As","seen","from","this",",","arguments","in","the","`","setup","`","method","are","treated","as","Pytest","fixtures",".","Test","implementations","must","at","least","override","the","following","methods",":","*","`","generate_inputs","`",":","Generates","inputs","to","the","test","target",".","*","`","forward_chainerx","`",":","Forward","implementation","using","ChainerX",".","*","`","forward_expected","`",":","Forward","reference","implementation",".","It","can","have","the","same","attributes","as","`","chainer.testing.FunctionTestCase","`","."]
code: def run_test_forward(self, backend_config):
      # Skipping Forward -> Test Skipped
      if self.skip_forward_test:
          raise unittest.SkipTest("skip_forward_test is set")
  
      super(OpTest, self).run_test_forward(backend_config)
  
imports: import inspect
  import sys
  import unittest
  import numpy
  import pytest
  import chainer
  import chainer.testing
  import chainerx
label_desc: Use image node_id 5 for calling the OpTest obj's underlying member method code with example usage: obj.run_test_forward(backend_config) without return types