在testng中使用注解获取数据

83 阅读1分钟

本章会介绍在TESTNG中使用注解获取数据。

  1. testng中编写测试类。
  2. GetXXX获取xxx格式的数据。
  3. impl实现类读取数据,转bean, List, string等。。
  4. 在testng测试用例上使用GetJson注解。

注解编写

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface GetJson {
    String value();
}

注解实现类

    import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;

public class GetJsonLoader {

    private static final ObjectMapper mapper = new ObjectMapper();

    public static void loadJsonData(Object object) {
        Field[] fields = object.getClass().getDeclaredFields();

        for (Field field : fields) {
            if (field.isAnnotationPresent(GetJson.class)) {
                GetJson annotation = field.getAnnotation(GetJson.class);
                String filePath = annotation.value();
                File file = new File(filePath);

                try {
                    if (field.getType().equals(String.class)) {
                        String data = mapper.readValue(file, String.class);
                        field.setAccessible(true);
                        field.set(object, data);
                    } else if (field.getType().equals(List.class)) {
                        TypeReference<List<MyBean>> typeRef = new TypeReference<>() {};
                        List<MyBean> data = mapper.readValue(file, typeRef);
                        field.setAccessible(true);
                        field.set(object, data);
                    } else {
                        MyBean data = mapper.readValue(file, MyBean.class);
                        field.setAccessible(true);
                        field.set(object, data);
                    }
                } catch (IOException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

测试文件

    import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.List;

public class GetJsonTest {
    @GetJson("string_data.json")
    private String stringData;

    @GetJson("bean_data.json")
    private MyBean beanData;

    @GetJson("bean_list.json")
    private List<MyBean> beanList;

    @Test(dataProvider = "stringData")
    public void testStringData(String data) {
        System.out.println("String Data: " + data);
    }

    @Test(dataProvider = "beanData")
    public void testBeanData(MyBean data) {
        System.out.println("Bean Data: " + data);
    }

    @Test(dataProvider = "beanList")
    public void testBeanList(List<MyBean> data) {
        System.out.println("List of Beans: ");
        for (MyBean bean : data) {
            System.out.println(bean);
        }
    }

    @DataProvider(name = "stringData")
    public Object[][] getStringData() {
        GetJsonLoader.loadJsonData(this);
        return new Object[][]{{stringData}};
    }

    @DataProvider(name = "beanData")
    public Object[][] getBeanData() {
        GetJsonLoader.loadJsonData(this);
        return new Object[][]{{beanData}};
    }

    @DataProvider(name = "beanList")
    public Object[][] getBeanList() {
        GetJsonLoader.loadJsonData(this);
        return new Object[][]{{beanList}};
    }
}

总结

在此示例中,GetJsonTest 类具有三个用 @GetJson 注释的字段,每个字段指定不同 JSON 文件的路径。 使用 GetJsonTest 的新实例作为输入调用 GetJsonLoader.loadJsonData() 方法,这导致它从指定文件读取 JSON 数据并设置字段的值。

每个测试方法都与一个数据提供者方法相关联