创建一个实例变量,该变量表示不同类中具有相同名称但唯一值的其他变量(Java)

创建一个实例变量,该变量表示不同类中具有相同名称但唯一值的其他变量(Java),java,selenium,testrail,Java,Selenium,Testrail,我目前正在尝试使用API将自动化测试与我们的测试管理工具集成。每个测试(包含在单个类中)都有一个唯一的id,需要在API调用中引用该id。我可以在测试本身中声明测试ID(首选),或者创建一个包含所有ID的单独类以供参考。我遇到的问题是,在运行特定测试时,如何将这些ID表示为变量,这样我就不必为每个唯一ID重复API框架 下面是API类/侦听器类的常规设置 package testPackage; import java.io.IOException; import java.net.Mal

我目前正在尝试使用API将自动化测试与我们的测试管理工具集成。每个测试(包含在单个类中)都有一个唯一的id,需要在API调用中引用该id。我可以在测试本身中声明测试ID(首选),或者创建一个包含所有ID的单独类以供参考。我遇到的问题是,在运行特定测试时,如何将这些ID表示为变量,这样我就不必为每个唯一ID重复API框架

下面是API类/侦听器类的常规设置

  package testPackage;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

import org.json.simple.JSONObject;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

import com.gurock.testrail.APIClient;
import com.gurock.testrail.APIException;


public class MyTestResultsListener extends TestListenerAdapter {

    public final APIClient client = new APIClient("https://api.url/");
    public final Map data = new HashMap();

    public final void APISendCredentials() {
        client.setUser("username");
        client.setPassword("password");


    }

    @Override
    public void onTestFailure(ITestResult result) {
        APISendCredentials();
        data.put("status_id", new Integer(5));
        data.put("comment", "This test failed");
        try {
            JSONObject r = (JSONObject) client.sendPost("add_result_for_case/" + "Unique ID", data);
        } catch (MalformedURLException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        } catch (APIException e) {

            e.printStackTrace();
        }
    }

    @Override
    public void onTestSuccess(ITestResult result) {
        APISendCredentials();
        data.put("status_id", new Integer(1));
        data.put("comment", "This test passed");
        try {
            JSONObject r = (JSONObject) client.sendPost("add_result_for_case/" + TestClass.AutomationID, data);
        } catch (MalformedURLException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        } catch (APIException e) {

            e.printStackTrace();
        }

    }

    @Override
    public void onTestSkipped(ITestResult result) {
        APISendCredentials();
        data.put("status_id", new Integer(2));
        data.put("comment", "This test was blocked or skipped");
        try {
            JSONObject r = (JSONObject) client.sendPost("add_result_for_case/" + TestClass.AutomationID, data);
        } catch (MalformedURLException e) {

            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (APIException e) {
            e.printStackTrace();
        }

    }
}
测试班

package testPackage;

import java.io.IOException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import com.gurock.testrail.APIException;

@Listeners(MyTestResultsListener.class)

public class TestClass {

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestData {
    String testId() default "0";

}

public static String AutomationID = "236/50819";

@Test
@TestData(testId = "236/50819")
public void test1() {
    //sometest 

}

@AfterTest
public void aftertest() {
    //This was my initial blind attempt at reflection. I am getting 
    //an error below stating "test1" cannot be resolved to a variable 
    //also unclear on how to feed this to the APIclass 
    Method testMethod = getClass().getMethod(test1);
    if (testMethod.isAnnotationPresent(TestData.class)) {
        TestData testData = testMethod.getAnnotation(TestData.class);
        //stuck at this point 
    }
}
}

正如您在以
JSONobject r
开头的行中所看到的,我有一个uniqueID变量的占位符。创建可以从不同测试类获取这些unqiue id的变量的最佳方法/最有效方法是什么


Thx,让我知道如果有任何额外的信息需要,这将是有益的

如果每个测试的id没有更改,您可以创建一个保存测试id的注释,例如
@TestId
。每个测试类(或方法,取决于所需的粒度级别)都可以用自己的测试id进行注释。然后在API代码中,您可以通过反射简单地获得它。

我不确定“重复API框架”是什么意思,但这类问题通常的答案是创建一个接口,如
HasTestId
。onTestFailure方法在哪里?我是说,它是在哪一类中声明的?你的所有测试都有超类吗?请显示您的测试框架。因此,使用此方法,我将用TestId替换api调用中的“uniqueid”?好吧,用类似于
@TestId(“test123”)
的东西注释您的测试类。然后,当您需要URL的测试id时,您可以通过
ITestResult
访问当前测试类,并使用反射获取该测试类上的
@TestId
值。您可以发布一个简单的示例吗?我不熟悉反射,也找不到一个很好的例子来说明这个问题。例如