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

如何从@Test方法使用数据提供者的每次迭代将数据传递给TESTNG的Listener类中的onTest成功方法

卢磊
2023-03-14

,我有一个带有dataprovider的@测试方法,我有一个监听器。类,我的目标是,当我的@Test method为success时,testrail中的case状态在侦听器类的onTestSuccess方法中自动设置为“Passed”,这个过程是可以的,但当我为@Test method使用dataprovider时,这会导致问题

我希望由于dataprovider的原因,相同的方法必须工作(比方说)三次,并且对于@Test method的每次迭代,必须将不同的case id数据发送给onTestSuccess方法

我的听众。班

package com.myproject.test.listeners;
import java.lang.reflect.Method;
import org.testng.IClass;
import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ISuite;
import org.testng.ISuiteListener;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class Listener implements ITestListener, ISuiteListener, IInvokedMethodListener {
    ...
    public void onTestStart(ITestResult result) {
    }
    public void onTestSuccess(ITestResult result) {
        try {
            Program pr = new Program();
            System.out.println("onTestSuccess Method for :" + result.getName());
            String TestID = null;
            String TestRunID = null;
            for (Method testMethod : result.getTestClass().getRealClass().getMethods()) {
                if (testMethod.getName().equals(result.getName()) && testMethod.isAnnotationPresent(UseAsTestRailId.class)) {


                    UseAsTestRailId useAsTestName = testMethod.getAnnotation(UseAsTestRailId.class);
                    TestID = Integer.toString(useAsTestName.testRailCaseId());
                    TestRunID = Integer.toString(useAsTestName.testRailRunId());
                    System.out.println("Case ID---> " + TestID + " Run ID--> " + TestRunID);
                    // 1 = Passed
                    pr.enterTestResult(TestRunID, TestID, 1);
                }
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }

...
}

我的测试类(SettinsTests.java)包括我的@Test方法(check SumtPasswordFormatIsValidatedTest)

@Listeners(com.test.listeners.Listener.class)
//listener annotation row is written in BaseTest class 
public class SettingsTests extends BaseTest {


...


    /**
     * Test Case - C5001275 - Check that "Please enter at least 8 characters."
     * message is displayed when entered value into "Current Password" field in
     * wrong format This case will run two times!
     * 
     * @param currentPasswordValue
     */
    @Test(dataProvider = "currentPasswordTestWithWrongValue")
    @UseAsTestRailId(testRailCaseId = 5001275,testRailRunId = 56662) 
    // aim is that to send different case id for each iteration,now even if method works twice , only one testRailCaseId is sent
    public void checkCurrentPasswordFormatIsValidatedTest(String currentPasswordValue) {
        logger.trace("STARTING TEST: checkCurrentPasswordFormatisValidatedTest");

        logger.trace("Test Step : Enter current password in wrong format");
        settingsPageObject.enterCurrentPassword(currentPasswordValue);

        logger.trace("Test Step : Click on the button 'UPDATE' ");
        settingsPageObject.clickOnUpdateButton();

        logger.trace("Expected Result: The message 'Please enter at least 8 characters.' is displayed on screen.");
        Assert.assertEquals(settingsPageObject.getCurrentPasswordWrongText(), "Please enter at least 8 characters.");
    }



    @DataProvider(name = "currentPasswordTestWithWrongValue")
    public static Object[][] validateTestWithCurrentPasswordInWrongFormat() {

        return new Object[][] { { RandomStringUtils.randomAlphabetic(7) }, { RandomStringUtils.randomAlphabetic(1) } };
    }


...

}

我的注释类(UseAsTestRailId.java)

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface UseAsTestRailId
{
    int testRailCaseId() default 0;
    int testRailRunId() default 0;
    String[] tags() default "";
}

一些@测试方法设置两个案例状态,一些@测试方法设置testRail中的三个案例状态,因此数据提供者数据集需要的越多,需要的案例id就越多,它必须是动态的

共有1个答案

游安康
2023-03-14

您可以使用testresult对象中的setattribute值来设置自定义值。从Reporter:Reporter获取当前结果。getCurrentTestresult,然后setAttribute(“TC\u id”,sasdf),并在ontestsuccess中使用它,在result对象上使用getAttribute(“TC\u id”)。

 类似资料:
  • Edit1:我有一个Excelutility.java类,可以从中获取单元格数据,并将其传递给我的测试类中的tests方法。 为了从excel文件中读取,我按照以下方式组织了测试方法: 我想做的是: > 从sheet1读取第一行数据,将其传递到test1,继续到test2 从工作表1读取第二行数据,将其传递到test1,继续到test2 并依此类推,具体取决于excel工作表中的行数。 结果是:

  • 我正在使用TestNG和Selenium WebDriver为webapp编写测试套件。 我需要的是为不同的经过身份验证的用户多次运行测试类的所有方法(数据在运行时从数据库中取出)。因此,我需要将一个数据传递给带有数据提供者的类,该类提供所有用户的凭据,然后为每个用户创建一个web驱动程序(为了实验的纯度),并在方法中使用提供的凭据进行验证,运行该类的所有方法,并制作一个分解关闭web驱动程序。

  • 有人知道TestNG如何根据为测试方法指定的数据提供者名称计算出数据提供者方法是什么吗? 我找到了这个解决方案:https://gist.github.com/ae6rt/3805639 但是,它没有考虑到数据提供者可能是: 在完全不同的类别中定义,或 在父类中定义,并且 该方法可以是静态的,也可以是非静态的 我试图自己破解一些东西,但后来我想我不可能是第一个试图解决这个问题的人,特别是因为显然T

  • 我有一个测试班和测试方法。这取决于数据提供程序方法。数据提供程序方法位于不同的类中,而不是测试类或其基类之一。根据TestNG文件 如果要将数据提供程序放在不同的类中,则它需要是静态方法或具有非参数构造函数的类,并且指定可以在dataProviderClass属性中找到它的类 测试类: 数据提供程序类: Eclipse的测试输出: 它似乎不起作用。我正在使用TestNG 6.9.11并尝试从mav

  • 我的问题是: “数据提供者”如何在内部将数据发送到测试? 幕后到底发生了什么,以便我们在“测试”中获得发送的数据?。 我很想知道,数据提供者和测试是如何通过提及“数据提供者”的名称而相互连接的,“数据提供者”将数据发送给测试的。 “数据提供者”是否调用测试并将数据作为参数传递? 我的数据提供者代码: 我的测试代码:

  • 我试图通过动态输入要从中提取数据的工作表的名称,以这种方式重用现有的数据提供程序,将Excel文件中的数据加载到我的测试框架中。 示例:我正在从Login凭据表加载数据,该表代表成功登录测试的数据。第二个测试是失败的登录测试,它从InvalidLogin凭据表加载数据。第三个测试从第三个表UserInformation等中提取数据。我所遵循的udemy课程并没有真正涵盖这个主题,我觉得整个事情的实