2017-08-28 3 views
1

Fondamentalement, je voulais utiliser un attribut booléen constant de la classe Context que j'ai modifié par réflexion afin de pouvoir définir dynamiquement le @annotated activé pour une méthode testNG dans une classe TestNG. La classe TestNG a un attribut final statique qui est le même que Context.DISBLE_TEST_CASES_IF_OLD_STACK. J'ai collé le code ci-dessous pour la classe TestNG et sa méthode. L'objectif final pour moi est d'activer la valeur activée ou désactiver essentiellement le test en fonction du contexte si son ancien environnement ou nouvel environnementLa valeur de l'attribut d'annotation Test.enabled doit être une expression constante

package com.abc.api.core.context; 

    import java.lang.reflect.Field; 
    import java.lang.reflect.Modifier; 


    public class Context { 
     public static final boolean DISBLE_TEST_CASES_IF_OLD_STACK = getConstantReflection(); 


     public static boolean getConstantReflection() 
     { 
      System.out.println(DISBLE_TEST_CASES_IF_OLD_STACK); 
      try { 
       setEnableFlagBasedOnStackForTestCases(); 
      } catch (NoSuchFieldException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (SecurityException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println(Context.DISBLE_TEST_CASES_IF_OLD_STACK); 
      try { 
       final Field fld = Context.class.getDeclaredField("DISBLE_TEST_CASES_IF_OLD_STACK"); 
       return (Boolean) fld.get(null); 
      } catch (NoSuchFieldException e) { 
       return (Boolean) null; 
      } catch (IllegalAccessException e) { 
       return (Boolean) null; 
      } 
     } 

     private static void setEnableFlagBasedOnStackForTestCases() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ 


      Field f = Context.class.getDeclaredField("DISBLE_TEST_CASES_IF_OLD_STACK"); 
      f.setAccessible(true); 

      //'modifiers' - it is a field of a class called 'Field'. Make it accessible and remove 
      //'final' modifier for our 'CONSTANT' field 
      Field modifiersField = Field.class.getDeclaredField("modifiers"); 
      modifiersField.setAccessible(true); 
      modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); 

      if (TestcaseContext.getContext().equalsIgnoreCase(Context.OLD_STACK)) { 
       f.setBoolean(null, false); 
      }else { 
       f.setBoolean(null, true); 
      } 
     } 

    } 

CLASSE testng ET exemple MÉTHODE:

package com.abc.api.test.tests.TestA; 

import com.abc.api.core.context.Context; 

public class TestA extends TestCommon { 

    private static final boolean ENABLE_DISABLE = Context.DISBLE_TEST_CASES_IF_OLD_STACK; 

    /** 
    * 
    */ 
    @BeforeTest 
    void setPropertiesFile() { 
     ...... 

    } 

    /** 
    * PATCH Positive Test Cases 
    * 
    */ 

    @Test(priority = 11, enabled=ENABLE_DISABLE) 
    public void testPositive1() { 
     ...... 
    } 
} 
+2

Votre 'DISBLE_TEST_CASES_IF_OLD_STACK' n'est pas une variable constante. Vous ne pourrez pas l'utiliser dans une annotation. –

+0

Mais la réflexion ne modifie pas essentiellement la valeur finale statique qui est en fait un attribut constant de la classe. Par conséquent, je suis passé par ce chemin d'utilisation de la réflexion. –

+2

https://stackoverflow.com/questions/10636201/java-annotations-values-provided-in-dynamic-manner –

Répondre

2

Pour atteindre l'objectif final de désactivation sélective des zones de test, vous pouvez utiliser TestNgs IAnnotationTransformer pour contrôler l'indicateur activé. Il sera exécuté avant chaque méthode annotée @Test et peut contrôler son exécution.

par ex.

public class DemoTransformer implements IAnnotationTransformer { 
    public void transform(ITest annotation, Class testClass, 
     Constructor testConstructor, Method testMethod) 
    { 
    if (condition) { 
     annotation.setEnabled(false/true); 
    } 
} 
+0

C'est exactement ce que j'ai fini par faire. Cependant, pour une raison quelconque, lorsque j'ai annoté la classe TestNG avec la classe d'écouteur, l'écouteur n'a pas été appelé. J'ai dû utiliser l'écouteur via xml dans la suite de tests, ce qui est un peu dommage parce que je voulais appliquer cet écouteur à cette classe particulière. De plus, j'ai découvert que je pouvais simplement utiliser des groupes et les exclure et les inclure selon les besoins. –