当前位置: 首页 > 知识库问答 >
问题:

从TestListenerAdapter访问TestNG测试类的字段

乐正意智
2023-03-14

出身背景

我有以下情况:

  • 我的测试类实现了org。testng。ITest
  • 它们都有一个助手,包含当前测试环境的信息(例如,正在测试的设备)

例如:

com.company.appundertest.Helper h;

public class TestClass implements org.testng.ITest {
    private String testName;

    //Helper is initialized externally in Factory + DataProvider 
    //and passed to Constructor.
    public TestClass(com.company.appundertest.Helper hh) {

    this.h = hh;

    //constructor sets the test-name dynamically
    //to distinguish multiple parallel test runs.
    this.testName = "some dynamic test name";
    }

    @Override
    public String getTestName() {
        return this.testName;
    }

    @Test
    public void failingTest() {
        //test that fails...
    }
}
  • 这些测试类使用工厂和并行数据提供程序并行执行

这个问题本质上归结为:

如何访问TestNG测试类中的字段?

工具书类

  • 在Java中通过反射访问私有继承字段

共有2个答案

欧阳英彦
2023-03-14

@Vish的解决方案很好,但是您可以通过以下方式避免反思:

interface TestWithHelper {
   Helper getHelper();
}

您的TestClass将在其中实现它。然后:

private void getCurrentTestHelper(Object testClass) {
  if (testClass instanceof TestWithHelper) {
    Helper helper = ((TestWithHelper) testClass).getHelper();
    ...
  }
}
南宫松
2023-03-14

这里有一个例子方法。您可以将其插入到测试监听器类中(扩展了TestListenerAdapter

public class CustomTestNGListener extends TestListenerAdapter{

//accepts test class as parameter.
//use ITestResult#getInstance()

private void getCurrentTestHelper(Object testClass) {
        Class<?> c = testClass.getClass();
        try {
            //get the field "h" declared in the test-class.
            //getDeclaredField() works for protected members.
            Field hField = c.getDeclaredField("h");

            //get the name and class of the field h.
            //(this is just for fun)
            String name = hField.getName();
            Object thisHelperInstance = hField.get(testClass);
            System.out.print(name + ":" + thisHelperInstance.toString() + "\n");

            //get fields inside this Helper as follows:
            Field innerField = thisHelperInstance.getClass().getDeclaredField("someInnerField");

            //get the value of the field corresponding to the above Helper instance.
            System.out.println(innerField.get(thisHelperInstance).toString());

        } 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();
        }

}
}

将其称为:

@Override
public void onTestFailure(ITestResult tr) {
        getCurrentTestHelper(tr.getInstance());
}
 类似资料:
  • 我使用TestNG6.8+Selenium WebDriver2.32来测试web应用程序的GUI。在测试失败的情况下,我想拍摄应用程序GUI的截图。 我所拥有的: null null 您能否建议一种方法,如何获得在AbstractGuitTest中声明的WebDriver实例,以便我可以使用它在GuiTestListener类中进行截图?

  • 问题内容: 我有一个名为 Geometry 的基类,在该基类中存在 Sphere 子类: 和一个子类: 我有一个包含所有 Geometry 对象的ArrayList,我想对其进行迭代以检查是否正确读取了文本文件中的数据。到目前为止,这是我的迭代器方法: 如何访问和打印 球体的 半径和中心字段?提前致谢 :) 问题答案: 如果要访问子类的属性,则必须转换为子类。 但是,这并不是最OO的处理方式:一旦

  • 我正在尝试使用TestNg并行运行测试。我有3个类(两个扩展了BaseTest类的测试类) BaseTest类只有“设置”和“拆卸”,没有其他东西。 当我尝试像这样并行运行测试时,一个带有测试的类运行,而另一个类只打开一个浏览器(但不执行测试) 但是当我从BaseTest类中剪切代码并将其直接放到我的每个测试类中(因此不扩展BaseTClass)时,代码工作,测试并行运行 为什么?我根本没有做任何

  • 我正在尝试从Java切换到Kotlin。但我有很多遗留代码和第三方库。我看到,Java类中经常存在没有getter和setter的公共字段,这些字段必须从其他类访问。如果没有Kotlin代码中的getter,我如何访问Java类的公共字段?

  • 使用java和testNG,我在两个不同的类test1.class和test2.class中有两个测试,还有一个包含大多数方法的base.class:

  • 当我使用Selenium网格在appium(Android)中运行并行测试脚本时,我得到以下错误。 默认套件运行得测试总数:6,失败:0,跳过:3配置失败:1,跳过:0 堆栈跟踪消息:org.openqa.selenium.sessionNotCreatedException:无法创建新会话。(原始错误:请求了一个新会话,但一个正在进行)我的TestNG xml文件: config.json文件: