【问题标题】:Creating an instance variable that represents other variables with same names but unique values in different classes (Java)创建一个实例变量来表示其他具有相同名称但在不同类中具有唯一值的变量(Java)
【发布时间】:2017-07-06 18:25:33
【问题描述】:

我目前正在尝试使用 API 将自动化测试与我们的测试管理工具集成。每个测试(包含在单个类中)都有一个唯一的 ID,需要在 API 调用中引用。我可以在测试本身中声明测试 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 变量的占位符。创建一个可以从不同测试类中获取这些唯一 ID 的变量的最佳方式/最有效的方式是什么?

谢谢,如果需要任何其他有用的信息,请告诉我!

【问题讨论】:

  • 我不确定您所说的“重复 API 框架”是什么意思,但这类事情的通常答案是创建一个接口,例如 HasTestId
  • onTestFailure 方法在哪里?我的意思是,它在哪个类中声明?你的所有测试都有一个超类吗?请展示你的测试框架。

标签: java selenium testrail


【解决方案1】:

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

【讨论】:

  • 所以使用这种方法我会用 TestId 替换 api 调用中的“uniqueid”?
  • 好吧,用@TestId("test123") 之类的东西来注释你的测试类。然后,当您需要 URL 的测试 id 时,您可以通过 ITestResult 获取当前测试类,并使用反射获取该测试类上的 @TestId 值。
  • 你能发布一个简单的例子吗?我对反射不熟悉,找不到这个案例的好例子。
  • 如果你只是谷歌“java get annotation value”,有很多例子。例如stackoverflow.com/questions/20192552/…
猜你喜欢
  • 1970-01-01
  • 2020-12-09
  • 2018-12-22
  • 2021-09-15
  • 2011-04-14
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多