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

如何通过编程方式找到使用“依赖On方法”触发当前测试方法的测试方法名称

王德华
2023-03-14

我正在使用TestNG和注释-“依赖方法”

代码示例:

@Test(dependsOnMethods = { "test2" })
public void Test1() throws IOException { }

现在,需要以编程方式获取触发其他测试方法(Test2)的测试方法(Test1)的名称。

******************更新了上下文

我正在Maven项目中运行TestNg、java、extent reports 4.0.9、selenium测试。

CURRENT:测试[addAndPopulateTest],它使用TestNg-“依赖方法”调用[addTest]。运行后,范围报告显示[addAndPopulateTest]的结果

预期:扩展HTML报告应显示-单个测试,即[addAndPopulateTest],以及两个子测试,即[addTest]

*****代码示例

///TC_addAndPopulateTest

 package com.tra.testCases;  
 import org.testng.annotations.Test;
 import com.tram.pageObjects.BaseClass;

 public class TC_addAndPopulateTest extends TC_addTest {

@Test(dependsOnMethods = { "addTest" })
public void addAndPopulateTest() throws IOException, InterruptedException {
    System.out.println("Currently executing Test-> addAndPopulateTest");
}
}

///TC\U添加测试

  package com.tram.testCases;

 import java.io.IOException;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 import com.tram.pageObjects.BaseClass;

 public class TC_addTest extends BaseClass {

   @Test()
   public void addTest() throws IOException, InterruptedException {
    System.out.println("Currently executing Test->'addTest'");
}
}

///报告类

  import org.testng.ITestContext;
  import org.testng.ITestListener;
  import org.testng.ITestResult;
  import com.aventstack.extentreports.ExtentReports;
  import com.aventstack.extentreports.ExtentTest;
  import com.tram.pageObjects.BaseClass;

 public class Reporting extends BaseClass implements ITestListener {
 private static ExtentReports extent = 
              ExtentManager.createInstance("Extent-Report.html");
private static ThreadLocal parentTest = new ThreadLocal();
private static ThreadLocal test = new ThreadLocal();

@Override
public synchronized void onStart(ITestContext context) {        

}

@Override
public synchronized void onFinish(ITestContext context) {
    extent.flush();
}

@Override
public synchronized void onTestStart(ITestResult result) {


**//Currently, [addTest] is ready to be executed, So, need to the find 
  that this test method [addTest] has triggered directly by [TC_addTest] 
 class or by other test method. 

 A] If directly by the test class, set 
   PARENT=result.getMethod().getMethodName()
 B] if indirectly by the other test method, set PARENT= Name of the test 
   method [addAndPopulateTest] which has triggered the [addTest] //**

   ExtentTest parent = 
         Extent.createTest(result.getMethod().getMethodName());
          parentTest.set(parent);          
      }

@Override
public synchronized void onTestSuccess(ITestResult result) {
    ExtentTest child = ((ExtentTest) 
   parentTest.get()).createNode(result.getMethod().getMethodName());
    test.set(child);
    ((ExtentTest) test.get()).pass("Test passed");
}

@Override
public synchronized void onTestFailure(ITestResult result) {
    ((ExtentTest) test.get()).fail(result.getThrowable());
}

@Override
public synchronized void onTestSkipped(ITestResult result) {
    ((ExtentTest) test.get()).skip(result.getThrowable());
}

@Override
public synchronized void onTestFailedButWithinSuccessPercentage(ITestResult 
    result) { 

     }
   }

//数据块管理器

 package com.tram.utilities;

 import com.aventstack.extentreports.ExtentReports;
 import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
 import com.aventstack.extentreports.reporter.configuration.Theme;

 public class ExtentManager {

   private static ExtentReports extent;

 public static ExtentReports getInstance() {
    if (extent == null)
        createInstance("test-output/extent.html");      
    return extent;
}

public static ExtentReports createInstance(String fileName) {
    ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(fileName);
    htmlReporter.config().setTheme(Theme.STANDARD);
    htmlReporter.config().setDocumentTitle(fileName);
    htmlReporter.config().setReportName(fileName);        
    extent = new ExtentReports();
    extent.attachReporter(htmlReporter);        
    return extent;
}

}

