一、数据来源
CSV、yaml、xml、db、excel、json
二、本质
读取数据源返回数组,然后利用参数化进行数据与变量的对应
- 基于schema:List<Class>
- 纯数据:Array<Array<String,Object>>
三、数据格式
优点 | 缺点 | |
Excel | 生成数据方便 | 二进制文件不利于版本管理 |
CSV | 可使用Excel编辑 | 表达多层级多类型数据有困难 |
YAML | 格式完备,可读性好 | 格式简单 |
XML | 格式完备 | 冗长复杂 |
JSON | 格式完备,可读性一般 | 不能编写注释,格式死板 |
四、数据驱动逻辑
1、结构化数据驱动
- 根据表格数据解释执行,Excel、YAML、XML
- 将行为也数据化
2、高层抽象
- ATDD:验收测试驱动开发,借助于数据与DSL(Domain Specific Language)实现用例描述,代表作是RbotFramwork
- BDD:行为驱动开发,基于自然语言描述用例,实现仍然是基于传统的编程方式,代表作是Cucumber
3、牺牲灵活性,无法大规模应用,维护成本高
五、案例演示
1、利用MethodSource注解参数化测试
@ParameterizedTest @MethodSource public void testddt(String raw) { assertTrue(raw.length() > 3); } static Stream<String> testddt() { return Stream.of("1", "12", "123", "1234"); }
测试结果:
说明:使用java8的新特性Stream.of方法创建字符流,传递给testddt测试方法,循环遍历字符串长度是否大于3.
2、使用yaml数据驱动
定义User Bean,提供给后面解析使用
public class User { public String name; }
项目工程目录结构:
user.yaml文件内容
- name: seveniruby
- name: apple
- name: sj
代码示例:
@ParameterizedTest() @MethodSource public void testDDTFromYaml(User user) { assertTrue(user.name.length() > 3); } static List<User> testDDTFromYaml() throws IOException { ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); TypeReference typeReference = new TypeReference<List<User>>() { }; List<User> users = mapper.readValue( TestYaml.class.getResourceAsStream("/user.yaml"), typeReference ); return users; }
测试结果:
3、使用json数据驱动
user.json文件内容
[
{
"name": "seveniruby"
},
{
"name": "sj"
},
{
"name": "apple"
}
]
示例代码:
@ParameterizedTest() @MethodSource public void testDDTFromJson(User user) { assertTrue(user.name.length() > 3); } static List<User> testDDTFromJson() throws IOException { ObjectMapper mapper = new ObjectMapper(); TypeReference typeReference = new TypeReference<List<User>>() { }; List<User> users = mapper.readValue( TestYaml.class.getResourceAsStream("/user.json"), typeReference ); return users; }
测试结果: