Java 无法在@Test method中使用@BeforeGroup中定义的变量

Java 无法在@Test method中使用@BeforeGroup中定义的变量,java,testng,Java,Testng,测试1: I have 3 `@Test` methods in three different classes that extends one base class. 测试2: @Test(groups = "group1") public void test1() { System.out.println("Test1 value : " + var); } 测试3: @Test(groups = "group2",dependsOnGroups={"group1"}) pu

测试1:

I have 3 `@Test` methods in three different classes that extends one base class.
测试2:

@Test(groups = "group1")
public void test1() {
    System.out.println("Test1 value : " + var); 
}
测试3:

@Test(groups = "group2",dependsOnGroups={"group1"})
public void test2() {
    System.out.println("Test2 value : " + var); 
}
基类:

公共类测试库{

@Test
public void test3() {
    System.out.println("Test3 value : " + var); 
}
}

我需要
initialize()
方法在'test1()'和'test2()'之前单独执行。变量
var
的值仅在这些方法中使用

预期产出:

测试:分组前

Test1值:1

Test3值:0

测试:分组前

Test2值:1

但在上面的代码中,test2中的var值也是0。 如何修复代码以初始化属于组group1和组2的方法的变量?

这就是您想要的:

public int var = 0;

@BeforeGroups(value = { "group1", "group2" })

void initialize() {

    System.out.println("Before group");

    var = 1; 

} 
输出:

在组运行test1之前运行,var值为:1
正在运行 在组
运行变量值为:1的test2之前
通过:test1
通过:测试2

===============================================
默认测试

测试运行:2,失败:0,跳过:0 ==============================================
默认套件
运行的测试总数:2,失败:0,跳过:0
回答:

  • 在基类中将
    var
    设置为
    public
    全局变量
  • @BeforeGroups
    方法中的
    var
    赋值
  • 在子类中访问
    var
  • 但是在你的测试套件中设置的东西很少

  • 为什么需要基类和子类设置
  • 如果要在运行测试时使用不同的值初始化
    var
    ,该怎么办
  • 如果这两个问题的答案都是,在少数测试中获得
    var
    值,那么您可以考虑使用
    TestNG
    的功能,将参数传递给带有
    TestNG
    注释之一的方法


    这样,您的代码将看起来更干净、更沉稳。您可以先查看一下,TestNG通过子类创建一个实例,其中
    var
    为0

    然后,它只对以前创建的一个实例调用一次
    @BeforeGroups

    如果TestNG按预期工作,您应该在某处找到
    var=1

    如果要在所有实例中共享值,可以使用
    静态
    变量,或者更好地使用测试上下文:

    在不同的类中使用组不起作用。代码:public class TestBase{public int var=0;@BeforeGroups(value={“group1”,“group2”})void initialize(){System.out.println(“在组之前”);var=1;}}}公共类TestClass1扩展TestBase{@Test(groups=“group1”)公共void test1(){System.out.println(“test1值:+var”);}}}公共类TestClass2扩展TestBase{@Test(groups=“group2”,dependsOnGroups={“group1”)公共void test2(){System.out.println(”Test2值:“+var);}”运行上述脚本的输出如下:组前Test1值:组前Test2值:0@BeforeGroups中设置的var值没有反映在TestClass2方法中。我想你不想反映TestClass1的BeforeGroup的更改集int。你能粘贴你需要的预期输出吗ed与所有人共享var值,然后只需创建一个静态变量,它将在预期的输出中共享:组测试前1值:组测试前1值:组测试前2值:1测试3值:0我不希望在所有测试方法中共享该值。我只希望测试中属于这些组的值。另外将变量var设置为静态会引发以下错误。java.lang.CompatibleClassChangeError:预期的非静态字段com.amazon.gam.ingestion.uk.Testing.TestClass1.VarTips:始终将代码和预期的输出添加到OP而不是注释中。接下来,非静态字段不是来自项目内部的TestNGt、 如果我理解您的输出,您希望在任何组开始之前运行initialize方法?从预期的输出来看,上面的代码似乎也这样做,不确定为什么您希望Test3值:0。对于不属于任何组的测试,var应该是0吗?1。我的基类是具有所有公共st的测试基类测试用例需要uff,每个子类都有一个/多个测试2。我希望组1和组2中的测试的var值相同。实际上,我需要在测试中使用的值不是整数。DB在BeforeSuite中加载,DB对象在BeforeGroups中创建,这是我试图从测试用例访问的对象。
    package practise;
    
    import org.testng.annotations.BeforeGroups;
    import org.testng.annotations.Test;
    
    class TestBase {
        public int var = 0;
    
        @BeforeGroups(value = { "group1", "group2" })
        void initialize() {
            System.out.println("Running Before group");
            var = 1;
        }
    }
    
    /**
     * @author mrunal
     *
     */
    public class SO39910848 extends TestBase {
    
        @Test(groups = "group1")
        public void test1() {
            System.out.println("Running test1 with value of var as: " + var);
        }
    
        @Test(groups = "group2",dependsOnGroups={"group1"})
        public void test2() {
            System.out.println("Running test2 with value of var as: " + var);
        }
    
        public void test3() {
    
        }
    }