[英]The value for annotation attribute Test.enabled must be a constant expression
Basically, I wanted to use a constant boolean attribute of Context class which I have changed via reflection so that I can dynamically set the @annotated enabled for a testNG method in a TestNG class. 基本上,我想使用通过反射更改的Context类的常量布尔属性,以便可以在TestNG类中动态设置为testNG方法启用的@annotated。 The TestNG class has a static final attribute which is the same as the Context.DISBLE_TEST_CASES_IF_OLD_STACK.
TestNG类的静态最终属性与Context.DISBLE_TEST_CASES_IF_OLD_STACK相同。 I have pasted the code below for the TestNG class and its method.
我已经为TestNG类及其方法粘贴了以下代码。 The end goal for me is to toggle the enabled value or basically disable the test based on the the context if its old environment or new environment
我的最终目标是切换启用的值,或者基本基于上下文禁用测试(如果测试的环境是旧环境还是新环境)
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);
}
}
}
TESTNG CLASS AND METHOD example: TESTNG类别和方法示例:
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() {
......
}
}
To the end goal of selectively disabling testcases, you can use TestNgs IAnnotationTransformer to control the enabled flag. 为了最终有选择地禁用测试用例,可以使用TestNgs IAnnotationTransformer来控制启用的标志。 It will be run before each @Test annotated method and can control it's execution.
它将在每个@Test带注释的方法之前运行,并且可以控制其执行。
eg. 例如。
public class DemoTransformer implements IAnnotationTransformer {
public void transform(ITest annotation, Class testClass,
Constructor testConstructor, Method testMethod)
{
if (condition) {
annotation.setEnabled(false/true);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.