【问题标题】:How to programmatically find the Test method name which has triggered the current test method using "dependsOnMethods"如何使用“dependsOnMethods”以编程方式查找触发当前测试方法的测试方法名称
【发布时间】:2019-08-20 16:24:35
【问题描述】:

我正在使用 TestNG 和注释-“dependsonMethods”

代码示例:

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

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

******************更新了上下文和代码示例**************************** ***

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

CURRENT:使用 TestNg-"dependsonMethods" 调用 [addTest] 的测试 [addAndPopulateTest]。运行后,Extent Report 将 [addAndPopulateTest] 和 [addTest] 的结果分别显示为 2 个单独的测试。这是当前情况的链接:https://imgur.com/ZnBNqzo

预期:范围 HTML 报告应显示 - 单个测试,即 [addAndPopulateTest] 和 2 个子测试,即 [addTest] 和 [addAndPopulateTest]。这是ToBe情况的链接:https://imgur.com/NKMxoIB

*****代码示例

///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_addTest

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

}

【问题讨论】:

  • 如果只需要方法名,可以通过stackoverflow.com/questions/41502326/…获取
  • @IshitaShah:我没有简单的方法名称。我想要调用方法的名称 - Test1 当我在被调用的方法 - Test2 中时。请注意,我正在执行 Test1 并且在 Test1 上方找到 dependsOnMethods = { "test2" } 后执行到 Test2。
  • 使用 ITestResult 可以获得方法数组。 arg0.getMethod().getMethodsDependedUpon();并且 Test1 没有调用 Test2
  • @RahulL:我想你在这里问我一个问题..而且 Test1 没有调用 Test2?我对此的回答是否定的。当 Test2 被执行 & arg0.getMethod().getMethodsDependedUpon() 是空数组。

标签: testng extentreports selenium-extent-report


【解决方案1】:

检测正在运行的测试的方法名称的一种简单方法是将java.lang.reflect.Method 作为方法级配置(@BeforeMethod@AfterMethod)的参数注入。

作为 TestNG 中依赖注入功能的一部分,注入到 @BeforeMethod@AfterMethod 中的 Method 实例将接收到将在此 @BeforeMethod 完成后(或在该方法之后调用的测试方法)为 @AfterMethod 运行)”。 (见Native Dependency Injection

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

作为一个考虑到您的用例的简短示例,请考虑以下类:

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()方法时,dependsOnMethods会强制test2先执行。 @BeforeMethod 将在每个测试方法之前运行,将类字段methodName 分配给即将执行的测试方法的值。

执行test1()后,我们会得到如下输出:

Running test2
Running test1

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

【讨论】:

  • 尝试了很多!有很多关于休息的价值,但无法弄清楚“调用方法”,即test1。请帮忙。
  • 如果你能发布你的代码,以及一些你尝试过的信息,那将会很有帮助。了解您所看到的结果以及您仍然希望获得的结果也会有所帮助。
【解决方案2】:

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

A) 如果实例名 = 方法名,则使用方法名创建测试。

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

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

【讨论】:

  • 我能解释一下为什么这个答案被否决了吗?它对我有用,并且在我的团队中得到了认可。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 2011-05-15
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多