本章会介绍在TESTNG中使用注解获取数据。
- testng中编写测试类。
- GetXXX获取xxx格式的数据。
- impl实现类读取数据,转bean, List, string等。。
- 在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 数据并设置字段的值。
每个测试方法都与一个数据提供者方法相关联