YAML格式测试用例设计
以接口自动化为例,用YAML编写测试用例要实现的基本功能需求:
一个YAML文件能够支持多个用例存储需求,不然几千个用例对应几千个YAML文件管理起来也受不了用例中能够支持单接口测试用例也能支持业务场景用例(多个接口调用组合)用例中须要包含所属模块、用例名、要求信息、断言信息、提取相应(实现接口关联)等信息基于上述需求我们来设计一版YAML格式用例:
- casename: 登录成功 module: 用户模块 teststeps: - name: 精确用户名、密码进行登录 request: method: POST url: /login headers: Content-Type: application/json json: username: lemon_auto password: lemon123456 appType: 3 loginType: 0 extract: token: access_token validate: - eq: ["status_code", 200] - eq: ["nickName", "lemon_auto"]
casename与module字段大略,我们来看下teststeps,为什么teststeps是数组类型?

由于用例中包含一个/多个接口要求步骤,也便是一个TestCase包含了多个teststep,每一个teststep便是一个接口要求。
request中指定接口要求信息,包括接口要求方法、要求地址、要求头、要求参数;个中不同的要求参数类型我们须要进行差异,上述的是json传参,如果是form表单、查询参数传参我们都可以约定为类似的key-value构造,只须要将json改为formparam、queryparam。
须要把稳的是文件上传接口的参数会比较分外,一样平常来说我们只须要设置要上传文件路径即可,以是我们可以这样设计:
- casename: 上传图片 module: 用户模块 teststeps: - name: 正常上传图片 request: method: POST url: /p/file/upload headers: Content-Type: multipart/form-data file: src/test/resources/upload.png extract: resourcesUrl: resourcesUrl filePath: filePath validate: - eq: [ "status_code", 200 ]
extract字段为要提取的相应数据字段,通报给后续的接口利用。一样平常我们哀求能够支持JsonPath表达式或者正则表达式来提取,对应的key为要提取的字段名,对应的值为要提取的字段表达式。
validate字段是断言信息,也便是验证相应结果是否符合预期。这里我们须要支持常用的判断方法包括:即是、大于、小于、大于即是、小于即是,通过简写eq代替equals(即是)判断,其他的类似:大于即是(ge)、小于即是(le)、小于(lt)、大于(gt)。
上述的是单接口测试用例,我们看下多接口串联(业务场景)用例编写的样式:
ModifyUserProfile.yaml
- casename: 修正用户头像 module: 用户模块 teststeps: - name: 登录成功 request: method: POST url: /login json: username: lemon_auto password: lemon123456 appType: 3 loginType: 0 headers: Content-Type: application/json extract: token: access_token validate: - eq: ["status_code", 200] - eq: ["nickName", "lemon_auto"] - name: 进入到个人中央 request: method: GET url: /p/user/userInfo headers: Authorization: ${token} validate: - eq: ["status_code", 200] - name: 上传头像 request: method: POST url: /p/file/upload headers: Authorization: ${token} Content-Type: multipart/form-data file: src/test/resources/upload.png extract: resourcesUrl: resourcesUrl filePath: filePath validate: - eq: ["status_code", 200]
在多接口测试中主要的是要能够支持参数通报,这里我们在前一个接口利用extract提取接口的相应字段,在后续要利用的接口中通过${token}办法进行引用,熟习Jmeter接口测试工具的同学该当非常熟习这种格式。
脚本读取YAML数据在读取YAML文件数据之前,我们首先须要理解两个观点:序列化与反序列化
把工具转换为字节序列的过程称为工具的序列化;把字节序列规复为工具的过程称为工具的反序列化。而我们读取YAML的过程就可以称之为反序列化。
主流的编程措辞都能实现对YAML的解析,接下来以Java措辞为例讲解如何读取YAML文件的内容:
Java中能够实现YAML序列化和反序列化的库有很多,包括SnakeYaml、Jackson、jYaml等,利用起来大同小异。以利用Jackson为例:
步骤一:Maven POM文件中添加库的坐标<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.2</version></dependency><dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>2.10.2</version></dependency><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope></dependency>
这里用到了jackson-databind与jackson-dataformat-yaml,个中jackson-databind是Jackson的主库,jackson-dataformat-yaml是支持YAML数据格式的库,在这里同时引入了lombok,是为了后面编写实体类时简化一些代码的书写:
Lombok可以来帮助我们简化一些必须有但显得很臃肿(比如get/set方法)的Java代码的工具,通过利用对应的表明,可以在编译源码的时候自动天生对应的方法。
步骤二:编写YAML实体类对照YAML文件内容比如字段名(比如 “姓名”)和字段的数据类型(比如字符串),创建一个对应的类,用来在 Java 中表示YAML文件的信息。目的是为了能够将YAML文件保存到Java工具中(反序列化)。
TestCase实体类:
@Data@NoArgsConstructor@AllArgsConstructorpublic class TestCase { private String casename; private String module; private List<Teststep> teststeps;}
Teststep实体类:
@Data@NoArgsConstructor@AllArgsConstructorpublic class Teststep { private String name; private Request request; private HashMap<String,String> extract; private List<Validate> validate;}
Request实体类:
@Data@NoArgsConstructor@AllArgsConstructorpublic class Request { private String method; private String url; private HashMap<String,Object> json; private HashMap<String,Object> formparam; private HashMap<String,Object> queryparam; private String text; private String file; private HashMap<String,Object> headers;}
Validate实体类:
@Data@NoArgsConstructor@AllArgsConstructorpublic class Validate { private List<Object> eq; private List<Object> gt; private List<Object> ge; private List<Object> lt; private List<Object> le;}
通过Jackson读取YAML文件内容并保存到TestCase实体类工具中
public static List<TestCase> loadYaml(String path){ ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); List<TestCase> cases = null; try { cases = objectMapper.readValue(new File(path), new TypeReference<List<TestCase>>() {}); } catch (IOException e) { System.out.println(path+"格式造孽,请检讨配置"); e.printStackTrace(); } return cases;}
个中new TypeReference<List<TestCase>>() {}是由于读取到的YAML文件中有多个TestCase用例,以是我们须要定义为List凑集类型来吸收。
来看看读取之后的效果:
后续即可通过返回的testCase发起接口要求(比如通过REST-assured)、进行接口断言、提取相应字段等操作。