共有2个答案

臧弘和
2023-03-14

最后,通过实现“ITestListener”,比较实例名和方法名,对我的问题进行排序。

A) 如果实例名称=methodname,请使用methodname创建测试。

B) 如果实例名称=!methodname,使用instancename创建测试。

public static ArrayList<String> mylist = new ArrayList<String>();

@Override
public void onTestStart(ITestResult result) {

    String instance = result.getInstanceName().toString();
    String methodname = result.getMethod().toString();

    if ((chkAndAddArray(finalInstance))) {
        return;
    }

    if (finalmethodname.equalsIgnoreCase(finalInstance.toString())) {
        logger = extent.createTest(finalmethodname);
    } else {
        logger = extent.createTest(finalInstance);
    }
}


boolean chkAndAddArray(String instance) {

    if (mylist.contains(instance)) {
        System.out.println(instance + " value is already present");
        return true;
    } else
        mylist.add(instance);
    System.out.println(instance + " value is not present & now, added");
    return false;
}
孟英叡
2023-03-14

检测正在运行的测试的方法名称的一种简单方法是注入java。朗,反思一下。方法作为方法级配置的参数(@beforethod@AfterMethod)。

作为TestNG中依赖项注入功能的一部分,注入到BeforeMethod或AfterMethod中的方法实例“将接收在该方法完成后(或在为@AfterMethod运行的方法之后)”将调用的测试方法。(请参阅本机依赖项注入)

这将允许我们检索正在执行的任何方法的名称,甚至是从属测试方法,这些方法随后可以传递给报告。

作为一个牢记用例的简单示例,请考虑以下类:

public class MethodNameDemo {

    String methodName;

    @BeforeMethod
    public void setup(Method method) {
        methodName = method.getName();
    }

    @Test
    public void test2() {
        System.out.println("Running " + methodName);
    }

    @Test (dependsOnMethods = "test2")
    public void test1() {
        System.out.println("Running " + methodName);
    }
}

当我们直接运行test1()方法时,依赖方法将强制test2首先执行。@BeforeMethod将在每个测试方法之前运行,将类字段method Name分配给即将执行的测试方法的值。

执行test1()时,我们将得到以下输出:

Running test2
Running test1

一旦有了这些值,就可以执行任何需要的操作来传递到范围。

 类似资料:
  • 我正在尝试以下代码: 我期待输出为: 但我得到异常的测试方法没有找到: 我在哪里犯了错误?我如何才能实现我的目标?

  • 我有以下代码 我对嘲笑不熟悉。我有以下疑问。我正在尝试测试公共方法。 我是否可以断言私有变量workDone的值? 是否可以验证超类中的方法调用? 如何在方法中模拟私有方法调用?

  • 本文向大家介绍特定测试方法的执行如何依赖于TestNG中的其他测试方法?,包括了特定测试方法的执行如何依赖于TestNG中的其他测试方法?的使用技巧和注意事项,需要的朋友参考一下 可以在dependsOnMethods helper属性的帮助下,使特定测试方法的执行依赖于另一个测试方法。 示例 在Java类文件中,只有在该方法成功运行后,才会执行verifyLoan()方法。但是方法独立运行,而无

  • 我想测试我的控制器 在这里,我需要硬编码,比如 其中取决于我应用于控制器类的注释及其方法。 但是我能用类名和方法名以编程方式派生它吗?

  • 问题内容: 我已经看到了一些与此相关的问题,但是对于我的特定问题,我似乎无法理解任何答案。 我有一个模拟对象,让我们调用“ object1”,将其发送到某种测试方法,让我们调用testMethod()。所以我最后打电话 用于检测。现在在这个testMethod的某个地方,它将有一部分调用方法 这是一个无效方法。如果方法像 它实际上会返回什么,我通常会这样做 但是,这是一个无效方法,我只想测试一下它