我们可以在子类中设置一个线程局部变量并在Java中的父类中访问它吗?

问题描述 投票:0回答:1

我有一个自动化项目,有两个测试类(子类)和一个测试库(父类)。在 TestBase 中,我定义了一个 threadlocal 属性,如下所示。

protected ThreadLocal<ITestContext> iTestContextThreadLocal = new ThreadLocal<>();

在每个子类中,我将一个名为“feature”的属性设置到该 ThreadLocal 属性中。示例 Child 类如下所示。

public class RestTests extends TestBase{

    @BeforeClass(alwaysRun = true)
    public void init(ITestContext iTestContext) {
        iTestContext.setAttribute("feature", "Sample - RestTests1");
        iTestContextThreadLocal.set(iTestContext);
        String feature = iTestContextThreadLocal.get().getAttribute("feature").toString();
    }

    @Test
    public void testScenario1(){
        //Automation Code
    }
}

在 TestBase 中,我有一个“AfterMethod”,在其中我尝试访问子类的 before 方法中设置的值。

    @AfterMethod(alwaysRun = true)
    public void test() {
        try {
            ITestContext iTestContext = iTestContextThreadLocal.get();
            String feature = iTestContext.getAttribute("feature").toString();
            System.out.println("***** ThreadLocalAttribute: " + feature);

            //Rest of the code
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // Clean up the ThreadLocal variables after method execution
            iTestContextThreadLocal.remove();
        }
    }

我面临的问题是 - 一个类中的并行测试执行(在类和方法中)功能集作为输出提供。 举个例子,如果我将“Sample - RestTests1”和“Sample - RestTests2”设置为子类中的功能,当我尝试使用以下代码在 TestBase afterMethod 中访问它们时,仅给出一个类的功能

iTestContext.getAttribute("feature").toString();

如何解决这个问题并通过 TestBase 的 AfterMethod 获取每个类中的功能集?

我尝试过改变注释的顺序,并尝试了互联网上的解决方案。但目前还没有找到解决办法。

非常感谢任何帮助。 预先感谢。

java selenium-webdriver testng thread-local
1个回答
0
投票

例如,如果您阅读类似主题的this问题,您会发现 TestNG 的每个测试类仅创建一个实例的策略存在问题,以及如果测试应在以下环境中运行则如何重置状态平行。

我想在你的情况下,你不应该使用

init
方法
@BeforeClass
,而应该使用
@BeforeMethod
,或者也许
@BeforeTest
(不记得确切的名称)。

© www.soinside.com 2019 - 2024. All rights reserved.